برنامه نویسی

برنامه ریزی پیام های WhatsApp با Bun + bullmq

من در جستجوی یک برنامه ریز پیام WhatsApp (بدون استفاده از API Business WhatsApp) بودم ، اما نتوانستم چیزی مناسب پیدا کنم – بنابراین تصمیم گرفتم خودم یکی را بسازم.


🔧 آنچه می خواستم بسازم

  • ایجاد ، ویرایش و حذف پیام های برنامه ریزی شده
  • تایمر “ارسال بعد (در روزها)” تنظیم کنید
  • تایمر را با یک کلیک تنظیم کنید

من به نظر می رسید مانند یک پروژه ساده ، اما معلوم شد که بسیار مشکل است. در اینجا نحوه برخورد با آن آورده شده است.


❌ چرا نه node-schedule یا setInterval؟

راه حل های اساسی مانند node-schedule یا setInterval قابلیت اطمینان را که می خواستم ارائه ندهید. بنابراین من به bullmq، که از Redis برای مدیریت شغل استفاده می کند.

من استفاده می کنم:

  • Prisma با SQLite برای ردیابی پیام ها و برنامه ها
  • whatsapp-web.js به عنوان یک مشتری غیر رسمی واتس اپ
  • Backend: Bun با Hono

structure ساختار باطن

ساختار عقب


شکست پشتی

📦 وابستگی ها

{
  "dependencies": {
    "bullmq": "^5.45.0",
    "hono": "^4.7.5",
    "prisma": "^6.5.0",
    "ioredis": "^5.6.0",
    "whatsapp-web.js": "^1.27.0",
    "qrcode-terminal": "^0.12.0",
    "@prisma/client": "^6.5.0"
  }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


🧠 طرح Prisma

من سه مدل دارم: AdminProfileبا Peopleوت Messageبشر در اینجا مدل پیام است.

model Message {
  id          String   @id @default(cuid())
  content     String
  sendTo      People   @relation(fields: [sendToPhone], references: [phone])
  sendToPhone String
  sendAfter   Float    @default(0)
  createdAt   DateTime @default(now())
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


🔐 AUTH BASIC

مورد استفاده Honoساخت و ساز داخلی با حداقل تنظیمات:

new Hono().use(
  basicAuth({
    username: Bun.env.USERNAME || "user",
    password: Bun.env.PASSWORD || "pass",
  })
);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


📨 صف پیام با bullmq

import { Queue } from "bullmq";

export const messageQueue = new Queue("messageQueue", {
  connection: {
    url: process.env.REDIS_REST_URL,
    maxRetriesPerRequest: null,
  },
});
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


🗓 برنامه ریزی پیام ها

این کار بعد از هر کار ایجاد/ویرایش/حذف انجام می شود.

await messageQueue.add(
  jobId,
  { content: message.content, sendToPhone: message.sendToPhone },
  { jobId, delay: sendAfterMs }
);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

همچنین اگر پیام ها به موقع تنظیم نشده اند ، پیام یادآوری اضافه شده است

messageQueue.add("message-reschedule", {
  content: "You have 3.5 hours left to reschedule messages or I think you are dead",
  sendToPhone: "8801884510919",
}, { delay: timeLeft - 3.5 * 3600 * 1000 });
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


client مشتری WhatsApp (wweb.js)

import { Client, LocalAuth } from "whatsapp-web.js";

const client = new Client({ authStrategy: new LocalAuth() });

const sendMessage = async (phone: string, message: string) => {
  client.sendMessage(`${phone}@c.us`, message);
};
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


👷 کارگر: همگام سازی خودکار با برنامه

const worker = new Worker(
  "messageQueue",
  async (job) => {
    await sendMessage(job.data.sendToPhone, job.data.content);
  },
  { connection: redisConfig, concurrency: 1 }
);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


frontend (حداقل اما کاربردی)

جلو فقط یک رابط ساده است که با استفاده از آن ساخته شده است:

  • Next.js
  • Shadcn UI
  • اقدامات سرور برای صحبت با باطن

جبهه
🔗 کد Frontend را مشاهده کنید


✨ tl ؛ دکتر

من یک برنامه ریز WhatsApp را با استفاده از:

  • نان با وصل کردن برای پس زمینه
  • گاو نر برای صف پیام قابل اعتماد
  • prisma + sqlite برای ذخیره برنامه ها
  • wweb.js برای ارسال پیام های WhatsApp
  • بعد. js Frontend (Barebones ، اما کار می کند)

💬 کلمات نهایی

هنوز یک کار در حال انجام است ، اما ساخت آن کاربردی و سرگرم کننده است.

دوست دارم افکار ، پیشرفت ها یا فقط “پروژه جالب” را بشنوم

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا