برنامه ریزی پیام های 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 ، اما کار می کند)
💬 کلمات نهایی
هنوز یک کار در حال انجام است ، اما ساخت آن کاربردی و سرگرم کننده است.
دوست دارم افکار ، پیشرفت ها یا فقط “پروژه جالب” را بشنوم