حزمة تطوير البرامج npm — حزمة تطوير برامج بيانات واتساب

عميل رسمي مكتوب بلغة TypeScript/JavaScript لواجهة برمجة تطبيقات بيانات WhatsApp. يتميز بأساليب مكتوبة، وعدم وجود تبعيات وقت التشغيل، وعمليات بحث تعتمد على ذاكرة التخزين المؤقت أولاً، وتصنيف واضح للأخطاء.

لا توجد تبعيات
مكتوب بالكامل
ESM + CJS
npmGitHub

ثَبَّتَ

npm install whatsapp-data-sdk
# or
pnpm add whatsapp-data-sdk
# or
yarn add whatsapp-data-sdk

يستخدم مكتبة fetch الأصلية - يعمل في Node 18+، وBun، وDeno، والمتصفحات. لا يتطلب axios أو polyfills.

بدء سريع

import { WhatsAppDataClient } from 'whatsapp-data-sdk'

const client = new WhatsAppDataClient({
  apiKey: process.env.WA_API_KEY!, // sent as x-rapidapi-key
})

const profile = await client.getProfile('59898297150')
console.log(profile.exists, profile.about, profile.profilePic)

المصادقة والنقل

يتم إرسال مفتاح API الخاص بك دائمًا في ترويسة x-rapidapi-key. اختر وجهة الطلبات باستخدام خاصية النقل.

transportمقدم برامج مباشرمضيف ذاكرة التخزين المؤقت / قاعدة البيانات فقطملحوظات
'proxy' (تقصير)whatsapp-proxy.checkleaked.cc/number_cache على نفس المضيفبسيط - عنوان URL أساسي واحد، بدون رأس مضيف.
'rapidapi'wp-data.p.rapidapi.comwp-data-db-only.p.rapidapi.comيتم تعيين x-rapidapi-host تلقائيًا. استخدم مفتاح RapidAPI الخاص بك.
// RapidAPI marketplace (live + DB-only hosts)
const client = new WhatsAppDataClient({
  apiKey: process.env.RAPIDAPI_KEY!,
  transport: 'rapidapi',
})

يمكنك تجاوز أي عنوان URL/مضيف عبر baseUrl و cacheBaseUrl و rapidApiHost و rapidApiCacheHost.

عمليات البحث التي تبدأ من ذاكرة التخزين المؤقت (توفير المال)

تقوم الدالة checkCached() بقراءة نقطة النهاية الخاصة بذاكرة التخزين المؤقت الرخيصة / قاعدة البيانات فقط أولاً، ولا تلجأ إلى فحص مباشر مدفوع إلا عندما لا يكون الرقم مخزنًا مؤقتًا بعد.

// cacheFirst (default): DB first → live only on a miss
const r1 = await client.checkCached('59898297150')
console.log(r1._source) // 'cache' | 'live'

// cacheOnly: never spend on a live check
const r2 = await client.checkCached('59898297150', { mode: 'cacheOnly' })

// live: always fresh
const r3 = await client.checkCached('59898297150', { mode: 'live' })

في نقل rapidapi، يقوم هذا بتوجيه قراءة ذاكرة التخزين المؤقت إلى wp-data-db-only.p.rapidapi.com والرجوع المباشر إلى wp-data.p.rapidapi.com - تدفق توفير المال باستخدام مضيفين.

مرجع واجهة برمجة التطبيقات

كل طريقة تتطابق بنسبة 1:1 مع نقطة نهاية السوق.

الملف الشخصي والصور

await client.getProfile(number, options?)            // Get Profile Information
await client.getProfileNoPicture(number, options?)   // Get Profile Information (No profile pic)
await client.getLastPicture(number)                  // Get Last Saved Picture (JPEG bytes)
await client.getDeviceCount(number)                  // Device count
await client.getOsintInfo(number)                    // OSINT Info

تتضمن خيارات getProfile ما يلي: telegram، google، lookup، includeCarrier، base64، geminiFaceAnalysis، reverseImageSearch، fullAiReport، includeDeviceCount، onlyCheck، useCache، forceBypassCache، والمزيد.

const pic = await client.getLastPicture('59898297150')
// pic.bytes: Uint8Array, pic.contentType: string
htmlImg.src = pic.toDataUri()

اختراقات الهواتف

await client.getPhoneBreaches(number, { limit, offset }) // Get Phone Breaches (no external key)
await client.getPhoneBreachesExternal(number, apiKey)     // Get Phone Breaches (your checkleaked.cc key)

البحث وقاعدة البيانات

await client.search({ countryCode: 'UY', isBusiness: true, limit: 20 })   // Search
await client.searchGoogleMaps({ latitude: -34.9, longitude: -56.16, radius: 2000 }) // Search in Google Maps

// Bulk downloads return a Google Drive link to the full dataset (MEGA tier only)
const leaks = await client.getLeakedNumbersInfo()   // Leaked Numbers (500M database)
console.log(leaks.driveFolder.url)

const backup = await client.downloadEntireDatabase() // Download the Entire DB
console.log(backup.driveFolder.url)

عمليات فحص جماعية

