Создать один раз; публиковать несколько раз. Автоматизируйте ручную работу с помощью Python

В этой статье мы будем использовать Python для автоматизации следующих задач:

  • Создание списков для фрагментов кода
  • Вставьте в статью суть с различными требованиями для WordPress, Medium, Dev.to и Hashnode.
  • Разместить статью на WordPress
  • Разместите статью на Medium с канонической ссылкой WordPress.
  • Разместите статью на Dev.to с канонической ссылкой WordPress.
  • Разместите статью на Hashnode с канонической ссылкой WordPress.

По сути, мы будем использовать Python для автоматизации кросс-постинга на несколько веб-сайтов. Мы будем использовать различные API для выполнения вышеуказанных задач.

Вы можете найти весь код в моем репозитории GitHub.

Настройка проекта

Сначала создайте новую папку для проекта:

mkdir crossPoster
cd crossPoster

Затем создайте виртуальную среду и активируйте ее, как показано ниже:

python3 -m venv venv
source venv/bin/activate

Установите необходимые библиотеки, как показано ниже:

pip3 install requests, Markdown, python-dotenv

Создайте файл с именем .env в корневом каталоге. Это будет использоваться для хранения всех ваших учетных данных. Вам также понадобится тестовый файл уценки, чтобы иметь возможность перекрестной публикации. В этом руководстве я предполагаю, что все изображения имеют общедоступные URL-адреса и не загружаются из локальных файлов.

1️. Как использовать GitHub API для создания Gists для фрагментов кода

Прежде чем продолжить, нам понадобится токен GitHub. Перейдите на страницу вашего токена разработчика, чтобы получить токен GitHub. При создании токена убедитесь, что опция Создать Gist отмечена. Это позволяет вам создавать списки, используя ваш токен GitHub. Скопируйте токен и сохраните его в файле .env.

GITHUB_TOKEN = "YOUR_GITHUB_TOKEN"

Во-первых, нам нужно написать функцию для получения всех фрагментов кода из файла уценки. Мы будем использовать шаблон Regex для получения блоков фрагментов кода. На данный момент игнорируйте функцию «getSnippetName». Просто предположим, что он возвращает кортеж, состоящий из имени файла и фактического кода. Если во фрагменте кода есть язык «bash», мы игнорируем его. Вы можете расширить список языков, которые следует игнорировать.

Мы собираемся предположить, что пользователь начнет свой фрагмент кода с комментария, и комментарий будет иметь имя сути (в основном, как приведенный выше фрагмент кода). Если такой комментарий не указан, суть будет иметь имя по умолчанию, например, index.js для файла JavaScript, init.py для файла Python. Теперь давайте посмотрим на функцию getSnippetName:

Он ищет комментарий в первой строке фрагмента кода. Если присутствует комментарий, он извлекает имя файла из первой строки. Если комментарий отсутствует, он использует словарь для возврата имени файла по умолчанию. Вы можете расширить код для поддержки комментариев на других языках.

Теперь у нас есть массив кортежей. Первый элемент кортежа — это название сути, а второй элемент — ее содержимое. Мы можем использовать это для создания сущности.

Мы отправим почтовый запрос на следующую конечную точку:

https://api.github.com/gists

Если вы хотите, чтобы списки создания были закрытыми, вы можете установить для параметра «public» значение False. Функция вернет все URL-адреса созданных списков.

Теперь нам нужно заменить фрагменты кода в файле уценки на соответствующие основные URL-адреса. Medium, WordPress, Dev.to и Hashnode имеют разные форматы для встраивания списков, поэтому давайте создадим для них словарь. Вот как это выглядит:

Каждая из лямбда-функций будет принимать основной URL-адрес в качестве аргумента и возвращать соответствующий встроенный элемент. Логика замены на фрагмент кода аналогична логике получения всех фрагментов кода. Вот как это выглядит:

