Python ile WhatsApp API: Mesaj Gönderme, Alma ve Otomatize Etme

Python ile WhatsApp APIPython + WhatsApp API

WhatsApp API ile PythonMesaj Gönderin, Alın ve Otomatikleştirin

Kullanmanız gereken her şey Python ile WhatsApp API: hangi kütüphaneyi seçmeli, bir QR kod ile bağlı bir hesap nasıl bağlanır, ile nasıl mesaj gönderilir ve alınır istekleri ve httpx, ve bir bot veya yapay zeka ajanı için FastAPI webhook'unun nasıl bağlanacağı.
Bugün REST API, Meta İşletme doğrulaması gerekmiyor
send_whatsapp.py
import requests BASE_URL = "https://{YOUR_DSN}/api/v1" HEADERS = {"X-API-KEY": "YOUR_ACCESS_TOKEN"} def send_whatsapp(chat_id: str, text: str) -> dict: response = requests.post( f"{BASE_URL}/chats/{chat_id}/messages", headers=HEADERS, data={"text": text}, ) response.raise_for_status() return response.json() send_whatsapp("9f9uio56sopa456s", "Python'dan merhabalar!")
200 OK, mesaj gönderildi
Tanım

Python'da WhatsApp API nedir?

Bu Python ile WhatsApp API WhatsApp Web'e tıklamak yerine Python kodundan WhatsApp Business mesajlaşmasını çağrılması anlamına gelir. Bir Python betiği veya arka uç servisi, genellikle şu şekilde bir HTTP isteği gönderir: istekleri veya httpx, sohbetleri, mesajları ve webhook'ları sunan bir REST API'ye; ister doğrudan Meta'nın Cloud API'sine veya WhatsApp'ı LinkedIn, Instagram ve Telegram ile birlikte tek bir arayüz arkasında birleştiren Unipile gibi bir birleşik sağlayıcıya. Meta, resmi bir hepsi bir arada WhatsApp Python SDK'sı yayınlamamıştır; bu nedenle bu kılavuzdaki neredeyse tüm Python entegrasyonları ve web'in geri kalanında bulacağınız şeylerin çoğu, doğrudan REST uç noktalarıyla iletişim kurar.
WhatsApp, LinkedIn, Instagram ve Telegram için tek bir REST API
QR kod veya eşleştirme kodu ile bağlanır, Meta İşletme doğrulaması gerekmez
istekleri basit betikler için, httpx ölçeklenebilir eşzamansız (async) için
Yönlendirme katmanı, erişim, maliyet ve sınırlar için, ile başlayın WhatsApp API erişimi, maliyeti ve limitleri kılavuzu. Python yerine PHP ile mi inşa ediliyor?
Aynı entegrasyonu PHP ile okuyun
İnşa etmeden önce

Başlamadan önce neye ihtiyacınız var?

Python kullanarak mesaj gönderip almaya başlamak için bir Meta İşletme hesabına veya WhatsApp Business Platform onayına ihtiyacınız yoktur. Çalışan bir Python ortamına, bir HTTP istemcisine, webhook'ları alabileceğiniz bir yere ve bir Unipile hesabına ihtiyacınız var.
Python 3.9+
Unipile Python SDK'sının kendi gereksindiği minimum sürümle eşleşir pydantic bağımlılık ve modern httpx ve FastAPI sürümleri.
requests veya httpx
pip yükleme istekleri senkron çağrılar için veya pip install httpx eşzamanlı mesaj göndermeyi planlıyorsanız. Bkz. istekleri ve httpx belgeler.
Yerel tünel
gibi bir araç ngrok veya cloudflared geliştirme yaparken FastAPI webhook rotanızı genel bir HTTPS URL'sine açmak için.
Erişim Anahtarı ve DSN
İkisi de Unipile kontrol panelinden gelir. DSN çağırdığınız the host'tur, Erişim Jetonu (Access Token) şuraya yazılır: X-API-ANAHTAR Her isteğin başlığı.
Kütüphane Karşılaştırması

WhatsApp için hangi Python kütüphanesini kullanmalısınız?

