• Stars
    star
    441
  • Rank 98,861 (Top 2 %)
  • Language
    Python
  • License
    MIT License
  • Created over 2 years ago
  • Updated 7 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Opensource python wrapper to WhatsApp Cloud API

heyoo

Made in Tanzania Downloads Downloads Downloads

Unofficial Python wrapper for the WhatsApp Cloud API

Supported features

  1. Sending messages
  2. Marking messages as read
  3. Sending Media (images, audio, video and documents)
  4. Sending location
  5. Sending interactive buttons
  6. Sending template messages
  7. Parsing messages and media received

Getting started

To get started with heyoo, you have to firstly install the libary either directly or using pip.

Building from source

Use git to clone or you can also manually download the project repository just as shown below;

$ git clone https://github.com/Neurotech-HQ/heyoo
$ cd heyoo
heyoo $ python setup.py install 

Installing via pip

# For Windows 

pip install  --upgrade heyoo

#For Linux | MAC 

pip3 install --upgrade heyoo

Running on Docker

To run an instance in docker run the commands below

$ docker compose build
$ docker compose up

Setting up

To get started using this package, you will need TOKEN and TEST WHATSAPP NUMBER (the library works either with a production phone number, if you have one) which you can get from the Facebook Developer Portal

Here are steps to follow for you to get started:

  1. Go to your apps
  2. create an app
  3. Select Business >> Business
  4. It will prompt you to enter basic app informations
  5. It will ask you to add products to your app a. Add WhatsApp Messenger
  6. Right there you will see a your TOKEN and TEST WHATSAPP NUMBER and its phone_number_id
  7. Lastly verify the number you will be using for testing on the To field.

Once you've followed the above procedures you're ready to start hacking with the Wrapper.

Authentication

To authenticate your application, you need to specify the TOKEN and the phone_number_id of your application

>>> from heyoo import WhatsApp
>>> messenger = WhatsApp('TOKEN',  phone_number_id='104xxxxxx')

Once you have authenticated your app you can start using the above mentioned feature as shown above;

It is only possible to send messages other than templates only after the target phone responds to an initial template message or sends a message first. This resets every 24 hours; after that, you need to send a template again or the message won't be delivered. Reference: https://developers.facebook.com/community/threads/425605939396247/

Logging

You can configure your own log level. This is an example to set the log level to info. By default only Error messages are logged.

import logging

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
)

Sending Messanges

Use this method to send text message to a WhatsApp number.

>>> messenger.send_message('Your message ', 'Mobile eg: 255757xxxxx')

Marking messages as read

Use this method to mark a previously sent text message as read.

>>> messenger.mark_as_read('Message ID')

Sending Images

When sending media(image, video, audio, gif and document ), you can either specify a link containing the media or specify object id, you can do this using the same method.

By default all media methods assume you're sending link containing media but you can change this by specifying the link=False.

Here an example;

>>> messenger.send_image(
        image="https://i.imgur.com/Fh7XVYY.jpeg",
        recipient_id="255757xxxxxx",
    )

Note: You can also send media from your local machine but you have to upload it first to Whatsapp Cloud API, you can do this using the upload_media method. and then use the returned object id to send the media.

Here an example;

>>> media_id = messenger.upload_media(
        media='path/to/media',
    )['id']
>>> messenger.send_image(
        image=media_id,
        recipient_id="255757xxxxxx",
        link=False
    )

Note: Don't forget to set the link to False, and also you can use the same technique for sending video, audio, gif and document from your local machine.

Sending Video

Here an example;

>>> messenger.send_video(
        video="https://www.youtube.com/watch?v=K4TOrB7at0Y",
        recipient_id="255757xxxxxx",
    )

Sending Audio

Here an example;

>>> messenger.send_audio(
        audio="https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3",
        recipient_id="255757xxxxxx",
    )

Sending Document

Here an example;

>>> messenger.send_document(
        document="http://www.africau.edu/images/default/sample.pdf",
        recipient_id="255757xxxxxx",
    )

Sending Location

Here an example;

>>> messenger.send_location(
        lat=1.29,
        long=103.85,
        name="Singapore",
        address="Singapore",
        recipient_id="255757xxxxxx",
    )

Sending Interactive buttons

Here an example;

Note: row button title may not exceed 20 characters otherwise your message will not be sent to the target phone.

