npm SDK — whatsapp-data-sdk
WhatsApp 数据 API 的官方 TypeScript/JavaScript 客户端。类型化方法,零运行时依赖,缓存优先查找,以及清晰的错误分类。
安装
npm install whatsapp-data-sdk # or pnpm add whatsapp-data-sdk # or yarn add whatsapp-data-sdk
使用原生 fetch 函数——可在 Node 18+、Bun、Deno 和浏览器中使用。无需 axios 或 polyfill。
快速入门
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',
})您可以通过 baseUrl、cacheBaseUrl、rapidApiHost、rapidApiCacheHost 覆盖任何 URL/主机。
缓存优先查找(节省成本)
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——双主机省钱流程。
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 和运营商
// 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)“未找到”的问题已解决——不会抛出异常。
号码不在 WhatsApp 上属于正常情况,并非错误,因此这些请求都会得到解决(它们永远不会被拒绝):
const p = await client.getProfile('14155552671')
if (!p.exists) console.log('not on WhatsApp')会抛出以下错误:无效号码 (400)、身份验证失败 (401/403)、速率限制 (429)、超时、网络故障和 5xx。
错误
所有拒绝都是 WhatsAppDataError 的子类,因此只需一个 catch 语句即可处理所有情况。
| 班级 | 什么时候 |
|---|---|
ValidationError | 错误的参数(同步抛出,在任何请求之前;没有 .status)。 |
AuthError | 401 / 403 — 密钥缺失、无效或已取消订阅。 |
RateLimitError | 429 — 当服务器发送 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按请求选项
每个方法都接受一个尾随选项对象,该对象还接受 signal、timeoutMs 和 retries 参数——用于每次调用取消和调整:
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有关的
用户评价
来自满意客户的真实评价