Tek ve açık bir yanıt yoktur ve bu konudaki blog yazılarının çoğu, yazarlarının bakımını üstlendiği paketi öne çıkarır. Tarayıcı otomasyonundan birleşik bir sağlayıcıya kadar, Python geliştiricilerinin bugün WhatsApp'ı çağırmasının beş yolunun tarafsız bir karşılaştırması burada yer almaktadır; böylece pazarlamaya göre değil, her seçeneğin gerçekten ne yaptığına göre seçim yapabilirsiniz.
Kütüphane / yaklaşım
Aslında ne dediği
Meta İşletme Doğrulaması
Sürdürüldü
En iyisi
pywhatkit
Sunucu tarafı bir API yerine tarayıcı sekmesinde WhatsApp Web'i çalıştırır (klavye otomasyonu)
YOK, API yok
Topluluk, ara sıra olan
Üretime gönderilmeyen, ekranı olan bir makinedeki tek seferlik betikler ve demolar
whatsapp-bulut-api'si
Meta'nın WhatsApp Bulut API uç noktaları etrafında ince Python sarmalayıcısı
Gerekli
Topluluk sarmalayıcısı
Cloud API'de halihazırda onaylanmış ve Pythonik bir istemci isteyen ekipler
whatsapp-api-client-python
WhatsApp oturumunu elinde bulunduran green-api SaaS'ı çağırır
Gerekli değil
Tedarikçi bakımından / Tedarikçi destekli
İkinci, tek amaçlı bir SaaS sağlayıcısına güvenmekten rahatlık duyan ekipler
talepler, doğrudan Meta'ya
Meta's Cloud API endpoints, hiç sarmalaycı yok
Gerekli
Kendin Yap
Meta İşletme doğrulaması halihazırda onaylanmış ve tam kontrol isteyen ekipler
Unipile, requests veya httpx
Unipile'in birleştirilmiş mesajlaşma API'si; LinkedIn, Instagram ve Telegram'ın yanı sıra WhatsApp'ı da destekler
Gerekli değil
Aktif olarak sürdürülüyor, beta aşamasında Python SDK'sı
Her kullanıcının adına çok sayıda son kullanıcı WhatsApp hesabını birbirine bağlayan SaaS ürünleri
pywhatkit
ÇağrılarSunucu tarafı bir API olarak değil, tarayıcı sekmesinde WhatsApp Web'i çalıştırır
Meta doğrulamasıYOK, API yok
SürdürüldüTopluluk, ara sıra olan
En iyisiTek seferlik betikler ve demolar, üretime gönderim için değil
whatsapp-bulut-api'si
ÇağrılarMeta's kendi Cloud API uç noktalarının etrafındaki ince sarmalayıcı
Meta doğrulamasıGerekli
SürdürüldüTopluluk sarmalayıcısı
En iyisiCloud API'de halihazırda onaylanmış takımlar
whatsapp-api-client-python
ÇağrılarWhatsApp oturumunu barındıran green-api SaaS
Meta doğrulamasıGerekli değil
SürdürüldüTedarikçi bakımından / Tedarikçi destekli
En iyisiİkinci bir SaaS sağlayıcısı konusunda rahat olan ekipleler
talepler, doğrudan Meta'ya
ÇağrılarMeta Bulut API uç noktaları, sarmalaycı yok
Meta doğrulamasıGerekli
SürdürüldüKendin Yap
En iyisiMeta İşletme doğrulaması için halihazırda onay almış ekipler
Unipile, requests veya httpx
ÇağrılarBirleşik mesajlaşma API'si, WhatsApp, LinkedIn, Instagram ve Telegram ile
Meta doğrulamasıGerekli değil
SürdürüldüAktif olarak sürdürülüyor, beta aşamasında Python SDK'sı
En iyisiBirçok son kullanıcı hesabını birbirine bağlayan SaaS ürünleri
Tutan her seçenek Meta İşletme doğrulaması gerekiyor nihayetinde Meta'nın kendi WhatsApp Cloud API'si ile konuşur (bkz. Meta'nın WhatsApp Business Platformu belgeleri), ki bu da hali hazırda doğrulanmış bir İşletme numarası işletiyorsanız doğru tercihtir. Bunun yerine birçok farklı son kullanıcı adına WhatsApp hesaplarını bağlıyorsanız, bir QR kodu veya eşleştirme kodu akışı bu doğrulama adımını tamamen ortadan kaldırır; bu kılavuzun geri kalanının kullandığı model de budur.
Hesap Bağlantısı

Python'da bir WhatsApp hesabını nasıl bağlarsınız?

Bu kılavuzdaki her çağrı çalışır kimliği doğrulanmış bir kullanıcı adına kendi WhatsApp hesabını bağlayan. Meta İşletme doğrulama adımı yoktur: Python'dan tek bir POST /api/v1/accounts ile talep provider ayarla WHATSAPP, ve kullanıcı, bir QR kodu taratarak veya telefonuna bir eşleştirme kodu girerek bağlantıyı onaylar.
Seçenek A: QR kod (varsayılan)
Ayrıl telefon_numarasını_eşleştirme istek gövdesinden ve Unipile, QR kod yükünü taşıyan bir kontrol noktası döndürür. Bunu şu gibi bir kütüphane ile render edin: karekod ve kullanıcının WhatsApp > Bağlı Cihazlar bölümünden taraması için bunu görüntüleyin.
connect_qr.py
import requests BASE_URL = "https://{YOUR_DSN}/api/v1" HEADERS = {"X-API-KEY": "YOUR_ACCESS_TOKEN", "accept": "application/json"} def connect_whatsapp_qr() -> dict: response = requests.post( f"{BASE_URL}/accounts", headers=HEADERS, json={"provider": "WHATSAPP"}, ) response.raise_for_status() return response.json() account = connect_whatsapp_qr() print(account) # account, yeni bir account_id ve bir kontrol noktası nesnesi içerir. # Kontrol noktasını bir QR kodu olarak görüntüleyin ve kullanıcının bunu # WhatsApp > Bağlı Cihazlar bölümünden taramasını sağlayın.
Seçenek B: eşleştirme kodu
Geç telefon_numarasını_eşleştirme E.164 formatında sadece rakamlar, önce ülke kodu, artı işareti yok, boşluk yok. Unipile, herhangi bir QR kodu taratmak yerine kullanıcının WhatsApp'a yazdığı bir kısa kod taşıyan bir kontrol noktası döndürür; bu, üzerinde QR kodu gösterecek ekranı olmayan başsız (headless) bir sunucu için daha uygundur.
connect_pairing_code.py
def connect_whatsapp_pairing_code(phone_e164_digits: str) -> dict: response = requests.post( f"{BASE_URL}/accounts", headers=HEADERS, json={ "provider": "WHATSAPP", "pairing_phone_number": phone_e164_digits, }, ) response.raise_for_status() return response.json() # Ülke kodu + numara, sadece rakamlar, ör. Fransa account = connect_whatsapp_pairing_code("33612345678") # account nesnesinin checkpoint'i, kullanıcı arayüzünüzde gösterilecek eşleştirme kodunu taşır. # Kullanıcı bunu WhatsApp > Bağlı Cihazlar > Telefon numarasıyla bağla bölümünden girer.
Hesabın bağlı olduğunu onaylayın
Kullanıcı QR kodu tarattıktan veya eşleştirme kodunu girdikten sonra, hesabın aslında ne zaman gönderim ve alım için hazır olduğunu bilmeniz gerekir. Unipile size iki seçenek sunar.
Hesap durumunu sorgula
Ara GET /api/v1/accounts/{account_id} hesap artık kontrole ihtiyaç duymaz hale gelene kadar her birkaç saniyede bir. Basit, ancak beklerken istek harcar.
Hesap Durumu Webhook'u
Bir webhook kaydetmek için kaynak ayarla hesap_durumu (aynı POST /api/v1/webhooks mesajlar için kullanılan uç nokta) ve Unipile iletmeleri {"AccountStatus": {"account_id": "...", "message": "TAMAM"}} hesap hazır olduğu anda. Çoğu canlı sistem entegrasyonu bunu kullanır.
poll_status.py
import time def wait_for_connection(account_id: str, timeout_seconds: int = 120) -> dict: deadline = time.time() + timeout_seconds while time.time() < son_tarih: yanıt = requests.get(f"{BASE_URL}/accounts/{account_id}", headers=HEADERS) response.raise_for_status() account = response.json() print(account) # kendi durum kontrolünüz için canlı yükü inceleyin time.sleep(2) raise TimeoutError("WhatsApp hesabı bağlantıyı zamanında onaylamadı")
Gönder

Python ile nasıl WhatsApp mesajı gönderilir?

Python'dan bir WhatsApp mesajı göndermek tek bir HTTP çağrısıdır: POST /api/v1/chats/{chat_id}/messages, ile chat_id sohbetleri listelemeden veya gelen bir web kancasından zaten sahip olduğunuz ve bir text alanı. Uç nokta, hem form kodlu hem de JSON kodlu gövdeleri aynı şekilde kabul eder, bu nedenle düz requests.post ile veri= Ekstra kurulum gerektirmeden çalışır.
Mevcut değilse chat_id, örneğin yeni bir kişiye gönderilen ilk mesaj, arama POST /api/v1/chats yerine bir account_id ve alıcının attendees_ids; Unipile, 1:1 sohbeti oluşturur ve mesajı aynı istek içinde gönderir.
send.py
import requests BASE_URL = "https://{YOUR_DSN}/api/v1" HEADERS = {"X-API-KEY": "YOUR_ACCESS_TOKEN"} def send_message(chat_id: str, text: str) -> dict: response = requests.post( f"{BASE_URL}/chats/{chat_id}/messages", headers=HEADERS, data={"text": text}, ) response.raise_for_status() return response.json() def start_chat(account_id: str, attendee_provider_id: str, text: str) -> dict: response = requests.post( f"{BASE_URL}/chats", headers=HEADERS, data={ "account_id": account_id, "attendees_ids": attendee_provider_id, "text": text, }, ) response.raise_for_status() return response.json()
Mesaj türleri (metin, medya, sesli notlar, şablonlar) ve 24 saatlik müşteri hizmetleri penceresi başlı başına bir konudur ve rehberinde ayrıntılı olarak ele alınmaktadır. WhatsApp API'sinin desteklediği mesaj türleri. Bu bölüm yalnızca Python altyapısını kapsamaktadır.
Meta, Temmuz 2025'ten bu yana WhatsApp API mesajlarını sohbet başına değil, gönderilen mesaj başına faturalandırıyor. Bkz. WhatsApp API fiyatlandırması mesaj başına nasıl çalışır güncel ülke bazlı oranlar için.
Eşzamanlılık

Python'da WhatsApp mesajlarını asenkron olarak nasıl gönderirsiniz?

Aynı anda çok fazla alıcıya gönderim yaptığınızda, bir yayın (broadcast), bir kuyruk boşaltma işlemi, toplu bir takip işi, birini bekleyen bir döngü requests.post bir seferde olan darboğazdır, API değil. httpx.AsyncClient ile birleştirilmiş asyncio.gather tek bir olay döngüsünden, hiçbir iş parçacığı (thread) gerektirmeden aynı anda birçok istek gönderir. Bir semafor, kibar bir vatandaş olarak kalmanızı sağlar: WhatsApp hesapları hala platformun kendi oran sınırlarına tabidir, bu nedenle sınırsız eşzamanlılık, yavaş bir döngüyü yalnızca 429 yanıtlarından oluşan bir duvarla değiştirir.
send_bulk_async.py
import asyncio import httpx BASE_URL = "https://{YOUR_DSN}/api/v1" HEADERS = {"X-API-KEY": "YOUR_ACCESS_TOKEN"} CONCURRENCY_LIMIT = 5 async def send_message_async( client: httpx.AsyncClient, semaphore: asyncio.Semaphore, chat_id: str, text: str, ) -> dict: async with semaphore: response = await client.post( f"{BASE_URL}/chats/{chat_id}/messages", headers=HEADERS, data={"text": text}, ) response.raise_for_status() return response.json() async def send_bulk(messages: list[tuple[str, str]]) -> list: semaphore = asyncio.Semaphore(CONCURRENCY_LIMIT) async with httpx.AsyncClient(timeout=30) as client: tasks = [ send_message_async(client, semaphore, chat_id, text) for chat_id, text in messages ] return await asyncio.gather(*tasks, return_exceptions=True) messages = [ ("9f9uio56sopa456s", "Your order shipped!"), ("a1b2c3d4e5f6g7h8", "Your order shipped!"), ] results = asyncio.run(send_bulk(messages)) for chat_id_text, result in zip(messages, results): if isinstance(result, Exception): print("failed:", chat_id_text[0], result)
Sakla EŞ ZAMANLILIK SINIRI muhafazakar olun ve gerçek hata oranlarını inceledikten sonra artırın. return_exceptions=True yani başarısız olan tek bir gönderim toplu işin geri kalanını iptal etmez; bu, tek seferde yüzlerce mesaj gönderdiğinizde önemlidir. Aşağıdaki oran sınırı ve yeniden deneme bölümü aynı kalıp üzerine kuruludur.
Webhooks

Bir FastAPI webhook'u ile WhatsApp mesajlarını nasıl alırsınız?

Bir webhook, Python servisinizin yeni bir WhatsApp mesajını, mesajı sürekli sorgulamak (polling) yerine, geldiği anda öğrenmesini sağlar. Unipile'a tek bir uç nokta (endpoint) kaydedersiniz ve eşleşen her olay sunucunuza JSON olarak iletilir. FastAPI alıcı taraf için doğal bir uyumdur: pydantic model sizin için veriyolunu doğrular ve Arka Plan Görevleri Gerçek iş, yani bir modeli çağırmak ve veritabanına yazmak sonradan gerçekleşirken, rotanızın hemen bir yanıt döndürmesini sağlayın.
1. Webhook'u kaydet
Nokta request_url FastAPI rotanızda. Yerel geliştirme sırasında bu, yukarıdaki ön gereksinimler bölümündeki tünelinizin açığa çıkardığı HTTPS URL'si anlamına gelir, yoksa localhost.
register_webhook.py
import requests BASE_URL = "https://{YOUR_DSN}/api/v1" HEADERS = {"X-API-KEY": "YOUR_ACCESS_TOKEN"} response = requests.post( f"{BASE_URL}/webhooks", headers=HEADERS, json={ "source": "messaging", "request_url": "https://your-tunnel.example.com/webhooks/whatsapp", "name": "whatsapp-fastapi", "format": "json", "events": ["message_received"], }, ) response.raise_for_status() print(response.json())
FastAPI'de alın
Unipile'in gönderdiği yük, sohbeti, göndereni ve mesaj metnini düz alanlar olarak ve varsa eklerin bir listesini taşır. Yalnızca ihtiyacınız olanı modelleyin; Pydantic varsayılan olarak fazladan alanları yok sayar.
main.py
from typing import List, Optional from fastapi import BackgroundTasks, FastAPI from pydantic import BaseModel app = FastAPI() class Sender(BaseModel): attendee_id: str attendee_name: Optional[str] = None katılımcı_sağlayıcı_kimliği: str class Attachment(BaseModel): id: str type: str mimetype: Optional[str] = None unavailable: bool = False class WhatsAppMessageEvent(BaseModel): account_id: str account_type: str event: str chat_id: str message_id: str message: Optional[str] = None timestamp: str webhook_name: Optional[str] = None sender: Sender attachments: List[Attachment] = [] def handle_message(event: WhatsAppMessageEvent) -> None: if event.account_type != "WHATSAPP" or event.event != "message_received": return # Unipile, bağlantılı hesabın kendisinin gönderdiği mesajları, # başka bir cihazdan gelenleri veya kendi API çağrılarınızdan gelenleri içerir. Yalnızca karşı taraftan gelen mesajlara # tepki vermek istiyorsanız, göndereni # bağlantı kurulduğunda kaydettiğiniz hesap sahibiyle karşılaştırın. print(f"{event.chat_id} sohbetinde yeni WhatsApp mesajı: {event.message}") # buradan kuyruğunuza, veritabanınıza veya bir AI ajana iletin @app.post("/webhooks/whatsapp") async def whatsapp_webhook( event: WhatsAppMessageEvent, background_tasks: BackgroundTasks, ): background_tasks.add_task(handle_message, event) return {"status": "received"}
Şununla çalıştır: uvicorn main:app --reload, tünelinizi 8000 numaralı bağlantı noktasına yönlendirin ve bu genel URL'yi şu şekilde kaydedin: request_url 1. adıma dönülüyor. {"status": "alındı"} mesaj tamamen işlenmeden önce önemlidir: Unipile hızlı bir yanıt bekler ve Arka Plan Görevleri tutan şeydir mesajı_işle engelleyerek.
Başından beri inşa etmeye değer bir şey daha: işlenen her birini saklayın mesaj_id hareket geçmeden önce ve daha önce gördüğünüz her şeyi atlayın. Bağlı olan WhatsApp hesabının kendisi bağlantıyı kesip yeniden bağlanırsa Unipile, aradaki boşlukta gelen mesajları yetiştiğinde iletir ve yeniden dağıtım veya çök müş bir arka plan görevi, kendi işleyicinizin aynı olayı iki kez görmesine ayrı ayrı neden olabilir, bu yüzden davranmak mesaj_id Bir idempotency key (işlem tekrarını önleyen anahtar), bir WhatsApp botunun aynı mesajı iki kez yanıtlamasını engeller.
Okuyun

Python'da sohbetleri ve mesaj geçmişini nasıl alırsınız?

Unipile API'deki sohbetler, mesajlar, katılımcılar dahil her liste uç noktası aynı şekilde sayfalandırılmıştır: yanıt, bir eşyalar dizi ve bir imleç. Onu uzat imleç sonraki aramada geri dön ve geri döndüğünde dur boş. Python'ın True olduğu sürece döngü doğrudan bu örüntüye karşılık gelir.
Bir hesabın tüm WhatsApp sohbetlerini listele
list_chats.py
import requests BASE_URL = "https://{YOUR_DSN}/api/v1" HEADERS = {"X-API-KEY": "YOUR_ACCESS_TOKEN"} def list_all_whatsapp_chats(account_id: str) -> list: chats = [] cursor = None while True: params = {"account_id": account_id, "limit": 100} if cursor: params["cursor"] = cursor response = requests.get(f"{BASE_URL}/chats", headers=HEADERS, params=params) response.raise_for_status() page = response.json() chats.extend(page["items"]) cursor = page["cursor"] if not cursor: break return chats for chat in list_all_whatsapp_chats("Yk08cDzzdsqs9_8ds"): print(chat["id"], chat["name"], chat["unread_count"])
Bir sohbetin mesaj geçmişini ve katılımcılarını oku
En son mesajlar ilk önce gelir. Aynısını kullan limit ve imleç daha eski geçmişe doğru geriye doğru sayfa sayfa ilerlemek için desen ve bir sohbetin (bireysel veya grup) gerçekte kimlerden oluştuğunu çözmeniz gerektiğinde katılımcılar (attendees) uç noktasını çağırın.
chat_history.py
```python def get_chat_history(chat_id: str, limit: int = 100) -> list: response = requests.get( f"{BASE_URL}/chats/{chat_id}/messages", headers=HEADERS, params={"limit": limit}, ) response.raise_for_status() return response.json()["items"] def get_chat_attendees(chat_id: str) -> list: response = requests.get( f"{BASE_URL}/chats/{chat_id}/attendees", headers=HEADERS, ) response.raise_for_status() return response.json()["items"] messages = get_chat_history("9f9uio56sopa456s") attendees = get_chat_attendees("9f9uio56sopa456s") ```
Bu aynı zamanda bir CRM senkronizasyonunun veya destek gelen kutusunun Python'da aslında çalıştırdığı kod yoludur: yeni bir bağlantıda, her sohbeti şu şekilde bir kez gez: tüm_whatsapp_sohbetlerini_listele veritabanınızı doldurmak için, ardından yeniden yoklama yapmak yerine güncel tutmak için önceki bölümdeki web kancasına güvenin. GET /chats uç nokta ayrıca şunu da kabul eder: okunmamış filtre, böylece yalnızca okunmamış sohbetleri bir programa göre kontrol eden daha hafif bir işin, her çalıştığında tüm hesap geçmişini taramak zorunda kalmaması sağlanır.
WhatsApp grupları da sohbettir, dolayısıyla aynı GET /chats ve GET /chats/{chat_id}/attendees aramalar listesi ve üyelerini Python'dan başka bir kod olmadan listeleyin. Bir katılımcı eklemek veya kaldırmak ya da davet bağlantısını almak için şunu kullanın: PATCH /chats/{chat_id} ile bir Katılımcı ekle, katılımcıyıKaldırveya davetBağlantısı Al Eylem. Tam izlenecek yol, Meta'nın kendi yerel Gruplar API'sindeki katılımcı sınırlarıyla birlikte, şu kılavuzda yer almaktadır: WhatsApp grup katılımcısı ekleyin veya çıkarın.
Otomasyon

Python'da bir WhatsApp botu veya yapay zeka ajanı nasıl oluşturulur?

Her WhatsApp botu veya yapay zeka asistanı aynı üç adımı izler: webhook aracılığıca bir mesaj almak, onunla ne yapılacağına karar vermek ve aynı kanal üzerinden bir yanıt göndermek chat_id. Bir LLM'yi ortaya koyduğunuzda birinci ve üçüncü adımlarla ilgili hiçbir şey değişmez; bu nedenle FastAPI işleyicisi ve mesaj_gönder önceki bölümlerdeki fonksiyonlar zaten ihtiyacınız olan kodun çoğunu oluşturuyor.
agent.py
from openai import OpenAI # veya kullandığınız herhangi bir LLM istemcisi llm = OpenAI() _recent_bot_replies: dict = {} def generate_reply(incoming_text: str) -> str: completion = llm.chat.completions.create( model="gpt-4o-mini", messages=[ {"role": "system", "content": "Yardımsever bir WhatsApp destek temsilcisiniz."}, {"role": "user", "content": incoming_text}, ], ) return completion.choices[0].message.content def handle_message(event: WhatsAppMessageEvent) -> None: if event.account_type != "WHATSAPP" or event.event != "message_received": return if not event.message: return if _recent_bot_replies.get(event.chat_id) == event.message: return # kendi son cevabımızın yankısı, bunu yok say reply_text = generate_reply(event.message) _recent_bot_replies[event.chat_id] = reply_text send_message(event.chat_id, reply_text)
Bu _son_bot_yanitlari muhafaza görünenden daha önemlidir: Unipile'ın message_received olay, başka bir cihazdan veya kendi API çağrılarınızdan bağlanan hesabın gönderdiği mesajlar için de tetiklenir; dolayısıyla bir koruma olmadığında, bir ajan kendi yanıtına yanıt vererek sonlanabilir. Bir demo için sözlük yeterlidir; prodüksiyon seviyesindeki bir ajan, bu durumu konuşma geçmişi ve bir iş yordamsızlık (idempotency) anahtarı ile birlikte Redis veya bir veritabanında tutmalıdır.
Webhook yükü ve mesaj_gönder Arama simgeleri WhatsApp, LinkedIn, Instagram ve Telegram'da yalnızca aynı şekildedir hesap_türü değişiklikler, böylece aynı FastAPI işleyicisi bir ajanın yanıtlarını kullanıcının bağlandığı her kanal üzerinden yönlendirebilir bunu yaparken kanala özel tonu, biçimlendirmeyi ve oran sınırlarını doğru tutmak, şuraya ait kılavuzda ele alınmaktadır: Yapay zeka ajanları için çok kanallı API.
Güvenilirlik

Python'da oran sınırlarını (rate limit) ve yeniden denemeleri (retry) nasıl ele alırsınız?

Unipile, şununla bir JSON gövdesi döndürür: tip alan, gibi hatalar/geçersiz_kimlik_bilgileri veya hatalar/bağlantısı_kesilmiş_hesap, bir istek başarısız olduğunda. Bunların bir kısmı, kopan bir bağlantı veya geçici bir sağlayıcı aksaklığı gibi yeniden denemeye değerdir; hatalı kimlik bilgileri gibi diğerleri ise tekrar kaç kez çağrı yaparsanız yapın kendi kendine düzelmez. Tek bir WhatsApp hesabından ne kadar hızlı ve ne kadar gönderdiğiniz, Unipile'ın üstüne dayattığı sabit bir sayı değil, WhatsApp'ın o hesapta uyguladığı oran sınırları tarafından şekillendirilen bir müşteri tarafı kararı olarak kalır.
Bu azim paketi, elle yazılmış bir döngü yerine bir dekoratöre dönüştürür. Aynı mesaj_gönder üstel geri çekilme ve sınırlı deneme sayısına sahip gönderim bölümünden fonksiyon:
retry.py
# pip install tenacity import requests from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type @retry( stop=stop_after_attempt(5), wait=wait_exponential(multiplier=1, min=2, max=30), retry=retry_if_exception_type(requests.exceptions.HTTPError), ) def send_message_with_retry(chat_id: str, text: str) -> dict: response = requests.post( f"{BASE_URL}/chats/{chat_id}/messages", headers=HEADERS, data={"text": text}, ) response.raise_for_status() return response.json()
Arka plan işi için 2 ila 30 saniye arasında üstel bekleme süreli (exponential backoff) beş deneme makul bir varsayılandır; kullanıcı odaklı bir istek yolunda çalışan herhangi bir şey için deneme sayısını düşürün, çünkü azim aksi takdirde istek, yeniden denenirken açık kalmaya devam edecektir. Aynı dekoratör, eşzamanlılık bölümündeki asenkron sürümü de sarmalar, sadece ekleyin bekliyor nerede azim bunun aracılığıyla destekler AsyncRetrying.
SDK

Resmi bir Unipile Python SDK'sı var mı?

Evet. unipile/unipile-python gerçektir ve aktif olarak sürdürülmektedir; 11 Ağustos 2026 gibi yakın bir tarihte bile bir commit gönderilmiştir. Buna başvurmadan önce bilinmesi gereken iki şey var: henüz PyPI'da yayınlanmamıştır ve bu kılavuz boyunca kullanılan her uç nokta v1 iken, hâlâ beta aşamasında olan Unipile'ın API v2'sini hedeflemektedir.
Aktif olarak sürdürülüyor, yalnızca GitHub
Python 3.9+, pydantic 2.11+
PyPI'da yok, GitHub'dan yükleyin
Hedefler API v2 beta, v1 değil
install_sdk.sh
pip install git+https://github.com/unipile/unipile-python.git
sdk_usage.py
import unipile configuration = unipile.Configuration() configuration.api_key["apiKey"] = "YOUR_ACCESS_TOKEN" api_client = unipile.ApiClient(configuration) messaging_api = unipile.MessagingApi(api_client)
Bu kılavuzun bugün kapsadığı her şey için, v1 REST uç noktalarının üzerine şu şekilde geliştirme yapın: istekleri veya httpxbunlar kararlıdır, belgelenmiştir ve yukarıdaki her kod örneğinin aslında üzerinde çalıştığı şeylerdir. Python SDK'sı betadan çıkıp PyPI'a yüklendiğinde, geçiş yapmak çoğunlukla HTTP çağrılarını tiplendirilmiş istemci metotlarıyla değiştirmek anlamına gelecektir; uç noktalar ve altındaki bağlı hesap modeli değişmez. Karşılaştırma yapmak gerekirse, Node.js SDK'sı şu anda Unipile'ın ana belgelendirme dizini boyunca referans verilen SDK'dır ve daha eski olan PHP SDK'sı Ekim 2023'ten beri arşivlenmiştir.
Başka bir kanal için aynı tür entegrasyonu mu kuruyorsunuz? Python ile Instagram API kılavuz, bu makalede gösterilen aynı bağlan, gönder, al ve webhook modelini izler.

Python ile WhatsApp API: SSS

Python ile WhatsApp API oluşturmak için kütüphaneler, bağlantı, SDK'lar ve webhook'lar hakkında net yanıtlar.

Tek bir en iyi kütüphane yoktur, bu halihazırda sahip olduğunuz şeylere bağlıdır. Zaten Meta'nın Cloud API'sinde onaylandıysanız, whatsapp-bulut-api'si size bunun etrafında Python tabanlı bir sarmalayıcı (wrapper) sunar. Meta İşletme doğrulamasını tamamen atlamak ve bunun yerine kullanıcılarınız adına WhatsApp hesaplarını bağlamak istiyorsanız, Unipile'ın REST API'si şu şekilde çağrılır: istekleri veya httpx WhatsApp'ı LinkedIn, Instagram ve Telegram ile birlikte tek bir arayüzden kapsar. pywhatkit erken aşamada elenmesinde fayda var: sunucu taraflı bir API değil, tarayıcıda WhatsApp Web'i çalıştırır, bu nedenle üretime (production) yönelik bir arka uç (backend) için uygun değildir.
Bir tane gönder POSTA -e talep /api/v1/sohbetler/{sohbet_kimliği}/mesajlar with a text alan ve senin X-API-ANAHTAR başlık, örneğin requests.post(url, headers=headers, data={"text": "Hello"}). Eğer bir tane yoksa chat_id henüz, POST /api/v1/chats ile bir account_id ve alıcının attendees_ids sohbeti oluşturur ve ilk mesajı aynı çağrıda gönderir.
Evet. Unipile üzerinden bir WhatsApp hesabını bağlamak, hesab sahibinin yalnızca bir QR kod taramasını veya WhatsApp Web'in çalıştığı şekilde bir eşleştirme kodu girmesini gerektirir. Meta Business Platform uygulaması yoktur ve Meta ile telefon numarası doğrulaması gerekmez, çünkü entegrasyon şu şekilde çalışır: kimliği doğrulanmış kullanıcı adına kayıtlı bir WhatsApp Business numarası üzerinden değil.
Evet, unipile/unipile-python aktif olarak bakımı yapılan resmi bir SDK'dır, ancak henüz PyPI'da değildir: şunu kullanarak kurun: pip install git+https://github.com/unipile/unipile-python.git. Ayrıca beta aşamasında olan Unipile'ın API v2'sini de hedeflemektedir, oysa bu kılavuzdaki her uç nokta kararlı v1 API'sini kullanmaktadır, bu nedenle günümüzdeki Python entegrasyonlarının çoğu hala doğrudan şu temel üzerine kurulmaktadır: istekleri veya httpx SDK yerine.
istekleri komut dosyaları, cron işleri ve düşük hacimli gönderimler için daha basit ve yeterlidir. httpx Çok sayıda alıcıya aynı anda gönderim yaparken veya asenkron bir FastAPI servisi inşa ederken geçiş yapmaya değer, çünkü bu AsyncClient Her birinde engellenmek yerine, aynı olay döngüsünden eş zamanlı olarak birden fazla istek göndermenizi sağlar.
Bir FastAPI uygulamasını yerel olarak çalıştırın, bunu şu şekilde bir tünel ile dışarı açın: ngrok veya cloudflared genel bir HTTPS URL'si almak ve bu URL'yi şu şekilde kaydetmek request_url ile bir webhook oluşturduğunuzda kaynak ayarla mesajlaşma. Unipile, siz geliştirme yaparken yeni gelen her mesajı doğrudan yerel FastAPI rotanıza ileten o tünel URL'sine gönderir.
Evet. WhatsApp grupları normal sohbetler olarak görünür, bu yüzden GET /chats ve GET /chats/{chat_id}/attendees bunları ve üyelerini özel durum olmaksızın listeleyin. Bir katılımcı eklemek, birini çıkarmak veya grup davet bağlantısını almak için şunları gönderin: PATCH /chats/{chat_id} ile talep et Katılımcı ekle, katılımcıyıKaldırveya davetBağlantısı Al rehberde ayrıntılı olarak açıklanan eylem WhatsApp grup üyelerini ekleme ve çıkarma.
Temel uç noktalar aynıdır, fark çalışma zamanı ve ekosistemindedir: Python şunları destekler: istekleri veya httpx ile asyncio eşzamanlılık için ve web kancaları için FastAPI kullanılırken, PHP entegrasyonları tipik olarak Guzzle kullanır ve kuyruğa alınmış işlerle bir Laravel uygulamasına uyum sağlar. Yığınınız PHP ise, Aynı entegrasyon PHP dilinde her bir eşdeğer adımdan geçer.

Hala sorularınız mı var? Ekibimiz yardım etmek için burada.

Bir uzmanla konuşun
tr_TRTR