>>> messenger.send_button(
        recipient_id="255757xxxxxx",
        button={
            "header": "Header Testing",
            "body": "Body Testing",
            "footer": "Footer Testing",
            "action": {
                "button": "Button Testing",
                "sections": [
                    {
                        "title": "iBank",
                        "rows": [
                            {"id": "row 1", "title": "Send Money", "description": ""},
                            {
                                "id": "row 2",
                                "title": "Withdraw money",
                                "description": "",
                            },
                        ],
                    }
                ],
            },
        },
    )

Sending Interactive reply buttons

Here an example;

Send reply button only displays three reply buttons, if it exceeds three reply buttons, it will raise an error and your message will not be sent.

>>> messenger.send_reply_button(
        recipient_id="255757xxxxxx",
        button={
            "type": "button",
            "body": {
                "text": "This is a test button"
            },
            "action": {
                "buttons": [
                    {
                        "type": "reply",
                        "reply": {
                            "id": "b1",
                            "title": "This is button 1"
                        }
                    },
                    {
                        "type": "reply",
                        "reply": {
                            "id": "b2",
                            "title": "this is button 2"
                        }
                    }
                ]
            }
      },
    )

Sending a Template Messages

Here how to send a pre-approved template message, Template messages can either be;

  1. Text template
  2. Media based template
  3. Interactive template

You can customize the template message by passing a dictionary of components.

IMPORTANT: components are also known as variable parameters (like {{0}} or {{1}}) which are used to include variables into a message. You can find the available components in the documentation. https://developers.facebook.com/docs/whatsapp/cloud-api/guides/send-message-templates

>>> messenger.send_template("hello_world", "255757xxxxxx", components=[], lang="en_US")

lang is optional but required when sending templates in other languages.

Webhook

Webhook are useful incase you're wondering how to respond to incoming message send by user, but I have created a starter webhook which you can then customize it according to your own plans.

Here an example on how you can use webhook to respond to incoming messages;

  # Handle Webhook Subscriptions
    data = request.get_json()
    logging.info("Received webhook data: %s", data)
    changed_field = messenger.changed_field(data)
    if changed_field == "messages":
        new_message = messenger.get_mobile(data)
        if new_message:
            mobile = messenger.get_mobile(data)
            name = messenger.get_name(data)
            message_type = messenger.get_message_type(data)
            logging.info(
                f"New Message; sender:{mobile} name:{name} type:{message_type}"
            )
            if message_type == "text":
                message = messenger.get_message(data)
                name = messenger.get_name(data)
                logging.info("Message: %s", message)
                messenger.send_message(f"Hi {name}, nice to connect with you", mobile)

            elif message_type == "interactive":
                message_response = messenger.get_interactive_response(data)
                interactive_type = message_response.get("type")
                message_id = message_response[interactive_type]["id"]
                message_text = message_response[interactive_type]["title"]
                logging.info(f"Interactive Message; {message_id}: {message_text}")

            elif message_type == "location":
                message_location = messenger.get_location(data)
                message_latitude = message_location["latitude"]
                message_longitude = message_location["longitude"]
                logging.info("Location: %s, %s", message_latitude, message_longitude)

            elif message_type == "image":
                image = messenger.get_image(data)
                image_id, mime_type = image["id"], image["mime_type"]
                image_url = messenger.query_media_url(image_id)
                image_filename = messenger.download_media(image_url, mime_type)
                print(f"{mobile} sent image {image_filename}")
                logging.info(f"{mobile} sent image {image_filename}")

            elif message_type == "video":
                video = messenger.get_video(data)
                video_id, mime_type = video["id"], video["mime_type"]
                video_url = messenger.query_media_url(video_id)
                video_filename = messenger.download_media(video_url, mime_type)
                print(f"{mobile} sent video {video_filename}")
                logging.info(f"{mobile} sent video {video_filename}")

            elif message_type == "audio":
                audio = messenger.get_audio(data)
                audio_id, mime_type = audio["id"], audio["mime_type"]
                audio_url = messenger.query_media_url(audio_id)
                audio_filename = messenger.download_media(audio_url, mime_type)
                print(f"{mobile} sent audio {audio_filename}")
                logging.info(f"{mobile} sent audio {audio_filename}")

            elif message_type == "document":
                file = messenger.get_document(data)
                file_id, mime_type = file["id"], file["mime_type"]
                file_url = messenger.query_media_url(file_id)
                file_filename = messenger.download_media(file_url, mime_type)
                print(f"{mobile} sent file {file_filename}")
                logging.info(f"{mobile} sent file {file_filename}")
            else:
                print(f"{mobile} sent {message_type} ")
                print(data)
        else:
            delivery = messenger.get_delivery(data)
            if delivery:
                print(f"Message : {delivery}")
            else:
                print("No new message")
    return "ok"

