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

کلاینت رسمی پایتون برای API داده واتس‌اپ. پاسخ‌های تایپ‌شده، یک وابستگی (درخواست)، جستجوهای مبتنی بر حافظه پنهان و یک سلسله مراتب استثنای تمیز.

۱ وابستگی
تایپ شده (py.typed)
پورت SDK مربوط به npm
PyPIGitHub

نصب

pip install whatsapp-data-sdk

پشتیبانی از پایتون ۳.۸-۳.۱۳. به همراه نشانگر py.typed برای پشتیبانی کامل از بررسی‌کننده نوع (mypy، pyright) ارائه می‌شود.

شروع سریع

from whatsapp_data_sdk import WhatsAppDataClient

client = WhatsAppDataClient(api_key="YOUR_KEY")  # sent as x-rapidapi-key

profile = client.get_profile("59898297150")
print(profile.get("exists"), profile.get("about"), profile.get("profilePic"))

احراز هویت و حمل و نقل

کلید شما همیشه به صورت x-rapidapi-key ارسال می‌شود. انتخاب کنید که درخواست‌ها با چه روشی ارسال شوند.

transportمجری زندهمیزبان کش/فقط پایگاه داده
"proxy" (پیش‌فرض)whatsapp-proxy.checkleaked.cc/number_cache روی همان میزبان
"rapidapi"wp-data.p.rapidapi.comwp-data-db-only.p.rapidapi.com
client = WhatsAppDataClient(api_key="RAPIDAPI_KEY", transport="rapidapi")

URLها/میزبان‌ها را از طریق base_url، cache_base_url، rapidapi_host، rapidapi_cache_host نادیده بگیرید.

جستجوهای اولیه در حافظه پنهان (صرفه‌جویی در هزینه)

تابع ()check_cached ابتدا نقطه پایانی کش ارزان/فقط پایگاه داده را می‌خواند و فقط در صورت بروز خطای واقعی، به یک بررسی زنده پولی برمی‌گردد.

r1 = client.check_cached("59898297150")                  # cacheFirst (default)
print(r1["_source"])                                     # "cache" | "live"
r2 = client.check_cached("59898297150", mode="cacheOnly")  # never a live call
r3 = client.check_cached("59898297150", mode="live")       # always fresh

یک رکورد معتبر ذخیره شده در حافظه نهان واتس‌اپ به عنوان یک رکورد موفق (بدون بررسی مجدد و بی‌فایده) در نظر گرفته می‌شود؛ فقط یک خطای واقعی NOT_IN_DATABASE از آن عبور می‌کند.

مرجع API

هر متد به صورت ۱:۱ به یک نقطه پایانی بازار نگاشت می‌شود - همان پوششی که npm SDK دارد، نامگذاری snake_case.

# Profile & pictures
client.get_profile(number, telegram=True, include_carrier=True)  # Get Profile Information
client.get_profile_no_picture(number)                            # (No profile pic)
pic = client.get_last_picture(number)                            # JPEG bytes -> pic.content, pic.to_data_uri()
client.get_device_count(number)                                  # Device count
client.get_osint_info(number)                                    # OSINT Info

# Breaches
client.get_phone_breaches(number, limit=50)                      # built-in (no external key)
client.get_phone_breaches_external(number, api_key="...")        # your checkleaked.cc key

# Search & database
client.search(country_code="UY", is_business=True, limit=20)     # Search
client.search_google_maps(latitude=-34.9, longitude=-56.16, radius=2000)  # Search in Google Maps
client.get_leaked_numbers_info()                                 # Leaked Numbers (500M) -> Drive link (MEGA tier)
client.download_entire_database()                                # Download the Entire DB -> Drive link (MEGA tier)

# Bulk
client.bulk_check(numbers)                                       # live (max 50)
client.bulk_check_db_basic(numbers)                              # DB basic (max 1000)
client.bulk_check_db_full(numbers)                                # DB full (max 1000)

# Telegram / carrier
client.get_telegram_profile("59898297150")                      # experimental
client.get_telegram_profile(["num1", "num2"])
client.carrier_lookup(number)                                    # Carrier Lookup
client.carrier_lookup_alt(number, page=2)                        # Carrier Lookup Alternative

«یافت نشد» برطرف می‌شود — مطرح نمی‌شود

عددی که در واتس‌اپ نیست، نتیجه‌ی عادی است، بنابراین این موارد حل می‌شوند (هرگز افزایش نمی‌یابند):

تابع get_profile / get_profile_no_picture / check_cached یک dict با exists=False (و code=NUMBER_NOT_FOUND) برمی‌گرداند.
جستجوی بدون تطابق، یک صفحه خالی برمی‌گرداند (success=False, data['docs'] == []).
تابع get_device_count برای شماره‌ای غیر از واتس‌اپ، success=False را برمی‌گرداند.
p = client.get_profile("14155552671")
if not p.get("exists"):
    print("not on WhatsApp")

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

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

هر متد، زمان انقضا (ثانیه) و تلاش مجدد را می‌پذیرد:

client.get_profile("59898297150", timeout=5, retries=0)

خطاها

همه شکست‌ها یک زیرکلاس از WhatsAppDataError ایجاد می‌کنند.

کلاسچه زمانی
ValidationErrorاستدلال‌های بد (قبل از هر درخواستی مطرح شده‌اند؛ بدون .status).
AuthError۴۰۱ / ۴۰۳ — کلید موجود نیست/نامعتبر است/اشتراک‌گذاری لغو شده است.
RateLimitError۴۲۹ - هنگامی که سرور Retry-After را ارسال کرد، حاوی ‎.retry_after_ms‎ است.
HttpErrorهر فایل غیر 2xx دیگری (مثلاً 400، 5xx)؛ دارای .status و .body است.
TimeoutErrorدرخواست از مهلت مقرر فراتر رفت.
NetworkErrorخرابی حمل و نقل.
WhatsAppDataErrorکلاس پایه.
from whatsapp_data_sdk import AuthError, RateLimitError, WhatsAppDataError

try:
    client.get_profile("59898297150")
except AuthError:
    ...  # 401/403
except RateLimitError as e:
    print(e.retry_after_ms)
except WhatsAppDataError as e:
    print(e.status, e.body)

POSTها (bulk_check، bulk_check_db_*) به صورت خودکار دوباره اجرا نمی‌شوند تا از سهمیه‌بندی دوبار خرج کردن جلوگیری شود.

قالب‌های شماره تلفن

هر فرمتی کار می‌کند — SDK نرمال‌سازی می‌کند؛ کمک‌کننده‌ها اکسپورت می‌شوند:

from whatsapp_data_sdk import to_digits, to_e164
to_digits("+598 98 297 150")  # "59898297150"  (path & live endpoints)
to_e164("59898297150")        # "+59898297150" (bulk-DB endpoints require it)

مرتبط

آنچه کاربران ما می‌گویند

نظرات واقعی از مشتریان راضی ما

4.5/5 (176 نظرات)