Свежие статьи

Рубрики

Рубрика: Python и Автоматизация

Автоматизация на Python: скрипты для парсинга, работы с API, Telegram-боты и интеграция с WordPress. Код, гайды и готовые решения для начинающих разработчиков.

  • От идеи до работающего автопостинга: как я перешёл с PHP на Python и что из этого вышло

    От идеи до работающего автопостинга: как я перешёл с PHP на Python и что из этого вышло

    Больше месяца я пытался довести до ума PHP-плагин для автопостинга новостей. Исправил 20+ ошибок, научил его работать с YandexGPT, генерировать картинки и заполнять SEO. Но плагин всё равно был капризным — то настройки слетали, то API возвращал 404, то хостинг блокировал соединения.

    Я устал. Не физически, а морально. Каждый день я думал: «Ну сколько можно?» И в какой-то момент я понял, что не обязан биться головой об одну и ту же стену. Можно попробовать другой путь.

    И я попробовал. Я перешёл на Python.

    Сегодня я хочу подвести итог моей работы с DeepSeek за последние недели. Расскажу, что я сделал, с чем столкнулся, какие ошибки уже исправил и какие ещё остались. А главное — поделюсь мыслями о том, что этот проект дал мне как разработчику.

    Часть 1. Почему я вообще начал это делать

    Изначально я хотел создать систему, которая будет:

    • Парсить RSS-ленты ведущих мировых AI-ресурсов.

    • Переводить новости на русский.

    • Делать рерайт, чтобы они были уникальными.

    • Публиковать на моём сайте milyutin-codes.ru.

    • Всё это без моего участия — просто работает и приносит свежий контент.

    Казалось бы, логично — я использую WordPress, значит, и плагин должен быть на PHP. Я написал его, настроил, запустил. И… понеслось.

    С чем я столкнулся:

    • Настройки слетали после каждого обновления.

    • YandexGPT возвращал ошибки 404 из-за устаревшего формата запросов.

    • Хостинг блокировал частые запросы к API.

    • Плагин работал внутри WordPress и конфликтовал с другими плагинами.

    Я потратил неделю, исправил более 20 ошибок, но плагин всё равно оставался нестабильным. И тогда я понял главное: я не хочу быть «администратором» своего плагина. Я хочу, чтобы он просто работал.

    Часть 2. Переход на Python — точка бифуркации

    Когда я задал DeepSeek вопрос: «Может, реализовать автопостинг на Python, если это проще?» — он ответил: «Да, на Python будет проще». И оказался прав.

    Python — это язык для автоматизации. Он не привязан к WordPress, не зависит от версий PHP и не конфликтует с плагинами. Он просто делает свою работу и завершается.

    Что изменилось после перехода:

    • Скрипт работает независимо от сайта.

    • Ошибки не валят WordPress.

    • Я могу запускать его по расписанию через cron.

    • Код стал проще и понятнее.

    Вывод: иногда правильное решение — не «починить» текущую систему, а «пересесть» на другую.

    Часть 3. Эволюция плагина: хронология ключевых изменений

    PHP
    Создано с помощью нейросети Алисы YandexART для milyutin-codes.ru

    За время работы я внёс множество доработок. Вот основные этапы:

    4 августа 2026 — Публикация дубликатов из-за неверной проверки

    Проблема: Скрипт проверял дубликаты по переведённому заголовку, который при каждом новом запуске отличался из-за вариативности перевода. Это приводило к многократной публикации одной и той же новости.

    DeepSeek
    Создано с помощью нейросети Алисы YandexART для milyutin-codes.ru

    Решение: Переработана логика проверки дубликатов. Теперь скрипт использует оригинальный заголовок из RSS и сохраняет RSS GUID в мета-поля поста. При повторной проверке сначала идёт поиск по GUID, затем по нормализованному заголовку (очищенному от кавычек и знаков препинания).

    5 августа 2026 — Ошибка 401 при создании тегов и публикации

    Проблема: WordPress REST API не принимал обычный пароль пользователя, возвращая 401 – rest_cannot_create.

    Решение: В инструкцию добавлено требование использовать пароль приложения (Application Password), создаваемый в профиле пользователя. В коде исправлена авторизация через базовую аутентификацию.

    6 августа 2026 — Парсинг дат работал нестабильно

    Проблема: Скрипт не мог корректно распарсить даты в формате RFC 2822, из-за чего подставлял текущее время, и старые статьи публиковались повторно.

    Решение: Внедрена функция normalize_date(), использующая встроенный парсер feedparser и email.utils. Добавлено извлечение даты из HTML-мета-тегов (article:published_time).

    7 августа 2026 — Логика очереди публикаций

    Проблема: При ручном запуске или по расписанию публиковалась только самая свежая новость, а все остальные терялись.

    Решение: Внедрена система очереди. Новые записи добавляются в список pending_entries в config.json, а затем публикуются по одной при каждом запуске.

    8 августа 2026 — Дублирование при первом запуске

    Проблема: При первом запуске скрипт добавлял в очередь все записи из RSS, включая старые, и начинал их публиковать.

    Решение: Добавлена логика «первого запуска»: если last_published_date отсутствует, публикуется только самая свежая запись, а остальные игнорируются.

    10 августа 2026 — Ошибка 403 от Wordfence при обновлении Rank Math

    Проблема: Плагин безопасности Wordfence блокировал запросы к эндпоинту /rankmath/v1/updateMeta, возвращая 403 Forbidden.

    Решение: Обновление SEO-мета-полей перенесено на стандартный REST API WordPress (/wp/v2/posts/{id}) с передачей данных в поле meta. Добавлен корректный User-Agent.

    11 августа 2026 — Иерархические категории

    YandexGPT
    Создано с помощью нейросети Алисы YandexART для milyutin-codes.ru

    Проблема: Все новости публиковались в одну категорию, без структурирования по темам.

    Решение: Реализована иерархическая система категорий:

    • Родительская категория: «Новости ИИ» (slug: novosti-ii).

    • Дочерние подрубрики: 9 штук + «Разное» для нераспознанных новостей.

    • Автоматическое создание недостающих категорий при первом запуске.

    12 августа 2026 — Определение компании и перевод длинных статей

    YandexGPT
    Создано с помощью нейросети Алисы YandexART для milyutin-codes.ru

    Проблема:

    • Названия компаний переводились на русский, терялась идентичность.

    • Статьи длиннее 2500 символов обрезались или переводились с ошибками.

    Решение:

    • Добавлена функция extract_company_name(), которая отдельным запросом к YandexGPT определяет главную компанию (на английском) и использует её в SEO-полях и alt-текстах.

    • Реализована разбивка длинных текстов на части (split_text_into_chunks()), каждая часть переводится отдельно, затем результаты склеиваются.

    17 августа 2026 — Очистка ответов YandexGPT

    Проблема: В названиях компаний появлялись лишние слова («Amazon Вопрос», «Meta Вопрос»), а иногда скрипт не мог распарсить ответ.

    Решение: Ужесточены промпты для YandexGPT, добавлена очистка ответов от стоп-слов и переносов строк. Введена повторная попытка генерации заголовка и тегов с альтернативным форматом.

    Часть 4. Что я получил в итоге

    Python
    Создано с помощью нейросети Алисы YandexART для milyutin-codes.ru

    После всех доработок плагин:

    • Публикует новости строго по очереди, без дубликатов.

    • Корректно определяет компании и использует их в SEO.

    • Автоматически создаёт иерархию категорий.

    • Переводит статьи любого объёма (разбивка на части).

    • Обновляет SEO-поля Rank Math через стандартный REST API.

    • Работает 24/7 на сервере как systemd-служба.

    • Извлекает изображения из оригинальных статей и вставляет их в пост.

    • Очищает текст от рекламы и мусора.

    • Добавляет ссылку на источник в виде аккуратного домена.

    Часть 5. Что ещё осталось исправить

    RSS
    Создано с помощью нейросети Алисы YandexART для milyutin-codes.ru

    Плагин работает, но всё ещё есть мелкие ошибки, которые я исправляю в данный момент:

    • Иногда YandexGPT возвращает 400 — если промпт слишком длинный или формат нарушен. Добавил обрезку текста до 3000 символов и логирование ответа, но иногда ошибка всё равно возникает.

    • Изображения не всегда загружаются — если URL картинки битый или сайт блокирует запросы. Пока просто пропускаю, но планирую добавить повторные попытки.

    • SEO-поля Rank Math обновляются не всегда — иногда API возвращает 404, если пост только что создан. Добавил задержку перед обновлением мета-полей.

    • На тестовом домене иногда слетают настройки — потому что я часто перезапускаю скрипт и меняю конфиг. Это не критично, но нужно будет исправить.

    • Некоторые RSS-ленты не парсятся — если сайт использует нестандартный формат или требует авторизации.

    Но я не отчаиваюсь. Каждая ошибка — это урок. И я исправляю их одну за другой.

    Часть 6. Мои главные выводы

    1. Не бойтесь менять инструменты.

    Если PHP-плагин не работает — напишите на Python. Это быстрее, чем пытаться «починить» то, что сломано по своей сути.

    2. Качество контента — это не только текст.

    Картинки, структура, категории — всё это влияет на восприятие. ИИ может помочь с текстом, но структуру и логику контента должен продумывать человек.

    3. Автоматизация не заменяет человека.

    Я автоматизировал сбор, перевод и публикацию новостей. Но я всё равно проверяю их, редактирую, если нужно, и думаю о том, как улучшить систему.

    4. ИИ — это инструмент, а не волшебная таблетка.

    YandexGPT помогает мне писать тексты, но я отвечаю за то, как они звучат. Python помогает мне автоматизировать рутину, но я отвечаю за то, как система работает.

    5. DeepSeek — идеальный напарник.

    Он объясняет, подсказывает, исправляет ошибки и не даёт опустить руки. Без него я бы не справился.

    Часть 7. Что дальше?

    Как только я исправлю все оставшиеся мелкие ошибки, я выложу код плагина в свободный доступ на своём сайте. Чтобы любой желающий мог скачать его, настроить под себя и использовать для своего WordPress-сайта.

    В ближайших планах:

    • Добавить поддержку нескольких RSS-источников одновременно.

    • Реализовать более умное распознавание ключевых сущностей.

    • Внедрить логирование в базу данных для статистики.

    • Добавить пагинацию на страницах «Блог» и «Новости ИИ».

    • Настроить RSS-ленту для новостей.

    Призыв к действию

    Если ты тоже разработчик-самоучка и иногда чувствуешь, что застрял — вспомни мою историю. Иногда правильнее не биться головой о стену, а найти обходной путь. Взять паузу. Сделать шаг назад, чтобы потом прыгнуть дальше.

    Подписывайся на мой блог, чтобы не пропустить новость о выходе готового плагина в открытый доступ.

    Python-скрипт
    Создано с помощью нейросети Алисы YandexART для milyutin-codes.ru

    Контакты

    📧 Email: milyutinkv@gmail.com
    🌐 Сайт: milyutin-codes.ru
    💬 Группа ВК: vk.ru/milyutin_codes

    Задавай вопросы, делись идеями, пиши свои истории. Мы вместе.

    Продолжение следует. Скоро — открытый код.

    Константин Милютин
    Автор блога «Милютин Код»

  • Как я перешёл с PHP на Python для автопостинга: первые шаги и текущие ошибки

    Как я перешёл с PHP на Python для автопостинга: первые шаги и текущие ошибки

    Больше недели я пытался довести до ума PHP-плагин для автопостинга новостей. Исправил 20+ ошибок, научил его работать с YandexGPT, генерировать картинки и заполнять SEO. Но плагин всё равно был капризным — то настройки слетали, то API возвращал 404, то хостинг блокировал соединения.

    Я устал. Не физически, а морально. Каждый день я думал: «Ну сколько можно?» И в какой-то момент я понял, что не обязан биться головой об одну и ту же стену. Можно попробовать другой путь.

    И я попробовал. Я перешёл на Python.

    Python
    Создано с помощью нейросети Алисы YandexART для milyutin-codes.ru

    Сегодня я расскажу, как я с DeepSeek за несколько дней создал полноценный Python-скрипт с графическим интерфейсом, который автоматически парсит RSS, переводит новости, публикует их в WordPress и заполняет SEO. Пока он работает на тестовом домене и не идеален — но прогресс есть, и я хочу поделиться этим опытом.

    Если ты пропустил предыдущую часть, вот ссылка: Шестой день с DeepSeek: не забрасываю плагин — просто беру паузу, чтобы ускорить наполнение сайта. А сейчас — свежий отчёт о том, что я сделал, с чем столкнулся и куда двигаюсь дальше.

    Почему Python, а не PHP?

    Я не профессиональный PHP-разработчик. Я — самоучка, который учится на ходу. PHP-плагин требовал глубокого погружения в экосистему WordPress: хуки, фильтры, WP-Cron, правила безопасности. Каждая правка отнимала часы. А Python — это независимая программа. Она просто общается с WordPress через REST API и делает только то, что я ей скажу. Никаких ограничений ядра, никаких неожиданных сбоев из-за плагинов.

    DeepSeek сразу сказал: «Да, на Python будет проще». И оказался прав.

    Что я сделал за это время

    1. Графический интерфейс — для тех, кто не любит консоль

    Я хотел, чтобы скриптом мог пользоваться даже человек, который никогда не видел командной строки. Поэтому я создал GUI на tkinter. Три вкладки:

    • Настройки — поля для API-ключа Yandex, Folder ID, URL сайта, логина, пароля приложения, RSS-лент, SMTP и словаря категорий. Всё сохраняется в config.json.

    • Управление — кнопки «Запустить сейчас» (обрабатывает только одну новость), «Запустить по расписанию» (каждый час) и «Остановить». Там же — окно с логами в реальном времени.

    • Статистика — общее количество опубликованных новостей и последние 5 постов.

    Создать такой интерфейс с DeepSeek было просто: он предложил структуру окон, поля и привязку к сохранению настроек.

    2. Парсинг RSS и статей — без headaches

    Для RSS я использовал feedparser. Он отлично парсит любые ленты — даже те, где кривая структура. А для извлечения полного текста и изображений из оригинальной статьи — newspaper3k. Эта библиотека умеет скачивать страницу, находить основной контент, удалять рекламу и собирать все изображения.

    Правда, пришлось повозиться с зависимостями: на Windows newspaper3k требует lxml_html_clean и ресурсы NLTK (punkt_tab). DeepSeek подсказал, как это установить, и через пару команд всё заработало.

    3. Интеграция с YandexGPT — перевод и рерайт

    YandexGPT
    Создано с помощью нейросети Алисы YandexART для milyutin-codes.ru

    Самый важный этап — отправка текста в YandexGPT. Я использовал актуальный эндпоинт:

    text
    https://llm.api.cloud.yandex.net/foundationModels/v1/completion

    Формат запроса — messages с ролями system и user. Ключевой момент: в поле messages нужно использовать ключ text, а не content (я долго ловил эту ошибку 400). После исправления всё полетело.

    Промпт для YandexGPT просит перевести текст на русский, сделать его уникальным, предложить новый заголовок и 5 тегов. Ответ парсится по маркерам ЗАГОЛОВОК:ТЕГИ:ТЕКСТ:. Всё просто и надёжно.

    4. Сохранение структуры — изображения на своих местах

    Одна из главных проблем была — как вставить изображения в те же позиции, где они были в оригинале. Я решил это так:

    • Извлекаю структурированный контент через article.clean_top_node.

    • Прохожу по нему, собирая последовательность текстовых блоков и изображений.

    • Переведённый текст разбиваю на абзацы пропорционально количеству оригинальных текстовых блоков.

    • Собираю финальный HTML, чередуя абзацы и изображения в нужном порядке.

    Это даёт почти идеальное совпадение с оригиналом. И да, первое изображение становится миниатюрой поста (featured image) с правильным ALT-текстом.

    5. SEO для Rank Math — автоматически

    Rank Math
    Создано с помощью нейросети Алисы YandexART для milyutin-codes.ru

    Раньше я заполнял SEO вручную. Теперь всё автоматически:

    • Фокусный ключевик выделяется через YandexGPT (или извлекается из заголовка).

    • Мета-описание генерируется отдельным запросом к YandexGPT.

    • Формируется SEO-заголовок вида {focus_keyword} - {post_title}.

    • Дополнительные ключевики (до 4) добавляются через запятую.

    Все эти данные обновляются через REST API Rank Math (/wp-json/rankmath/v1/updateMeta). После публикации поста достаточно одного запроса — и все поля Rank Math заполнены.

    6. Проверка дубликатов — чтобы не было повторов

    Чтобы не публиковать одну и ту же новость дважды, я реализовал умную проверку:

    • Нормализую заголовок (убираю кавычки, лишние пробелы, пунктуацию, привожу к нижнему регистру).

    • Ищу посты с таким же нормализованным заголовком через REST API.

    • Если нахожу — пропускаю публикацию.

    Это работает даже если в RSS заголовок немного отличается от сохранённого в WordPress. Теперь дубликатов нет.

    7. Ссылка на источник — только домен

    Вместо громоздкого URL я показываю только домен (без www.). Это делает ссылку аккуратной и читаемой.

    8. Расписание — каждый час

    Скрипт можно запускать по расписанию через schedule. Каждый час он проверяет RSS-ленту, берёт самую свежую новость и публикует её (если она ещё не опубликована). Если новостей нет — просто ждёт следующего часа.

    Что я получил на данный момент

    На тестовом домене скрипт уже работает. Он:

    • парсит RSS,

    • извлекает полный текст и изображения,

    • переводит и рерайтит через YandexGPT,

    • сохраняет структуру абзацев и позиции изображений,

    • публикует посты в WordPress,

    • заполняет SEO-поля Rank Math,

    • устанавливает миниатюру с ALT-текстом,

    • проверяет дубликаты,

    • отправляет дайджест на email,

    • работает по расписанию.

    Но идеально пока не всё. Есть ошибки, которые я исправляю.

    Какие ошибки я сейчас исправляю

    • Проблемы с NLTK на сервере — пришлось вручную скачивать punkt_tab и указывать путь к данным.

    • Иногда YandexGPT возвращает 400 — если промпт слишком длинный или формат нарушен. Добавил обрезку текста до 3000 символов и логирование ответа.

    • Изображения не всегда загружаются — если URL картинки битый или сайт блокирует запросы. Пока просто пропускаю, но планирую добавить повторные попытки.

    • SEO-поля Rank Math обновляются не всегда — иногда API возвращает 404, если пост только что создан. Добавил задержку перед обновлением мета-полей.

    • На тестовом домене иногда слетают настройки — потому что я часто перезапускаю скрипт и меняю конфиг. Это не критично, но нужно будет исправить.

    Но я не отчаиваюсь. Каждая ошибка — это урок. И я исправляю их одну за другой.

    Что дальше?

    Я продолжу тестировать скрипт на тестовом домене, пока не уберу все ошибки. Планирую:

    • Улучшить обработку изображений (добавить повторные попытки загрузки).

    • Настроить более гибкое расписание (можно будет выбирать интервал).

    • Добавить поддержку нескольких RSS-лент с разными категориями.

    • Оптимизировать запросы к YandexGPT, чтобы экономить токены.

    А когда скрипт будет стабилен — перенесу его на боевой сайт и запущу в полноценную работу.

    Что я понял за эти дни

    • Не бойся пробовать новое. Если что-то не идёт — попробуй другой путь. Это не поражение, это стратегия.

    • Python — это не замена PHP, а дополнение. У каждого инструмента своя ниша. Для внешней автоматизации Python — лучший выбор.

    • DeepSeek — не просто помощник, а наставник. Он объясняет, подсказывает, исправляет ошибки и не даёт опустить руки.

    • Графический интерфейс — это круто. Даже если ты не программист, приложение с GUI делает настройку и запуск интуитивно понятными.

    • Этот путь — долгий. И в нём есть место для обходных путей, экспериментов и пауз. Главное — не останавливаться.

    Призыв к действию

    Если ты тоже разработчик-самоучка и иногда чувствуешь, что застрял — вспомни мою историю. Иногда правильнее не биться головой о стену, а найти обходной путь. Взять паузу. Сделать шаг назад, чтобы потом прыгнуть дальше.

    Подписывайся на мой блог, чтобы не пропустить следующую главу. Я расскажу, как настраивал скрипт на VPS и решал последние проблемы с хостингом.

    Контакты

    📧 Email: milyutinkv@gmail.com
    🌐 Сайт: milyutin-codes.ru
    💬 Группа ВК: vk.ru/milyutin_codes

    Задавай вопросы, делись идеями, пиши свои истории. Мы вместе.

    Продолжение следует. Следите за обновлениями.

    YandexGPT
    Создано с помощью нейросети Алисы YandexART для milyutin-codes.ru

    Константин Милютин
    Автор блога «Милютин Код»