Рубрики
Uncategorized

Автоматизировать распределение моих сообщений в dev.to

Чтобы максимизировать распределения моих будущих постов с нулевыми усилиями, я пишу бота, чтобы распространять все свои посты, чтобы использовать их API. С тегами блог, DevOps, Automation, GitHub.

Чтобы максимизировать распределения моих постов в блоге с нулевыми усилиями, я пишу бота, чтобы распространять все свои посты в 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»