Създайте веднъж; публикувайте многократно. Автоматизирайте ръчната работа с 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“ е отметната. Това ви позволява да създавате gists, като използвате вашия 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 адреси на създадените gists.

Сега трябва да заменим кодовите фрагменти във файла за маркиране със съответните основни URL адреси. Medium, WordPress, Dev.to и Hashnode имат различни формати за вграждане на същината, така че нека създадем речник за това. Ето как изглежда:

Всяка от ламбда функциите ще приеме основния URL като аргумент и ще върне съответния елемент за вграждане. Логиката за замяна на кодов фрагмент е подобна на логиката за получаване на всички кодови фрагменти. Ето как изглежда:

Поддържаме брояч, за да следим кой кодов фрагмент съответства на кой основен URL адрес. Тъй като игнорирахме „bash“ при създаването на gists, ние увеличаваме брояча с 1, без всъщност да заместваме нищо. Във всички останали случаи заместваме кодовия фрагмент с основния URL адрес в индекса „брояч“ и увеличаваме брояча с 1. Тази функция ще създаде нови файлове за WordPress, Medium, Dev.to и Hashnode.

Проверете кодовия фрагмент по-долу, който използва създадените по-горе функции. Той ще създаде публични gists за кодовите фрагменти, налични в index.md и ще създаде маркдаун за WordPress, маркдаун за Medium и т.н.

2️. Как да използвате API на WordPress за създаване на публикация

Можете да намерите документацията тук.

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

Актуализирайте вашия .env файл

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

Вашето потребителско име за WordPress е показаното в Users>Profile.

Ще създадем клас за публикуване в WordPress. Крайната точка на API на WordPress е в следния формат:

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

Вижте кодовия фрагмент по-долу, който създава класа:

Сега ще трябва да добавим някои методи към този клас, които ще се използват за публикуване в WordPress.

Първият метод ще бъде използван за качване на нашето корично изображение или заглавно изображение в WordPress.

Има три входа: пътя към изображението, алтернативен текст и надписа на изображението. Заявка за публикуване трябва да бъде направена до следната крайна точка:

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

Отговорът ще има поле, наречено id. Това ще се използва, когато публикуваме нашата статия. Ще има друго поле, наречено jetpack_featured_media_url, което съдържа URL адреса на изображението.

След това се нуждаем от метод за създаване на ID на тагове за нашата статия. Ето как изглежда това:

Има един вход - списъкът с тагове. За всеки таг ще се опита да създаде нов таг. Отговорът или ще съдържа идентификатора на новосъздадения етикет. Ако етикетът вече съществува, отговорът ще съдържа идентификатора на съществуващия маркер. Ще комбинираме идентификаторите и ще ги върнем.

Подобна функция може да бъде създадена и за категории.

Накрая ще добавим метод за публикуване в 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

Сега можем да добавим метода за създаване на средна публикация. Ето кода:

Нека да разгледаме JSON данните, добавени към заявката за публикуване.

  • title: Заглавието на вашата статия
  • content: Съдържанието на вашата статия в HTML
  • publishStatus: Низ „чернова“, „публикуван“ или „нерегистриран“
  • contentFormat: В нашия случай това ще бъде „HTML“
  • tags: Списък от низове, които са таговете на статията.
  • notifyFollowers: Булева стойност
  • canonicalUrl: Ако е приложимо, каноничният URL адрес. В моя случай ще го задам на URL адреса на публикацията в WordPress.

Сега нека да разгледаме примерна употреба на класа:

4️. Как да използвате Dev.to API за създаване на публикация

Реализацията на Dev.to е доста подобна и няма да навлизам много в подробности. Можете да намерите вашия токен тук. Превъртете до дъното, за да генерирате токен и да актуализирате своя .env файл.

DEVTO_TOKEN = "GCP1itdmDAmVzfTjEQRRnnFc"

Можете да намерите документацията тук

Следното показва класа dev.to:

За dev.to не е необходимо да конвертираме нашия файл с маркдаун в HTML. Можем директно да използваме съдържанието на маркдаун.

5️. Как да използвате Hashnode API за създаване на публикация

Hashnode има GraphQL API и ми отне доста време да разбера правилната заявка и как да направя правилната заявка. Трябва да можете директно да използвате кодовия фрагмент, показан в този раздел. Можете да генерирате своя токен тук.

Можете да си поиграете с техния API „тук“.

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

Ако не сте запознати с GraphQL, опитайте да играете с API в тяхното API Playground. Нека да разгледаме някои от променливите, които се предават на заявката:

  • 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
  • Разширете това, за да споделяте автоматично статията си в различни subreddits или 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/