کیت توسعه نرمافزار npm — whatsapp-data-sdk
کلاینت رسمی TypeScript/JavaScript برای API داده واتساپ. متدهای تایپشده، بدون وابستگی در زمان اجرا، جستجوهای cache-first و طبقهبندی خطای تمیز.
نصب
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.com | wp-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 ابتدا نقطه پایانی 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)«یافت نشد» برطرف میشود — اجرا نمیشود
اینکه شمارهای در واتساپ نباشد، یک نتیجهی عادی است، نه یک خطا، بنابراین این موارد حل میشوند (و هرگز رد نمیشوند):
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مرتبط
آنچه کاربران ما میگویند
نظرات واقعی از مشتریان راضی ما