Мы ведем счетчик, чтобы отслеживать, какой фрагмент кода соответствует какому URL-адресу gist. Поскольку мы проигнорировали «bash» при создании списков, мы увеличиваем счетчик на 1, фактически ничего не заменяя. Во всех остальных случаях мы заменяем фрагмент кода основным URL-адресом в индексе «счетчик» и увеличиваем счетчик на 1. Эта функция будет создавать новые файлы для WordPress, Medium, Dev.to и Hashnode.

Проверьте приведенный ниже фрагмент кода, в котором используются созданные выше функции. Он создаст общедоступные списки для фрагментов кода, присутствующих в index.md, и создаст уценку для WordPress, уценку для Medium и т. д.

2️. Как использовать WordPress API для создания поста

Вы можете найти документацию здесь.

Вам нужно будет установить плагин для генерации пароля приложения для вашей учетной записи. Найдите плагин Пароль приложения и установите его. После того, как вы установите его, перейдите в свой Users>Profile. Должна быть опция Application Passwords и кнопка Add new application password. Дайте ему имя и создайте новый пароль приложения. Скопируйте новый пароль.

Обновите файл .env

WP_USERNAME = "YOUR ADMIN USERNAME"
WP_PASSWORD = "YOUR NEW APPLICATION PASSWORD"

Ваше имя пользователя WordPress показано в Users>Profile.

Мы создадим класс для публикации в WordPress. Конечная точка WordPress API имеет следующий формат:

{Your Website Domain}/wp-json/wp/v2/{route}

Посмотрите на приведенный ниже фрагмент кода, который создает класс:

Теперь нам нужно добавить в этот класс несколько методов, которые будут использоваться для публикации в WordPress.

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

У него три входа: путь к изображению, альтернативный текст и подпись к изображению. Почтовый запрос должен быть отправлен на следующую конечную точку:

{Your Website Domain}/wp-json/wp/v2/media

В ответе будет поле с именем id. Это будет использоваться, когда мы размещаем нашу статью. В нем будет еще одно поле с именем jetpack_featured_media_url, содержащее URL-адрес изображения.

Далее нам нужен метод для создания идентификаторов тегов для нашей статьи. Вот как это выглядит:

У него один вход — список тегов. Для каждого тега он попытается создать новый тег. Ответ либо будет содержать идентификатор вновь созданного тега. Если тег уже существует, ответ будет содержать идентификатор существующего тега. Мы объединим идентификаторы и вернем их.

Аналогичная функция может быть создана и для категорий.

Наконец, мы добавим метод для публикации в WordPress.

Сама логика функции довольно проста, давайте посмотрим на данные JSON, которые мы будем добавлять в наш почтовый запрос:

  • title: строка, являющаяся заголовком вашей статьи.
  • content: содержание вашей статьи в формате HTML. (Я покажу вам, как преобразовать файл уценки в HTML)
  • status: Строка «опубликовать» или «черновик» в зависимости от того, хотите ли вы опубликовать свою статью как черновик или нет.
  • categories: идентификаторы категорий, возвращаемые методом get_category_ids.
  • tags: идентификаторы тегов, возвращенные методом get_category_ids.
  • featured_media: идентификатор изображения обложки/заголовка, возвращаемый методом upload_media.

Чтобы преобразовать ваш файл уценки в HTML, мы будем использовать библиотеку под названием markdown:

pip3 install Markdown

Нам нужно будет написать следующую вспомогательную функцию для преобразования. Вот код:

Ниже приведен пример использования wordpress class:

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

3️. Как использовать Medium API для создания поста

В этой части мы будем использовать REST API Medium. С документацией можно ознакомиться здесь.

Чтобы получить токен доступа, перейдите в настройки профиля и перейдите на Integration Tokens. Введите описание и нажмите кнопку Получить токен интеграции.

Сохраните токен в файле .env.

MEDIUM_TOKEN = "Your Meidum Token"

Подобно классу, который мы создали для WordPress, мы также создадим класс для Medium.

Теперь давайте определим метод getUserID.

