کیت توسعه نرم‌افزار npm — whatsapp-data-sdk

کلاینت رسمی TypeScript/JavaScript برای API داده واتس‌اپ. متدهای تایپ‌شده، بدون وابستگی در زمان اجرا، جستجوهای cache-first و طبقه‌بندی خطای تمیز.

وابستگی صفر
کاملاً تایپ شده
ESM + CJS
npmGitHub

نصب

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

از واکشی بومی استفاده می‌کند - در Node.js نسخه ۱۸+، 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.comx-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 ابتدا نقطه پایانی cheap cache / DB-only را می‌خواند و تنها زمانی که عدد هنوز cache نشده باشد، به یک چک زنده پولی برمی‌گردد.

// 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 هدایت می‌کند - جریان صرفه‌جویی در هزینه دو میزبان.

مرجع API

هر روش به صورت ۱:۱ به یک نقطه پایانی بازار نگاشت می‌شود.

پروفایل و تصاویر

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 مقدار success:false (بدون وجود deviceCount) را برمی‌گرداند.
const p = await client.getProfile('14155552671')
if (!p.exists) console.log('not on WhatsApp')

چه چیزی نمایش داده می‌شود: یک شماره نامعتبر (400)، خطای احراز هویت (401/403)، محدودیت سرعت (429)، زمان اتمام، خطای شبکه و 5xx.

خطاها

همه رد شدن‌ها زیرکلاسی از WhatsAppDataError هستند، بنابراین یک catch همه چیز را مدیریت می‌کند.

کلاسچه زمانی
ValidationErrorآرگومان‌های نامناسب (به صورت همزمان، قبل از هر درخواستی ارسال می‌شوند؛ بدون ‎.status‎).
AuthError۴۰۱ / ۴۰۳ - کلید موجود نیست، نامعتبر است یا اشتراک آن لغو شده است.
RateLimitError۴۲۹ - هنگامی که سرور Retry-After را ارسال کرد، حاوی retryAfterMs است.
HttpErrorهر نوع داده غیر 2xx دیگر (مثلاً 400، 5xx)؛ حاوی .status و .body است.
TimeoutErrorدرخواست از مهلت زمانی تعیین‌شده تجاوز کرد.
NetworkErrorخرابی انتقال (DNS، تنظیم مجدد اتصال، قطع شدن عملکرد بخش میانی بدن).
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

گزینه‌های هر درخواست

هر متد یک شیء گزینه‌های دنباله‌دار می‌گیرد که سیگنال، timeoutM و تلاش‌های مجدد را نیز می‌پذیرد - برای لغو و تنظیم در هر فراخوانی:

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 نظرات)