Partea 1: Dacă nu aveți timp să citiți
Acest exemplu de implementare a botului detaliază în profunzime cele mai frecvent utilizate funcționalități. Acest lucru vă va permite să adaptați codul sursă la sarcinile și nevoile dvs., sau să-l luați ca bază pentru a crea orice altă integrare. Am lăsat comentarii lângă fiecare funcție pentru a vă facilita înțelegerea codului. În codul sursă al botului veți găsi următoarele funcționalități:
- Răspunde la o comandă necunoscută, aceasta ar putea fi o instrucțiune sau mesajul dvs. de bun venit;
- Trimiteți mesaj obișnuit;
- Trimiteți imagine;
- Trimiteți fișier;
- Trimiteți videoclip;
- Trimiteți contact (vCard);
- Trimiteți produs;
- Creați un grup nou, trimiteți o invitație și trimiteți mesaj în grup;
- Primiți și citiți mesajele primite;
Pentru funcționarea botului, NU ESTE NECESAR ca telefonul să fie pornit sau online. Conectați numărul și testați integrarea confortabil!
Și dacă aveți nevoie de ajutor, scrieți-ne în chatul de suport de pe orice pagină a site-ului.
Dacă vă decideți ce furnizor să alegeți sau dacă nu înțelegeți pe deplin diferența dintre WhatsApp Business API și WhatsApp API, vă va fi util să studiați ghidul nostru în care vom compara furnizorii, funcționalitatea, prețurile și soluțiile actuale. Acest lucru va fi util pentru toată lumea pentru a decide ce API și ce furnizor să aleagă. Așadar, scufundați-vă în articolul nostru "Cum să alegeți WhatsApp API. Comparație."
Și dacă aveți nevoie de ajutor, scrieți-ne în chatul de suport de pe orice pagină a site-ului.
Dacă vă decideți ce furnizor să alegeți sau dacă nu înțelegeți pe deplin diferența dintre WhatsApp Business API și WhatsApp API, vă va fi util să studiați ghidul nostru în care vom compara furnizorii, funcționalitatea, prețurile și soluțiile actuale. Acest lucru va fi util pentru toată lumea pentru a decide ce API și ce furnizor să aleagă. Așadar, scufundați-vă în articolul nostru "Cum să alegeți WhatsApp API. Comparație."
Partea a 2a: Automatizarea WhatsApp folosind Python
WhatsApp nu este doar un mesager pentru comunicare, ci și un instrument puternic pentru afaceri. Capacitatea de a automatiza interacțiunea cu clienții prin intermediul chatbot-urilor devine din ce în ce mai relevantă. Alegerea Python pentru această sarcină se datorează flexibilității sale și uneltelor puternice de dezvoltare, iar Whapi.Cloud permite automatizarea aproape oricărei funcții WhatsApp.
În acest ghid, vom examina:
- Interacțiunea cu WhatsApp API folosind Python;
- Integrarea cu Whapi.Cloud și automatizarea oricărei funcționalități;
- Utilizarea Flask pentru procesarea mesajelor primite și răspunsul la ele;
Pregătirea pentru dezvoltare
Înainte de a începe dezvoltarea chatbot-ului, să ne asigurăm că avem tot ce ne trebuie.
- Instalarea Python. Dacă nu ați instalat încă Python, vizitați site-ul oficial Python și urmați instrucțiunile de instalare. Recomandăm utilizarea versiunii Python 3.6 sau mai recente.
- Token de la Whapi.Cloud WhatsApp API. Veți avea nevoie de un cont Whapi.Cloud pentru a obține un token care vă va permite botului dvs. să interacționeze cu WhatsApp prin API. După înregistrare, veți primi un canal gratuit cu un token unic. În prezent, Whapi.Cloud este cel mai funcțional și stabil furnizor care oferă acces la un preț accesibil la API-ul WhatsApp.
- Instalarea Flask. Flask este un cadru web ușor în Python pe care îl vom folosi pentru a seta serverul nostru și a procesa webhook-urile din WhatsApp. Puteți instala Flask cu comanda următoare: pip install Flask
- Configurarea webhook-ului. Pentru ca serverul dvs. să poată primi mesaje și evenimente de la WhatsApp, va trebui să configurați un webhook. Pe Whapi.Cloud, veți putea indica mai multe hook-uri (URL-urile serverului dvs.) pentru diferite evenimente, unde vor fi trimise notificări. Vom discuta despre această temă mai în detaliu mai târziu în articol.
- Mediul de lucru. Se recomandă utilizarea unui mediu virtual (de exemplu, virtualenv) pentru a izola dependențele și pentru a asigura portabilitatea proiectului dvs.
Integrarea cu WhatsApp API prin Whapi.Cloud în Python
Înregistrați-vă la serviciu. Acest pas este simplu și nu necesită date de card de credit. După înregistrare, veți avea 5 zile de acces complet la API, suficient pentru a testa toate metodele și funcțiile. Dacă acest lucru nu este suficient, contactați asistența serviciului prin widgetul de chat live și vă vor elimina restricțiile pentru un test confortabil.
Următorul pas va fi conectarea numărului dvs. de WhatsApp. Nu vă faceți griji, vă puteți deconecta în orice moment, dar acest lucru este necesar pentru testarea automatizării. Pentru a vă conecta, accesați panoul dvs. de control pe pagina canalului Default Channel, care a fost deja creat pentru dvs. La primul pas, veți găsi un cod QR cu instrucțiuni. Deschideți-vă WhatsApp pe dispozitivul dvs. mobil, mergeți la Setări -> Dispozitive asociate -> Conectați dispozitivul -> Scanați codul QR.
În timpul conectării, la pașii doi și trei, veți avea ocazia să vă configurați canalul. Dați un nume canalului pentru comoditate (apropo, API-ul nostru va detecta imediat dacă folosiți versiunea standard sau versiunea de afaceri a aplicației cu funcții extinse). Ulterior, vor fi disponibile setările pentru webhook și alți parametri la alegerea dvs. Cu toate acestea, aceste acțiuni pot fi realizate mai târziu și puteți omite acest pas. După activarea canalului, în secțiunea despre limite, găsiți tokenul dvs. API. Acest token este esențial pentru autentificare când accesați API-ul. De obicei, este trimis în antetele solicitărilor ca un Bearer Token sau ca un parametru, în funcție de modul în care accesați API-ul. API-ul Whapi.Cloud oferă multe metode pentru a interacționa cu WhatsApp, permițându-vă cu adevărat să automatizați caracteristicile și funcțiile principale ale mesagerului. Pe pagina canalului, puteți studia și testa toate metodele disponibile. Pentru a vă facilita dezvoltarea, vi se oferă un hub specializat pentru dezvoltatori, unde fiecare funcție este însoțită de exemple de cod și posibilitatea de a testa în loc, arătând rezultatele și răspunsurile de la server. Acest lucru simplifică și accelerează foarte mult procesul de integrare, vă va plăcea! Unul dintre avantajele Whapi.Cloud este simplitatea și rapiditatea de conectare, permițându-vă să începeți să interacționați cu WhatsApp în doar câteva minute.
Ce este Webhook și cum îl setez?
Botul dvs. WhatsApp și gateway-ul nostru API trebuie să comunice, astfel încât atunci când ceva se schimbă într-un sistem, celălalt sistem să știe despre asta. De exemplu, urmărirea modificărilor de stare ale mesajelor, cum ar fi "trimis", "livrat" și "citit".
Aici intervine webhook-ul! Un webhook corespunzător configurat permite serverului dvs. să afle imediat despre anumite evenimente. În funcție de setările dvs., puteți primi notificări despre mesaje, starea lor, starea canalului, telefonul și chiar apelurile ratate. Unul dintre avantajele Whapi.Cloud este capacitatea de a configura și gestiona hook-uri în mod flexibil și automat în funcție de dorințele dvs., iar multe setări suplimentare vă vor facilita munca.
Am explorat toate nuanțele lucrului cu webhook-uri în mai multe detalii în baza noastră de cunoștințe: Vizualizați articolul despre webhook-uri
Accesați setările canalului dvs. (butonul din dreapta sus). Primul bloc este secțiunea de webhooks. Specificați URL-ul serverului dvs., unde vor fi trimise notificările. Adăugați alte hook-uri, dacă este necesar. La primirea unui mesaj pe URL-ul configurat, se va trimite o solicitare POST cu datele mesajului, permițând botului dvs. să proceseze mesajele primite și să răspundă în consecință. Vom afla cum să procesăm aceste date mai târziu.
Crearea bazei Botului WhatsApp în Python
În acest capitol, vom vedea cum să folosim API-ul Whapi.Cloud cu ajutorul Python. Acest lucru ne va permite să trimitem, să primim și să gestionăm mesaje în WhatsApp.
Trimite mesaj WhatsApp folosind Python
Hai să începem cu ceva simplu - să trimitem un mesaj text.
import requests
url = "https://gate.whapi.cloud/messages/text?token=bg3FeZJ6jWGw32g03PRnoNkKO7k03GtX"
payload = {
"typing_time": 0,
"to": "[email protected]",
"body": "Hello, world!"
}
headers = {
"accept": "application/json",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
Recepționarea mesajelor prin Flask Webhook
Pentru a primi mesaje, trebuie să configurați o rută Flask care va acționa ca un punct final pentru webhook. Nu uitați să actualizați URL-ul webhook-ului pe Whapi.Cloud cu URL-ul final pe care l-ați creat. În acest exemplu, acesta va fi http://your_domain_or_ip/webhook.
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/webhook', methods=['POST'])
def whatsapp_webhook():
incoming_message = request.json
# Process the message here
return jsonify(status='success'), 200
Webhook-urile pot fi configurate atât prin intermediul interfeței din panoul utilizatorului, cât și programatic prin API. Mai jos este prezentat un fragment Python pentru configurare prin API:
import requests
url = "https://gate.whapi.cloud/settings?token=YOUR_TOKEN"
payload = {
"callback_persist": True,
"webhooks": [
{
"events": [
{
"type": "messages",
"method": "post"
},
{
"type": "ack",
"method": "post"
}
],
"mode": "body",
"url": "Webhook URL, http or https"
}
]
}
headers = {
"accept": "application/json",
"content-type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)
Codul sursă WhatsApp bot în Python
Mai jos este prezentată o aplicație Flask simplă care folosește scriptul Python furnizat pentru a trimite mesaje prin API-ul Whapi.Cloud. Aceasta ascultă mesajele primite și trimite răspunsuri corespunzătoare pe baza conținutului. Creați un fișier .env cu setările de configurare pre-salvate.
TOKEN=Your_token # API token from your channel
API_URL=https://gate.whapi.cloud # API endpoint URL
BOT_URL=https://your_bot_url_here/messages # Webhook Link to your server. At ( {server link}/messages ), when POST is requested, processing occurs
PRODUCT_ID=6559353560856703 # The ID of the product we will send for the example. Create a product in your WhatsApp and find out the product ID: https://whapi.readme.io/reference/getproducts
[email protected] # The ID of the group to which we will send the message. Use to find out the ID: https://whapi.readme.io/reference/getgroups
PORT=80 # example, 80 or 443
Vă reamintim că întregul cod sursă al acestui proiect poate fi descărcat de pe GitHub: https://github.com/Whapi-Cloud/python-whatsapp-chatbot
from flask import Flask, request, jsonify
import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder
import os
from dotenv import load_dotenv
load_dotenv() # Load environment variables from a .env file
app = Flask(__name__)
COMMANDS = {
'TEXT': 'Simple text message',
'IMAGE': 'Send image',
'DOCUMENT': 'Send document',
'VIDEO': 'Send video',
'CONTACT': 'Send contact',
'PRODUCT': 'Send product',
'GROUP_CREATE': 'Create group',
'GROUP_TEXT': 'Simple text message for the group',
'GROUPS_IDS': "Get the id's of your three groups"
}
FILES = {
'IMAGE': './files/file_example_JPG_100kB.jpg',
'DOCUMENT': './files/file-example_PDF_500_kB.pdf',
'VIDEO': './files/file_example_MP4_480_1_5MG.mp4',
'VCARD': './files/sample-vcard.txt'
}
def send_whapi_request(endpoint, params=None, method='POST'):
headers = {
'Authorization': f"Bearer {os.getenv('TOKEN')}"
}
url = f"{os.getenv('API_URL')}/{endpoint}"
if params:
if 'media' in params:
details = params.pop('media').split(';')
with open(details[0], 'rb') as file:
m = MultipartEncoder(fields={**params, 'media': (details[0], file, details[1])})
headers['Content-Type'] = m.content_type
response = requests.request(method, url, data=m, headers=headers)
elif method == 'GET':
response = requests.get(url, params=params, headers=headers)
else:
headers['Content-Type'] = 'application/json'
response = requests.request(method, url, json=params, headers=headers)
else:
response = requests.request(method, url, headers=headers)
print('Whapi response:', response.json())
return response.json()
def set_hook():
if os.getenv('BOT_URL'):
settings = {
'webhooks': [
{
'url': os.getenv('BOT_URL'),
'events': [
{'type': "messages", 'method': "post"}
],
'mode': "method"
}
]
}
send_whapi_request('settings', settings, 'PATCH')
@app.route('/messages', methods=['POST'])
def handle_new_messages():
try:
messages = request.json.get('messages', [])
endpoint = None
for message in messages:
if message.get('from_me'):
continue
sender = {'to': message.get('chat_id')}
command_input = message.get('text', {}).get('body', '').strip()
command = list(COMMANDS.keys())[int(command_input) - 1] if command_input.isdigit() else None
if command == 'TEXT':
sender['body'] = 'Simple text message'
endpoint = 'messages/text'
elif command == 'IMAGE':
sender['caption'] = 'Text under the photo.'
sender['media'] = FILES['IMAGE'] + ';image/jpeg'
endpoint = 'messages/image'
elif command == 'DOCUMENT':
sender['caption'] = 'Text under the document.'
sender['media'] = FILES['DOCUMENT'] + ';application/pdf'
endpoint = 'messages/document'
elif command == 'VIDEO':
sender['caption'] = 'Text under the video.'
sender['media'] = FILES['VIDEO'] + ';video/mp4'
endpoint = 'messages/video'
elif command == 'CONTACT':
sender['name'] = 'Whapi Test'
with open(FILES['VCARD'], 'r') as vcard_file:
sender['vcard'] = vcard_file.read()
endpoint = 'messages/contact'
elif command == 'PRODUCT':
# Example: You need to replace config.product with an actual product ID
product_id = os.getenv('PRODUCT_ID') # Replace with your product ID
endpoint = f'business/products/{product_id}'
elif command == 'GROUP_CREATE':
# Example: You need to replace config.phone with an actual phone number
participants = [message.get('chat_id').split('@')[0]] # Replace with the phone number
response = send_whapi_request('groups', {'subject': 'Whapi.Cloud Test', 'participants': participants})
sender['body'] = f"Group created. Group id: {response.get('group_id')}" if response.get('group_id') else 'Error'
endpoint = 'messages/text'
elif command == 'GROUP_TEXT':
sender['to'] = os.getenv('GROUP_ID') # Replace with your group ID
sender['body'] = 'Simple text message for the group'
endpoint = 'messages/text'
elif command == 'GROUPS_IDS':
groups_response = send_whapi_request('groups', {'count': 3}, 'GET')
groups = groups_response.get('groups', [])
sender['body'] = ',\n '.join(f"{group['id']} - {group['name']}" for group in groups) if groups else 'No groups'
endpoint = 'messages/text'
else:
sender['body'] = "Hi. Send me a number from the list. Don't forget to change the actual data in the code!\n\n" + \
'\n'.join(f"{i + 1}. {text}" for i, text in enumerate(COMMANDS.values()))
endpoint = 'messages/text'
if endpoint is None:
return 'Ok', 200
response = send_whapi_request(endpoint, sender)
print(f"Response from Whapi: {response}")
return 'Ok', 200
except Exception as e:
print(e)
return str(e), 500
@app.route('/', methods=['GET'])
def index():
return 'Bot is running'
if __name__ == '__main__':
set_hook()
port = os.getenv('PORT') or (443 if os.getenv('BOT_URL', '').startswith('https:') else 80)
app.run(port=port, debug=True)
Pentru ca aceasta să funcționeze: 1. Rulați aplicația Flask. 2. Configurați canalul dvs. WhatsApp pentru a primi mesaje pe webhook dvs. 3. Încercați să trimiteți mesajul "hello" botului dvs. WhatsApp și vedeți cum răspunde.
Deoarece răspunsurile sunt în format JSON, puteți extinde cu ușurință capacitățile botului dvs. De exemplu, puteți include informații suplimentare în răspuns, luând în considerare marca de timp a livrării sau starea actuală a destinatarului (online, offline, etc.), botul dvs. poate fi adaptat cu ușurință pentru a utiliza aceste date. În documentație și în Hub-ul pentru dezvoltatori, am inclus detalii complete despre ce răspuns și cu ce parametri trebuie să vă așteptați la orice cerere. Lista tuturor parametrilor este disponibilă în documentație. Utilizați aceste date pentru a extinde funcționalitatea dvs.
Capabilități avansate
În documentația noastră detaliată veți găsi instrucțiuni pas cu pas și exemple de utilizare a metodelor care vă permit să trimiteți diferite conținuturi, de la fișiere de orice format, locații și contacte, la autocolante, sondaje și produse. De asemenea, puteți interacționa dinamic cu mesajele (reacționând cu emoji), citându-le, marcându-le ca citite, fixând conversații, ștergând sau setând starea scrie în răspuns.
Whapi.Cloud oferă într-adevăr o gamă largă de funcționalități atunci când lucrează cu automatizarea grupurilor. Puteți crea/șterge grupuri automat, adăuga membri, obține informații despre grupuri și membrii lor, desemna administratori, modifica orice setări ale grupului, genera linkuri de invitație, bloca utilizatori, etc. Toate metodele sunt descrise în documentația Whapi.Cloud.
Având o asemenea varietate de posibilități, crearea unui bot care să corespundă oricărui nivel de complexitate și scop devine o sarcină ușoară. Integrați botul dvs. PHP pe orice platformă, fie că este un site web, o aplicație, CRM, sistem ERP și multe altele.
Trimiteți un mesaj cu o imagine media
Îmbunătățirea interacțiunii utilizatorilor cu botul dvs. WhatsApp devine mult mai ușoară atunci când includeți mesaje media. Trimițând imagini, nu numai că faceți comunicarea mai bogată și interactivă, dar oferiți și companiilor oportunitatea de a-și demonstra vizual produsele sau mesajele. Acest lucru îmbogățește semnificativ experiența de comunicare, depășind limitările interacțiunii doar prin text. Să vedem cum să trimiteți o imagine prin API-ul WhatsApp folosind Python:
import requests
url = "https://gate.whapi.cloud/messages/image?token=bg3FeZJ6jWGw32g03PRnoNkKO7k03GtX"
payload = {
"to": "[email protected]",
"media": "data:image/png;name=android-chrome-192x192.png;base64,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"
}
headers = {
"accept": "application/json",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
Trimiteți un fișier prin API-ul WhatsApp
Cu botul pentru WhatsApp, distribuția de fișiere devine un proces fără cusur, oferind utilizatorilor un mod rapid și sigur de a împărtăși documente importante. Integrând această funcție, îmbogățiți experiența utilizatorului, oferind diverse modalități de comunicare, depășind limitele simplului text și vizual. Să examinăm cum să trimiteți un fișier prin API-ul WhatsApp folosind Python:
import requests
url = "https://gate.whapi.cloud/messages/document?token=bg3FeZJ6jWGw32g03PRnoNkKO7k03GtX"
payload = {
"to": "[email protected]",
"media": "data:application/octet-stream;name=site.webmanifest;base64,ewogICAgIm5hbWUiOiAiIiwKICAgICJzaG9ydF9uYW1lIjogIiIsCiAgICAiaWNvbnMiOiBbCiAgICAgICAgewogICAgICAgICAgICAic3JjIjogIi9hbmRyb2lkLWNocm9tZS0xOTJ4MTkyLnBuZyIsCiAgICAgICAgICAgICJzaXplcyI6ICIxOTJ4MTkyIiwKICAgICAgICAgICAgInR5cGUiOiAiaW1hZ2UvcG5nIgogICAgICAgIH0KICAgIF0sCiAgICAidGhlbWVfY29sb3IiOiAiI2ZmZmZmZiIsCiAgICAiYmFja2dyb3VuZF9jb2xvciI6ICIjZmZmZmZmIiwKICAgICJkaXNwbGF5IjogInN0YW5kYWxvbmUiCn0K"
}
headers = {
"accept": "application/json",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
Concluzie și recomandări
După ce ați configurat botul și v-ați asigurat că funcționează corect local, îl puteți implementa. Deși Flask este perfect pentru dezvoltare, luați în considerare posibilitatea de a-l implementa pe platforme precum Gunicorn sau uWSGI pentru un mediu de producție. Când botul dvs. este activ, acesta va răspunde la fiecare mesaj primit pe WhatsApp.
Datorită ecosistemului extins de biblioteci Python, există întotdeauna loc pentru îmbunătățiri. Puteți integra procesarea limbajului natural (NLP) pentru interacțiuni inteligente, conecta baze de date pentru stocare persistentă sau chiar implementa capacități de trimitere programată a mesajelor.
Crearea unui bot pentru WhatsApp folosind Python și conectarea acestuia la Whapi.Cloud simplifică procesul de schimb de mesaje. Acest ghid arată că, pas cu pas, oricine, chiar și fără cunoștințe speciale în Python sau API, poate face acest lucru.
Acest bot a fost dezvoltat pe principiul "plug-and-play". A începe este foarte simplu. Mai întâi, trebuie să vă înregistrați la serviciul nostru. Oferim o versiune de încercare gratuită, permițându-vă să testați toate funcțiile înainte de a decide să cumpărați. După înregistrare, încărcați codul botului pe serverul dvs. Urmand instrucțiunile din acest articol, botul dvs. va fi funcțional în cel mai scurt timp.
Amintiți-vă, dacă întâmpinați întrebări sau probleme pe parcurs, serviciul nostru de asistență este întotdeauna gata să ajute. Prețuim fiecare utilizator și ne străduim să ne asigurăm că experiența dvs. cu API-ul nostru este cât mai lină și eficientă.