
أصبحت بوتات واتساب شائعة بشكل متزايد لأتمتة المهام، وخدمة العملاء، وإدارة التفاعلات في المجموعات. في هذه التدوينة، سنقارن بين مكتبتين شائعتين لإنشاء بوتات واتساب: whatsapp-web.js
و WhiskeySockets/Baileys
. كما سنقوم ببناء بوت بسيط باستخدام TypeScript و Bun.
الميزة | whatsapp-web.js | Baileys |
---|---|---|
البروتوكول المستخدم | واتساب ويب (Puppeteer) | واتساب WebSocket (معكوس الهندسة) |
هل يتطلب كروم؟ | ✅ نعم | ❌ لا |
القابلية للتوسّع | ❌ محدودة | ✅ عالية جدًا |
دعم الجلسات المتعددة | ❌ لا | ✅ نعم |
الأداء | ❌ استهلاك موارد أعلى | ✅ خفيف وفعال |
الثبات | ✅ أكثر استقرارًا (تنفيذ رسمي عبر الويب) | ❌ أكثر عرضة للكسر بسبب تغييرات API |
التعامل مع المرفقات | ✅ يتطلب معالجة يدوية (يجب على المستخدمين تنزيل الملفات وترميزها وتنسيقها يدويًا قبل الإرسال. بالإضافة إلى ذلك، قد يتطلب إرسال مقاطع الفيديو وصور GIF متصفح كروم مثبتًا بشكل منفصل. مزيد من التفاصيل.) | ✅ يدعم المرفقات بشكل أصلي |
سهولة الإعداد | ✅ أسهل في الإعداد | ❌ أكثر تعقيدًا قليلًا |
كل مكتبة لها نقاط قوة: whatsapp-web.js
أسهل في الاستخدام، بينما Baileys
أكثر كفاءة وقابلية للتوسّع. ومع ذلك، قد يحتاج مستخدمو Baileys
إلى تحديث تنفيذهم بشكل متكرر بسبب تغييرات API الخاصة بواتساب.
sh
bun add whatsapp-web.js qrcode-terminal baileys
typescript
//whatsapp-web.ts
import { Client, LocalAuth, MessageMedia } from "whatsapp-web.js";
import qrcode from "qrcode-terminal";
import fs from "fs";
const client = new Client({
authStrategy: new LocalAuth(),
});
client.on("qr", (qr) => {
console.log("امسح رمز QR لتسجيل الدخول:");
qrcode.generate(qr, { small: true });
});
client.on("ready", () => {
console.log("البوت جاهز!");
});
client.on("message", async (msg) => {
if (msg.body.toLowerCase() === "hello") {
await msg.reply("مرحبًا! كيف يمكنني مساعدتك؟");
}
if (msg.body.toLowerCase() === "send image") {
const media = MessageMedia.fromFilePath("./image.jpg");
await client.sendMessage(msg.from, media, { caption: "إليك الصورة!" });
}
});
client.initialize();
typescript
//baileys.ts
import makeWASocket, { useMultiFileAuthState, MessageType, WAMediaUpload } from "@whiskeysockets/baileys";
import fs from "fs";
async function startBaileysBot() {
const { state, saveCreds } = await useMultiFileAuthState("auth_info");
const sock = makeWASocket({
auth: state,
});
sock.ev.on("creds.update", saveCreds);
sock.ev.on("connection.update", (update) => {
const { connection, lastDisconnect } = update;
if (connection === "close") {
console.log("تم إغلاق الاتصال، إعادة الاتصال...");
startBaileysBot();
} else if (connection === "open") {
console.log("البوت جاهز!");
}
});
sock.ev.on("messages.upsert", async (m) => {
const message = m.messages[0];
if (!message.key.fromMe && message.message?.conversation === "hello") {
await sock.sendMessage(message.key.remoteJid!, { text: "مرحبًا! كيف يمكنني مساعدتك؟" });
}
if (!message.key.fromMe && message.message?.conversation === "send image") {
const buffer = fs.readFileSync("./image.jpg");
await sock.sendMessage(message.key.remoteJid!, { image: buffer, caption: "إليك الصورة!" });
}
});
}
startBaileysBot();
بالنسبة لـ whatsapp-web.js
:
sh
bun run whatsapp-web.ts
بالنسبة لـ Baileys
:
sh
bun run baileys.ts
إذا كنت تبني بوتًا بسيطًا، فإن whatsapp-web.js
خيار رائع. ومع ذلك، بالنسبة للحالات المتقدمة، فإن Baileys
هو الخيار الأفضل بسبب كفاءته ودعمه للأجهزة المتعددة. ومع ذلك، يجب أن يكون مستخدمو Baileys
مستعدين لاحتمال حدوث تغييرات كبيرة في API. الآن لديك أمثلة لكلاهما، بما في ذلك التعامل مع المرفقات، لذا يمكنك اختيار الأفضل لاحتياجاتك!