چگونه پست‌های Bluesky را بدون استفاده از SaaS زمان‌بندی می‌کنم

من هر روز سه پست Bluesky را با استفاده از GitHub Actions و یک فایل JSONL زمان‌بندی می‌کنم. من از هیچ سرویس زمان‌بندی خارجی استفاده نمی‌کنم.

این سیستم با استفاده از یک فایل واحد کار می‌کند: content/bluesky-queue.jsonl.

هر خط در این فایل یک شیء JSON است.

  • خطوط منتشر نشده فقط شامل متن هستند.
  • خطوط منتشر شده شامل یک برچسب زمانی (timestamp) و یک URI پست هستند.

اسکریپت فایل را از بالا به پایین می‌خواند. اولین خطی را که فاقد برچسب زمانی است پیدا می‌کند، آن را منتشر می‌کند و سپس همان خط را به‌روزرسانی می‌کند.

چرا به جای پایگاه داده از JSONL استفاده می‌کنم:

  • ردیابی تغییرات در Git آسان است.
  • هر Job در CI می‌تواند یک خط جدید به فایل اضافه کند.
  • این کار باعث می‌شود تنظیمات ساده و رایگان باقی بماند.

Handling Bluesky API Requirements

Bluesky برای لینک‌ها و هشتگ‌ها به "facets" نیاز دارد. شما نمی‌توانید فقط متن بفرستید؛ بلکه باید موقعیت دقیق بایت‌ها (byte positions) را برای این عناصر ارائه دهید.

من از یک اسکریپت برای محاسبه این موقعیت‌ها استفاده می‌کنم. برای به‌دست آوردن آفست‌های بایت UTF-8 از TextEncoder استفاده می‌کنم. این کار از بروز خطا هنگام استفاده از ایموجی‌ها جلوگیری می‌کند؛ چرا که کاراکترها با بایت‌ها یکسان نیستند.

Optimizing GitHub Actions

اگر کارها (jobs) را در ابتدای ساعت زمان‌بندی کنید، GitHub Actions اغلب با تأخیر اجرا می‌شود. برای رفع این مشکل، از یک آفست در دقایق غیر از ابتدای ساعت استفاده می‌کنم. به جای 00:00، از 23:37 استفاده می‌کنم. این کار تأخیرها را کاهش می‌دهد.

همچنین یک تأخیر تصادفی بین ۰ تا ۵ دقیقه قبل از انتشار اضافه می‌کنم. این کار باعث می‌شود الگوی انتشار انسانی‌تر به نظر برسد و از زمان‌بندی دقیق ماشینی که برخی الگوریتم‌ها آن را کمتر می‌پسندند، جلوگیری می‌کند.

Preventing Infinite Loops

وقتی اسکریپت صف را به‌روزرسانی می‌کند، تغییر را دوباره در مخزن (repository) کامیت می‌کند. این کار می‌تواند باعث اجرای مجدد workflow شود.

من این مشکل را با یک محافظ در پیام کامیت (commit message guard) حل می‌کنم:

  • اسکریپت عبارت [skip bluesky-queue] را به پیام کامیت اضافه می‌کند.
  • workflow این تگ را بررسی می‌کند.
  • اگر تگ وجود داشته باشد، workflow اجرا نمی‌شود.

این سیستم بخشی از یک آزمایش بلندمدت با سایت‌های مدیریت‌شده توسط AI است. این روش سبک، ارزان و قابل اعتماد باقی می‌ماند.

منبع: https://dev.to/morinaga/how-i-schedule-three-daily-bluesky-posts-from-a-jsonl-queue-without-an-external-service-mno