await client.bulkCheck(numbers, { includeBusiness, noBanStatus }) // Bulk Check (live, max 50)
await client.bulkCheckDbBasic(numbers)                            // Basic Check (DB, max 1000)
await client.bulkCheckDbFull(numbers)                            // Full Check (DB, max 1000)

تيليجرام وناقل البيانات

// Telegram (experimental)
await client.getTelegramProfile('59898297150')            // single
await client.getTelegramProfile(['num1', 'num2'])         // batch

// Carrier
await client.carrierLookup(number)              // Carrier Lookup
await client.carrierLookupAlt(number)           // Carrier Lookup Alternative (spam-report signals)
await client.carrierLookupAlt(number, { page: 2 }) // page through the reports (response has a `pagination` block)

يتم حل مشكلة "غير موجود" - ولا يتم طرح استثناء.

إن عدم وجود رقم على واتساب هو نتيجة طبيعية، وليس خطأ، لذا يتم حل هذه المشكلة (لا يتم رفضها أبدًا):

تُرجع الدالة getProfile / getProfileNoPicture / checkCached إدخالًا مع exists:false (والرمز: 'NUMBER_NOT_FOUND').
البحث بدون نتائج يُرجع صفحة فارغة (success:false, data.docs:[]).
تُرجع الدالة getDeviceCount لرقم غير تابع لتطبيق واتساب النتيجة التالية: النجاح: خطأ (مع غياب deviceCount).
const p = await client.getProfile('14155552671')
if (!p.exists) console.log('not on WhatsApp')

ما الذي يسبب الخطأ: رقم غير صالح (400)، فشل المصادقة (401/403)، حد المعدل (429)، مهلة، فشل الشبكة، و5xx.

أخطاء

جميع حالات الرفض هي فئة فرعية من WhatsAppDataError، لذا فإن عبارة catch واحدة تعالج كل شيء.

فصلمتى
ValidationErrorوسائط غير صالحة (تم طرحها بشكل متزامن، قبل أي طلب؛ لا يوجد .status).
AuthError401 / 403 — مفتاح مفقود أو غير صالح أو تم إلغاء الاشتراك فيه.
RateLimitError429 — يحمل retryAfterMs عندما أرسل الخادم Retry-After.
HttpErrorأي رمز آخر غير 2xx (مثل 400، 5xx)؛ يحمل .status و .body.
TimeoutErrorتجاوز الطلب مهلة الانتظار (بالمللي ثانية).
NetworkErrorفشل النقل (نظام أسماء النطاقات، إعادة ضبط الاتصال، إجهاض منتصف الجسم).
WhatsAppDataErrorالفئة الأساسية لكل ما سبق.
import { AuthError, RateLimitError, TimeoutError, WhatsAppDataError } from 'whatsapp-data-sdk'

try {
  await client.getProfile('59898297150')
} catch (err) {
  if (err instanceof AuthError) {/* 401/403 — bad/unsubscribed key */}
  else if (err instanceof RateLimitError) {/* 429 — err.retryAfterMs */}
  else if (err instanceof TimeoutError) {/* request timed out */}
  else if (err instanceof WhatsAppDataError) {
    console.error(err.status, err.body)
  }
}

إعدادات

new WhatsAppDataClient({
  apiKey: '...',           // required
  transport: 'proxy',      // 'proxy' | 'rapidapi'
  timeoutMs: 60000,        // request timeout (bounds headers AND body read)
  retries: 2,              // retry 5xx / 429 / network / timeout (GET only) with backoff
  retryDelayMs: 500,       // exponential base; 429 honors Retry-After when longer
  baseUrl: '...',          // override live base URL
  cacheBaseUrl: '...',     // override cache/DB-only base URL
  rapidApiHost: '...',     // override live x-rapidapi-host
  rapidApiCacheHost: '...',// override cache x-rapidapi-host
  userAgent: '...',        // custom User-Agent
  fetch: globalThis.fetch, // inject a custom fetch (tests / polyfills)
})

تنسيقات أرقام الهواتف

مرر الأرقام بأي تنسيق - يقوم SDK بتطبيعها، ويصدر الأدوات المساعدة حتى تتمكن من إعادة استخدام نفس التطبيع:

import { toDigits, toE164 } from 'whatsapp-data-sdk'
toDigits('+598 98 297 150') // '59898297150'  (path & live endpoints)
toE164('59898297150')       // '+59898297150' (bulk-DB endpoints; their validator requires it)
// both throw ValidationError on input with no digits

خيارات لكل طلب

تأخذ كل طريقة كائن خيارات لاحق يقبل أيضًا الإشارة، ومهلة المهلة بالمللي ثانية، وإعادة المحاولات - لإلغاء كل استدعاء وضبطه:

const controller = new AbortController()
const p = client.getProfile('59898297150', {
  telegram: true,
  signal: controller.signal, // cancel this specific request
  timeoutMs: 5000,           // override the client timeout for this call
})
controller.abort() // rejects with WhatsAppDataError

متعلق ب

ما يقوله مستخدمونا

تقييمات حقيقية من عملائنا الراضين

4.5/5 (176 تقييمات)