Чтобы максимизировать распределения моих постов в блоге с нулевыми усилиями, я пишу бота, чтобы распространять все свои посты в Dev.to используя их API Анкет
Требования
Каждая страница MDX на
Мастер
автоматически созданы (если нет) и обновляются на dev.to, когда есть изменения.Это не должно произойти в режиме реального времени, <3 дня приемлемо.
Как?
Поскольку я размещаю свой репозиторий на GitHub, очевидным вариантом является использование Действия GitHub Анкет Есть еще один вариант — написать Github Probot , что дает мне больше контроля, но будет более сложным и введет некоторые затраты на сервер. Я решил пойти с действиями GitHub, потому что сейчас мне не нужно много контроля, просто нужно делать вещи самыми дешевыми способами, GitHub также бесплатны (для открытого исходного кода).
Концепция
Чтобы иметь возможность отслеживать новые и обновленные статьи, я собираюсь создать файл для хранения всех статей, созданных на Dev.to, каждый имеет Dev.to-специфический id
и URL
чтобы я мог ссылаться на обновление или перенаправление на позже. Я называю файл DATA/DEVTO-SYNC.JSON
, похоже, так:
{ "blog/auto-distribute-posts-to-dev-to": { "id": 548400, "url": "https://dev.to/phuctm97/automate-distributing-my-posts-to-dev-to-gmn-temp-slug-8615862", "md5": "3c1b1dfe52a7a3aab6b0d3fe8533aadx" }, "blog/hello-world-start-blog-in-html": { "id": 548401, "url": "https://dev.to/phuctm97/hello-world-i-started-my-blog-in-plain-html-19ii-temp-slug-8835697", "md5": "8dd0146f31bafdf547ccf772aa7c24bx" }, "blog/my-custom-md-language": { "id": 548402, "url": "https://dev.to/phuctm97/create-an-mdx-plugin-to-have-my-own-markdown-language-502-temp-slug-1959146", "md5": "b680a3792b4c48bb961f2b774183649x" }, "blog/switch-to-next-js-and-mdx": { "id": 548403, "url": "https://dev.to/phuctm97/switch-to-next-js-and-mdx-1214-temp-slug-8266681", "md5": "c8f967cc72ab375a63183900da7e093x" } }
JSON — это карта пути статьи/слизняка на моем веб -сайте ➡ информация о разработке. Каждый элемент имеет MD5
Значение, которое является хэш из контента статьи Dev.to, я использую это, чтобы определить, обновляется ли статья и, следовательно, должна быть синхронизирована с dev.to.
Для каждого коммита подталкивается к Мастер
Я буду выполнять все существующие статьи на моем веб -сайте, если статья не записана в devto-sync.json
, Я создам один, если он записан, я сравню MD5
значение, если два MD5
Значения различаются, я сделаю обновление Dev.to, в противном случае статья обновлена.
Плюс
Я запускаю лишь минимальное количество вызовов API в Dev.To, что помогает избежать ограничения на скорость, а также повысить производительность и сэкономить ресурсы.
Этот рабочий процесс достаточно общий, чтобы я мог подать заявку на другие платформы (Hashnode, Medium).
Минусы
При каждом толчке мне придется регенерировать Dev.tont, вычислить и сравнить MD5 для всех статей. Это нормально, когда у меня есть небольшое количество статей, однако это может быть проблемой, когда у меня есть> 100 статей. Чтобы еще больше оптимизировать это, самый простой способ, которым я имею в виду, — это записать хэш коммита, который был обработан в прошлый раз, и делать вычисление только в файлах, измененных с момента этого фиксации.
Реализация
Ниже приведен основной сценарий синхронизации, который я написал, который может дать вам обзор того, как он работает на практике:
const path = require("path"); const fs = require("fs"); const md5 = require("md5"); const logger = require("./logger"); const pageUtils = require("../mdx/page-utils"); const DEVto = require("./devto"); const DEVtoSyncJSONPath = path.resolve(__dirname, "../data/devto-sync.json"); const toDEVto = ({ frontmatter, content }) => ({ frontmatter: { title: frontmatter.title, description: frontmatter.description, canonical_url: frontmatter.canonicalURL, }, content, }); const toDEVtoSyncJSON = ({ id, url }, md5) => ({ id, url, md5 }); const sync = async () => { const devtoSync = require(DEVtoSyncJSONPath); const pagePaths = pageUtils.all(); for (let pagePath of pagePaths) { const { subpage, slug } = pageUtils.getURLParam(pagePath); const pageID = `${subpage}/${slug}`; const page = pageUtils.read(subpage, slug); const devtoPage = toDEVto(page); const devtoMD5 = md5(pageUtils.stringify(devtoPage)); if (!devtoSync[pageID]) { logger.debug(`New page '${pageID}': creating DEV.to article...`); devtoSync[pageID] = toDEVtoSyncJSON( await DEVto.createArticle(devtoPage), devtoMD5 ); logger.success(`Created DEV.to article '${devtoSync[pageID].url}'.`); } else { const { id, url, md5: prevMD5 } = devtoSync[pageID]; if (prevMD5 !== devtoMD5) { logger.debug( `Page '${pageID}' changed: updating DEV.to article '${url}'...` ); devtoSync[pageID] = toDEVtoSyncJSON( await DEVto.updateArticle(id, devtoPage), devtoMD5 ); logger.success(`Updated DEV.to article '${devtoSync[pageID].url}'.`); } } } fs.writeFileSync(DEVtoSyncJSONPath, JSON.stringify(devtoSync, null, 2)); logger.info("DEV.to articles are up to date."); }; sync().catch((err) => { logger.error(err); process.exit(1); });
Затем я называю это в Мои github actions Workflow Анкет Рабочий процесс занял около 56 с Чтобы обновить 4 статьи (обычно это обновляется только один раз).
Проверьте мой полный репо в этом коммите Чтобы увидеть полный исходный код и реализовать для себя, не стесняйтесь DM Я в Твиттере Если вам нужна помощь.
Оригинал: «https://dev.to/phuctm97/automate-distributing-my-posts-to-dev-to-h69»