Это просто делает запрос GET к следующей конечной точке и возвращает ваш идентификатор пользователя. Примечание: это отличается от вашего имени пользователя.

https://api.medium.com/v1/me

Теперь мы можем добавить метод для создания публикации на Medium. Вот код:

Давайте посмотрим на данные JSON, добавленные в почтовый запрос.

  • title: Название вашей статьи
  • content: Содержание вашей статьи в формате HTML
  • publishStatus: Строка «черновик», «опубликовано» или «отсутствует в списке».
  • contentFormat: В нашем случае это будет «HTML».
  • tags: Список строк, являющихся тегами статьи.
  • notifyFollowers: логическое значение
  • canonicalUrl: если применимо, канонический URL. В моем случае я собираюсь установить URL-адрес сообщения WordPress.

Теперь давайте посмотрим на пример использования класса:

4️. Как использовать API Dev.to для создания поста

Реализация Dev.to очень похожа, и я не буду вдаваться в подробности. Найти свой токен можно здесь. Прокрутите вниз, чтобы сгенерировать токен и обновить файл .env.

DEVTO_TOKEN = "GCP1itdmDAmVzfTjEQRRnnFc"

Документацию можно найти здесь

Ниже показан класс dev.to:

Для dev.to нам не нужно преобразовывать наш файл уценки в HTML. Мы можем напрямую использовать содержимое уценки.

5️. Как использовать API Hashnode для создания поста

У хешноды есть GraphQL API, и мне потребовалось довольно много времени, чтобы понять правильный запрос и как сделать правильный запрос. Вы должны иметь возможность напрямую использовать фрагмент кода, показанный в этом разделе. Вы можете сгенерировать свой токен здесь.

Поэкспериментировать с их API можно здесь.

Вот реализация класса Hashnode:

Если вы не знакомы с GraphQL, попробуйте поиграть с API на их игровой площадке API. Давайте взглянем на некоторые переменные, которые передаются в запрос:

  • title: Название вашей статьи.
  • content: содержание вашей статьи в уценке. Подобно dev.to, вам не нужно конвертировать в HTML.
  • publicationID: Это обязательный параметр. Если вы не добавите его в свой запрос, ваша статья не будет указана в вашем профиле, но она все равно будет опубликована. Он будет под hashnode.com, а не в вашем личном блоге или аккаунте hashnode. Чтобы найти идентификатор публикации, перейдите на панель управления и скопируйте его из URL-адреса.
https://hashnode.com/{YOUR PUBLICATION ID}/dashboard
  • tags: Список тегов
  • canonicalUrl: канонический URL статьи.
  • hideFromHashnodeFeed: API не поддерживает публикацию черновиков (по крайней мере, я не нашел способа публиковать черновики). Установка hideFromHashnodeFeed на True публикует статью, но она не будет отображаться ни в чьей ленте. Вы также можете переключить это в редакторе hashnode.

Будущие улучшения

Вы можете найти пример использования всех вышеперечисленных классов для создания автоматического конвейера в этом файле в репозитории.

Вы можете думать об этом как о POC для автоматизации вашего процесса. Очевидно, что он не охватывает все варианты использования. Не стесняйтесь клонировать репо и редактировать его по своему усмотрению. Вот некоторые улучшения, которые можно сделать:

  • Поддержка локальных изображений. Логика должна быть аналогична тому, как фрагменты кода преобразуются в суть. Можно использовать либо один из существующих API, либо новый API, такой как Imgur.
  • Расширьте это, чтобы автоматически делиться своей статьей с различными сабреддитами или Twitter.
  • Добавить поддержку других редакторов блогов

Пожалуйста, дайте мне знать в комментариях, если вы нашли эту статью полезной или если у вас есть какие-либо предложения по функциям, которые можно автоматизировать, улучшить и т. д.

Want to Connect?
Find me on LinkedIn at https://www.linkedin.com/in/rahulbanerjee2699/
This article was originally posted on https://www.realpythonproject.com/how-to-use-python-to-post-on-popular-blogging-websites/