Incase you want a hustle free automatic deployment of the webhook to the Heroku platform, then we have made it simpler for you. With Just a click of a button you can deploy your webhook to Heroku.

steps to Deploy webhook to Heroku

  1. Click the deploy button and the Heroku webpage will open for authentication, after authentication sit back and relax for deployment to finish. Deploy

  2. From Heroku settings configure your Environment varibles of your WhatsAapp application.

  3. Setup and verify your webhook url and token then subscribe to messages.

To learn more about webhook and how to configure in your Facebook developer dashboard please have a look here.

Issues

If you will face any issue with the usage of this package please raise one so as we can quickly fix it as soon as possible;

Contributing

This is an opensource project under MIT License so any one is welcome to contribute from typo to source code or documentation, JUST FORK IT.

References

  1. WhatsApp Cloud API official documentation
  2. Programming WhatsApp is now even easier for Python Developers
  3. Meet Heyoo — an Open-source Python Wrapper for WhatsApp Cloud API
  4. Whatsapp Cloud API: How to send WhatsApp messages from Python?

Related

  1. WhatsApp Cloud API PHP Wrapper
  2. Heyoo Javascript

All the credit

  1. kalebu
  2. All other contributors

More Repositories

1

pypesa

Python wrapper on Mpesa public API for mobile Payment Integration
Python
29
star
2

azampay

Python Wrapper to Azampay Payment Gateway
Python
21
star
3

sarufi-python-sdk

Sarufi Python SDK to help you interact with Sarufi Conversational API
Python
21
star
4

python-dpo

A python package to easy the integration with Direct Online Pay (Mpesa, TigoPesa, AirtelMoney, Card Payments)
Python
19
star
5

pysimilar

A python library for computing the similarity between two string(text) based on cosine similarity
Python
18
star
6

tigopesa

Python package to ease the Tigo Pesa API integration
Python
12
star
7

sarufi-docs

Sarufi API documentation
JavaScript
9
star
8

sarufi-heyoo-blueprint

Starter code to integrating sarufi with heyoo
Python
9
star
9

swahili-sentiment-analysis-dataset

Dataset for training Sentiment analysis models
8
star
10

common-swahili-slangs-typos

Common Swahili stopwords, slangs and typos dataset
7
star
11

Loss-report-bot

A Swahili conversational Chatbot to Automate filing loss report,
Python
7
star
12

sarufi-instagram-blueprint

A Boiler plate code to help you easily integrate Instagram DM with Sarufi
4
star
13

linux-service-deployment

This shows how to configure and deploy any service in linux box
4
star
14

Mandonga-first-PR

This repository is to help tanzanian developers make their first opensource contribution
4
star
15

nerve

A python library for doing pre-processing on image data for training computer vision models
4
star
16

swahili-ner-dataset

Swahili NER dataset generated from https://huggingface.co/datasets/swahili using back translation techniques
4
star
17

sarufi-africastalking-ussd-blueprint

A boilerplate code to easy the integration between Sarufi and Africastalking USSD application
Python
3
star
18

sarufi-africastalking-voice-blueprint

Simplify the integration between AT Voice API and Sarufi
Python
3
star
19

sarufi-cli

A Commandline Client For Sarufi AI
Go
3
star
20

sarufi-africastalking-blueprint

Sarufi Blueprint to easier the integration between Sarufi and Africas talking 2 way SMS Platform
Python
2
star
21

Augumented-swahili-ner-data

Augmented NLP data for Named Entity recognition
Jupyter Notebook
2
star
22

sarufi-messenger-blueprint

Starter code to integrating sarufi chatbot with Facebook messenger
Python
2
star
23

Cause-of-decision-in-Swahili-sentiments

This repository special to demonstrate the cause of decision or explainability on classifying Swahili sentiments as a data professional for business needs.
HTML
2
star
24

swahili-ner-spacy

Swahili NER model trained using spacy
Python
2
star
25

Generative-AI-Tanzania

Source code for Geneative AI Tanzania Workshop
1
star
26

telegram-chatbot-blueprint

A blueprint for deploying sarufi chatbots to telegram
Python
1
star
27

spacy-ready-masakhane-ner-data

Masakhane swahili ner data prepossessed to support training in the spacy pipeline
Python
1
star
28

fastapi-template

Structure of sample API repo using FastAPI
Python
1
star
29

sarufi-java-sdk

Java SDK for simplifying the integration with Sarufi Conversational platform
1
star