Что вы получите:
Почему это важно?
Каждый новый пост — это возможность разместить ссылку‑партнёр и получить трафик, а автоматизация избавляет от рутины, экономит часы работы и устраняет человеческие ошибки.
| Компонент | Что делает | Как взаимодействует |
|---|---|---|
| ChatGPT (OpenAI API) | Генерирует уникальный текст под каждый URL‑линк. | Принимает список ссылок → возвращает массив готовых статей. |
| WordPress REST API | Принимает готовый контент и создаёт страницу/пост. | Получает JSON от скрипта → публикует в выбранном разделе сайта. |
| База данных (CSV/Google‑Sheets) | Хранит список линков, статус публикации, метаданные. | Считается скриптом, обновляется после успешного постинга. |
| Scheduler (cron / WP‑CRON) | Запускает процесс раз в N часов/дней. | Автозапуск скрипта без вашего участия. |
Аналогия: представьте, что ChatGPT — это шеф‑повар, а WordPress — это ваш ресторан. Шеф готовит блюдо (текст), а ресторан принимает его и подаёт гостям (публикует страницу).
pip install openai requests python-dotenv pandas
| 2.3. Структура проекта
/auto_post/
│
├─ .env # секреты
├─ links.csv # список URL‑линков
├─ post_generator.py # скрипт генерации контента
└─ wp_poster.py # скрипт публикации в WP
| Поле | Описание | Пример |
|---|---|---|
url |
Партнёрская ссылка, которую нужно разместить. | https://example.com/product/123 |
category |
Категория WordPress, куда будет помещён пост. | reviews |
title_template |
Шаблон заголовка (можно использовать плейсхолдеры). | Обзор {product} |
status |
Статус обработки (new, processed, error). |
new |
CSV‑пример:
url,category,title_template,status
https://shop.com/phone-x,tech,Обзор {product},new
https://shop.com/laptop-y,tech,Тест {product},new
Считываем строки со статусом new.
Для каждой строки формируем промпт:
Напиши SEO‑дружественную статью объёмом 300‑400 слов о продукте, указанном в ссылке {url}. Включи в текст подзаголовки, маркированные списки и в конце размести ссылку {url} в виде «Смотреть продукт». Тон – экспертный, но доступный.
Отправляем промпт в OpenAI API (модель gpt‑4o-mini – экономичный вариант).
Получаем ответ и сохраняем в CSV‑файл generated_posts.csv.
# post_generator.py
import os, csv, pandas as pd, openai, json
from dotenv import load_dotenv
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
def build_prompt(url):
return f"""Напиши SEO‑дружественную статью объёмом 300‑400 слов о продукте, указанном в ссылке {url}.
Включи подзаголовки, маркированные списки и в конце размести ссылку {url} в виде «Смотреть продукт».
Тон – экспертный, но доступный."""
def generate():
df = pd.read_csv("links.csv")
new_rows = df[df["status"] == "new"]
results = []
for _, row in new_rows.iterrows():
prompt = build_prompt(row["url"])
try:
resp = openai.ChatCompletion.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
temperature=0.7,
max_tokens=800,
)
content = resp.choices[0].message.content.strip()
results.append({
"url": row["url"],
"category": row["category"],
"title": row["title_template"].replace("{product}", "Товар"),
"content": content,
"status": "generated"
})
except Exception as e:
results.append({
"url": row["url"],
"status": f"error: {e}"
})
pd.DataFrame(results).to_csv("generated_posts.csv", index=False)
if __name__ == "__main__":
generate()
Подсказка: если хотите добавить ключевые слова для SEO, просто добавьте их в промпт через
ключевые слова: ….
WordPress поддерживает Application Passwords. В wp-admin → Users → Profile → Application Passwords создайте пароль, запомните его.
POST https://your-site.com/wp-json/wp/v2/posts
Authorization: Basic base64(username:app_password)
Content-Type: application/json
Тело запроса:
{
"title": "Обзор Товар",
"content": "<p>…сгенерированный текст…</p>",
"status": "publish",
"categories": [12],
"excerpt": "Краткое описание для SERP"
}
Важно:
categories– это массив ID‑ов категорий. Их можно получить запросомGET /wp-json/wp/v2/categories.
# wp_poster.py
import os, pandas as pd, requests, base64, json
from dotenv import load_dotenv
load_dotenv()
WP_URL = os.getenv("WP_URL") # https://your-site.com
WP_USER = os.getenv("WP_USER")
WP_PASS = os.getenv("WP_PASS") # Application Password
def auth_header():
token = base64.b64encode(f"{WP_USER}:{WP_PASS}".encode()).decode()
return {"Authorization": f"Basic {token}"}
def post_to_wp(row):
url = f"{WP_URL}/wp-json/wp/v2/posts"
payload = {
"title": row["title"],
"content": row["content"],
"status": "publish",
"categories": [int(row["category_id"])]
}
resp = requests.post(url, headers=auth_header(), json=payload)
return resp
def publish():
df = pd.read_csv("generated_posts.csv")
for _, row in df.iterrows():
if row["status"] != "generated":
continue
# Получаем ID категории (можно кэшировать)
cat_resp = requests.get(
f"{WP_URL}/wp-json/wp/v2/categories?slug={row['category']}",
headers=auth_header()
)
cat_id = cat_resp.json()[0]["id"] if cat_resp.json() else 1
row["category_id"] = cat_id
resp = post_to_wp(row)
if resp.status_code == 201:
print(f"✅ {row['title']} опубликована.")
else:
print(f"❌ Ошибка: {resp.text}")
if __name__ == "__main__":
publish()
Создайте cron‑задачу (Linux) или используйте WP‑CRON через плагин WP Crontrol:
0 * * * * /usr/bin/python3 /path/to/auto_post/wp_poster.py >> /var/log/wp_post.log 2>&1
Эта строка будет запускать публикацию каждый час.
| Параметр | Как проверять | Инструменты |
|---|---|---|
| Уникальность | Проверка на копипасту (от 95 % уникальности). | copyscape, Siteliner. |
| SEO‑метрики | Наличие H1‑H3, LSI‑ключевых слов, длина текста. | Yoast SEO (плагин), Google Search Console. |
| Скорость загрузки | Размер страницы < 1 МБ, оптимизированные изображения. | GTmetrix, PageSpeed Insights. |
| Внутренние ссылки | Ссылка на родительскую категорию, «связанные посты». | Плагин Internal Link Juicer. |
Практический совет: после публикации скрипт может автоматически добавить мета‑теги (focus_keyword, meta_description) через WP‑REST API (/wp-json/wp/v2/posts/{id}).
| Расширение | Что добавляет | Как внедрить |
|---|---|---|
| Кеширование запросов | Сокращает количество обращений к OpenAI (экономия токенов). | Сохраняйте ответы в локальном SQLite‑файле, проверяйте хеш URL. |
| Параллельные запросы | Ускоряет обработку большого списка (до 50 постов за раз). | asyncio + aiohttp для запросов к API и WP. |
| Валидация входных данных | Защищает от плохих URL, SQL‑инъекций. | validators‑библиотека, регулярные выражения. |
| Логи и алерты | Уведомления о сбоях (Telegram, Slack). | logging‑модуль + webhook‑интеграция. |
Важно: храните API‑ключи и пароли в переменных окружения (
.env). Не коммитьте их в репозиторий.
links.csv добавляем новые URL‑линки. python post_generator.py → generated_posts.csv. python wp_poster.py → страницы появляются в WordPress. generated_posts.csv (published/error). Если какой‑то пост не прошёл, скрипт пишет причину в колонку status. Вы исправляете запись и запускаете публикацию заново.
| № | Задание | Как проверить |
|---|---|---|
| 1 | Добавьте в links.csv пять новых товаров, укажите разные категории. Запустите генерацию и убедитесь, что в generated_posts.csv появились пять строк с статусом generated. |
Откройте файл в Excel/Google‑Sheets, проверьте колонку status. |
| 2 | С помощью wp_poster.py опубликуйте один из сгенерированных постов. Затем зайдите в админку WordPress и проверьте, что статья отображается в нужной категории и содержит корректную ссылку. |
Откройте страницу в браузере, проверьте URL и контент. |
| 3 | Настройте cron‑задачу, которая будет запускать wp_poster.py каждые 30 минут. Добавьте в links.csv ещё две ссылки и наблюдайте, как они автоматически публикуются без вашего вмешательства. |
Посмотрите журнал wp_post.log и убедитесь, что в нём есть сообщения ✅. |
| 4 | Реализуйте простую проверку уникальности: после генерации,йте каждый текст через API https://api.copyscape.com/ (или любой бесплатный сервис) и запишите результат в колонку unique_score. |
Откройте CSV, убедитесь, что все значения > 95 %. |
| 5 | Добавьте в скрипт отправку сообщения в Telegram при ошибке публикации (используйте Bot API). Проверьте, что при намеренно неверном category_id вы получаете уведомление. |
Откройте Telegram, найдите сообщение от бота. |
Поздравляем! Вы теперь владеете полностью автоматизированным пайплайном, который превращает простой список ссылок в готовый к монетизации контент, публикуемый в WordPress без вашего участия. При правильной настройке такой процесс будет работать 24/7, а ваш траст‑сайт будет расти «жирным» и устойчивым к алгоритмическим обновлениям.
--- Все ссылки в примерах помечены атрибутом rel="nofollow" согласно требованиям.