Как я планирую посты в Bluesky без использования SaaS

Я планирую три поста в Bluesky каждый день, используя GitHub Actions и JSONL-файл. Я не использую сторонние сервисы планирования.

Система работает с использованием одного файла: content/bluesky-queue.jsonl.

Каждая строка в этом файле — это JSON-объект.

  • Неопубликованные строки содержат только текст.
  • Опубликованные строки включают временную метку и URI поста.

Скрипт читает файл сверху вниз. Он находит первую строку без временной метки, публикует её, а затем обновляет эту строку.

Почему я использую JSONL вместо базы данных:

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

Работа с требованиями Bluesky API

Bluesky требует использования «facets» для ссылок и хэштегов. Нельзя просто отправить текст. Вы должны указать точные позиции байтов для этих элементов.

Я использую скрипт для расчета этих позиций. Я применяю TextEncoder, чтобы получить смещения байтов UTF-8. Это предотвращает ошибки при использовании эмодзи. Символы и байты — это не одно и то же.

Оптимизация GitHub Actions

GitHub Actions часто запускается с задержкой, если планировать задачи на начало часа. Чтобы исправить это, я использую смещение по минутам. Вместо 00:00 я использую 23:37. Это уменьшает задержки.

Я также добавляю случайную задержку от 0 до 5 минут перед публикацией. Это делает график постов более «человечным». Это позволяет избежать точного машинного тайминга, значимость которого некоторые алгоритмы могут снижать.

Предотвращение бесконечных циклов

Когда скрипт обновляет очередь, он фиксирует изменения (commit) обратно в репозиторий. Это может снова запустить workflow.

Я решаю это с помощью проверки сообщения коммита:

  • Скрипт добавляет [skip bluesky-queue] в сообщение коммита.
  • Workflow проверяет наличие этого тега.
  • Если тег существует, workflow не запускается.

Эта система является частью долгосрочного эксперимента с сайтами, курируемыми ИИ. Она остается легкой, дешевой и надежной.

Источник: https://dev.to/morinaga/how-i-schedule-three-daily-bluesky-posts-from-a-jsonl-queue-without-an-external-service-mno