- whatsapp-chatbot-python 0.5.3
- Навигация
- Ссылки проекта
- Статистика
- Метаданные
- Сопровождающие
- Классификаторы
- Описание проекта
- whatsapp-chatbot-python
- API
- Authorization
- Installation
- Import
- Examples
- How to initialize an object
- How to start receiving and answering messages
- How to receive other notifications and handle the notification body
- How to filter incoming messages
- How to add filters through the decorator
- How to add filters with the function
- How to filter messages by chat, sender, or message type
- How to filter messages by message text or regular expressions
- How to filter messages by command
- Example
- How to handle buttons
- How to manage user state
- python-whatsapp-bot
- Features supported
- Getting started
- Setting up
- Initialization
- Sending Messages
- For buttons
- A short note about Webhooks
- Issues
- Contributing
- References
- All the credit
whatsapp-chatbot-python 0.5.3
This library helps you easily create a Python chatbot with WhatsApp API.
Навигация
Ссылки проекта
Статистика
Метаданные
Лицензия: Other/Proprietary License (Creative Commons Attribution-NoDerivatives 4.0 International (CC BY-ND 4.0))
Требует: Python >=3.7
Сопровождающие
Классификаторы
Описание проекта
whatsapp-chatbot-python
whatsapp-chatbot-python is a library for integration with WhatsApp messenger using the API service green-api.com. You should get a registration token and an account ID in your personal cabinet to use the library. There is a free developer account tariff.
API
The documentation for the REST API can be found at the link. The library is a wrapper for the REST API, so the documentation at the link above also applies.
Authorization
To send a message or perform other Green API methods, the WhatsApp account in the phone app must be authorized. To authorize the account, go to your cabinet and scan the QR code using the WhatsApp app.
Installation
python -m pip install whatsapp-chatbot-python
Import
from whatsapp_chatbot_python import GreenAPIBot, Notification
Examples
How to initialize an object
bot = GreenAPIBot( "1101000001", "d75b3a66374942c5b3c019c698abc2067e151558acbd412345" )
How to start receiving and answering messages
To start receiving messages, you must create a handler function with one parameter ( notification ). The notification parameter is the class where the notification object ( event ) and the functions to answer the message are stored. To send a text message in response to a notification, you need to call the notification.answer function and pass there the text of the message. You don’t need to pass the chatId parameter because it is automatically taken from the notification.
Next, you need to add the handler function to the list of handlers. This can be done with the bot.router.message decorator as in the example or with the bot.router.message.add_handler function. The decorator must be called with brackets.
To start the bot, call the bot.run_forever function. You can stop the bot with the key combination Ctrl + C.
@bot.router.message(text_message="message") def message_handler(notification: Notification) -> None: notification.answer("Hello") bot.run_forever()
How to receive other notifications and handle the notification body
You can receive not only incoming messages but also outgoing messages. You can also get the status of the sent message.
- To receive outgoing messages, you need to use the bot.router.outgoing_message object;
- To receive outgoing API messages, you need to use the bot.router.outgoing_api_message object;
- To receive the status of sent messages, you need to use the bot.router.outgoing_message_status object.
The body of the notification is in notification.event . In this example, we get the message type from the notification body.
@bot.router.message() def message_handler(notification: Notification) -> None: print(notification.event) bot.run_forever()
How to filter incoming messages
Messages can be filtered by chat, sender, message type, and text. To filter chat, sender, and message type, you can use a string ( str ) or a list of strings ( list[str] ). The message text can be filtered by text, command, and regular expressions. Below is a table with filter names and possible values.
Filter name | Description | Possible values |
---|---|---|
from_chat | Chats or chats from which you want to receive messages | «11001234567@c.us» or [«11001234567@c.us», «11002345678@c.us»] |
from_sender | The sender or senders from whom you want to receive messages | «11001234567@c.us» or [«11001234567@c.us», «11002345678@c.us»] |
type_message | The type or types of message to be handled | «textMessage» or [«textMessage», «extendedTextMessage»] |
text_message | Your function will be executed if the text fully matches the text | «Hello. I need help.» or [«Hello», «I need help»] |
regexp | Your function will be executed if the text matches the regular expression pattern | r»Hello. I need help.» |
command | Your function will be executed if the prefix and the command match your values completely | «help» or («help», «!/») |
How to add filters through the decorator
@bot.router.message(command="command")
How to add filters with the function
bot.router.message.add_handler(handler, command="command")
How to filter messages by chat, sender, or message type
To filter messages by chat, sender, or message type, you must add a string ( str ) or a list of strings ( list[str] ).
from_chat = "11001234567@c.us"
from_sender = "11001234567@c.us"
type_message = ["textMessage", "extendedTextMessage"]
How to filter messages by message text or regular expressions
You must add a string ( str ) to filter messages by text or regular expressions.
text_message = "Hello. I need help."
regexp = r"Hello. I need help."
How to filter messages by command
Add a string ( str ) or a tuple ( tuple ) to filter messages by command. You need to specify either a command name or a command name and a prefix string. The default prefix is / .
Example
@bot.router.message(command="rates") def message_handler(notification: Notification) -> None: notification.answer_with_file(file="data/rates.png") bot.run_forever()
How to handle buttons
To be notified when a button is pressed, you must use the bot.router.buttons object.
@bot.router.buttons() def buttons_handler(notification: Notification) -> None: notification.answer_buttons("Choose a color", [ < "buttonId": 1, "buttonText": "Red" >, < "buttonId": 2, "buttonText": "Green" >, < "buttonId": 3, "buttonText": "Blue" >]) bot.run_forever()
How to manage user state
As an example, a bot was created for user registration.
To manage user states, we need to create states. Import the BaseStates class and inherit from it. To manage the state we need to use notification.state_manager . The manager has methods for getting, setting, updating and deleting state. You also have the option to save the user’s data in his state.
Manager’s method | Description |
---|---|
get_state | Returns a state class with state name and user data |
set_state | Sets the state for the user. If the state exists then the data will be deleted |
update_state | If a state exists, it changes it. If not, it creates a new state |
delete_state | Deletes the user’s state. Remember to get the data before deleting |
get_state_data | If the state exists, it returns the data in the form of a dictionary (dict) |
set_state_data | If the state exists, it changes the data to the new data |
update_state_data | If the state exists, it updates the data. If no data exists, the data will be created |
delete_state_data | If the state exists, it deletes the data |
The first argument is the sender ID. It can be found by calling notification.sender .
As an example, a bot was created to support the GREEN API. Command list:
- start (the bot says hello and sends a list of commands)
- 1 or Report a problem (the bot will send a link to GitHub to create the bug)
- 2 or Show office address (the bot will send the office address as a map)
- 3 or Show available rates (the bot will send a picture of the rates)
- 4 or Call a support operator (the bot will send a text message)
To send a text message, you have to use the notification.answer method. To send a location, you have to use the sending.sendLocation method from notification.api . To send a message with a file, you have to use the notification.answer_with_file method.
python-whatsapp-bot
A whatsapp client library for python utilizing the WhatsApp Business Cloud API.
Features supported
Getting started
To start, install with pip:
pip3 install --upgrade python-whatsapp-bot
Setting up
To get started using this library, you have to obtain a TOKEN and PHONE NUMBER ID from Facebook Developer Portal. You get these after setting up a developer account and setting up an app.
If you followed the tutorial, you should now have a TOKEN and TEST WHATSAPP NUMBER and its phone_number_id.activeYou might have even already sent your first message on the platform using the provided curl request.
Now you have all you need to start using this library. Note: The given token is temporary. This tutorial on the platform guides you to create a permanent token. This guide shows how to register an authentic phone number.
Initialization
To initialize the app instance, you need to specify the TOKEN and phone_number_id you obtained from the steps above. Note that phone number id is not phone number.
Once initialized, you can start using some of the bot's features right away.
Sending Messages
For buttons and lists, use the same send_message endpoint but with a reply_markup parameter. e.g
For buttons
To send a pre-approved template message:
A short note about Webhooks
For every message sent to your bot business account, whatsapp sends an object containing the message as a post request to a url which you have to provide beforehand. The url you provide should be able to process simple get and post requests. This url is the webhook url, and the object whatsapp sends to your url is the webhook.
Now, you can write a small server with the Python Flask library to handle the webhook requests, but another problem arises if you’re developing on a local server; whatsapp will not be able to send requests to your localhost url, so a quick fix would be to deploy your project to an online server each time you make a change to be able to test it. Once deployed, you can proceed to register the url of your deployed app using this tutorial from the platform.
If you’re like me however, you wouldn’t want to always deploy before you test, you want to run everything on local first. In this case, you might decide to use Ngrok to tunnel a live url to your local server, but another issue arises; Since Ngrok generates a new url each time it is restarted, you’d have to constantly log in to facebook servers to register the newly generated url. I presume you don’t want that hassle either. In this situation, a webhook forwarder can be deployed to a virtual server like Heroku, and it doesn’t get modified. You register the deployed forwarder’s url on Whatsapp servers, it receives all the webhook requests and forwards them to your local machine using ngrok.
To continue with this fowarding process, open this repository https://github.com/Radi-dev/webhook-forwarder and follow the readme instructions to deploy it and setup a client for it on your device, then register the url following this guide.
Issues
Please open an issue to draw my attention to mistake or suggestion
Contributing
This is an opensource project under MIT License so anyone is welcome to contribute from typo, to source code to documentation, JUST FORK IT .