Package: heyoo
heyooUnofficial Python wrapper for theWhatsApp Cloud APISupported featuresSending messagesMarking messages as readSending Media (images, audio, video and documents)Sending locationSending interactive buttonsSending template messagesParsing messages and media receivedGetting startedTo get started withheyoo, you have to firstly install the libary either directly or usingpip.Building from sourceUse git to clone or you can also manually download the project repository just as shown below;$gitclonehttps://github.com/Neurotech-HQ/heyoo
$cdheyoo
heyoo$pythonsetup.pyinstallInstalling via pip# For Windowspipinstall--upgradeheyoo#For Linux | MACpip3install--upgradeheyooRunning on DockerTo run an instance in docker run the commands below$dockercomposebuild
$dockercomposeupSetting upTo get started using this package, you will needTOKENandTEST WHATSAPP NUMBER(the library works either with a production phone number, if you have one) which you can get from theFacebook Developer PortalHere are steps to follow for you to get started:Go to your appscreate an appSelect Business >> BusinessIt will prompt you to enter basic app informationsIt will ask you to add products to your app
a. Add WhatsApp MessengerRight there you will see a yourTOKENandTEST WHATSAPP NUMBERand its phone_number_idLastly verify the number you will be using for testing on theTofield.Once you've followed the above procedures you're ready to start hacking with the Wrapper.AuthenticationTo authenticate your application, you need to specify  theTOKENand thephone_number_idof your application>>>fromheyooimportWhatsApp>>>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/LoggingYou can configure your own log level. This is an example to set the log level to info. By default only Error messages are logged.importlogginglogging.basicConfig(level=logging.INFO,format="%(asctime)s-%(name)s-%(levelname)s-%(message)s",)Sending MessangesUse this method to send text message to a WhatsApp number.>>>messenger.send_message('Your message ','Mobile eg: 255757xxxxx')Marking messages as readUse this method to mark a previously sent text message as read.>>>messenger.mark_as_read('Message ID')Sending ImagesWhen 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 thelink=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 theupload_mediamethod. 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 VideoHere an example;>>>messenger.send_video(video="https://www.youtube.com/watch?v=K4TOrB7at0Y",recipient_id="255757xxxxxx",)Sending AudioHere an example;>>>messenger.send_audio(audio="https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3",recipient_id="255757xxxxxx",)Sending DocumentHere an example;>>>messenger.send_document(document="http://www.africau.edu/images/default/sample.pdf",recipient_id="255757xxxxxx",)Sending LocationHere an example;>>>messenger.send_location(lat=1.29,long=103.85,name="Singapore",address="Singapore",recipient_id="255757xxxxxx",)Sending Interactive buttonsHere 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 buttonsHere 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 MessagesHere how to send a pre-approved template message, Template messages can either be;Text templateMedia based templateInteractive templateYou 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")langis optional but required when sending templates in other languages.WebhookWebhook are useful incase you're wondering how to respond to incoming message send by user, but I have created astarter webhookwhich 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 Subscriptionsdata=request.get_json()logging.info("Received webhook data:%s",data)changed_field=messenger.changed_field(data)ifchanged_field=="messages":new_message=messenger.get_mobile(data)ifnew_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}")ifmessage_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)elifmessage_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}")elifmessage_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)elifmessage_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}")elifmessage_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}")elifmessage_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}")elifmessage_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)ifdelivery: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 HerokuClick the deploy button and the Heroku webpage will open for authentication, after authentication sit back and relax for deployment to finish.From Heroku settings configure your Environment varibles of your WhatsAapp application.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 pleasehave a look here.IssuesIf 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;ContributingThis is an opensource project underMIT Licenseso any one is welcome to contribute from typo to source code or documentation,JUST FORK IT.ReferencesWhatsApp Cloud API official documentationProgramming WhatsApp is now even easier for Python DevelopersMeet Heyoo — an Open-source Python Wrapper for WhatsApp Cloud APIWhatsapp Cloud API: How to send WhatsApp messages from Python?RelatedWhatsApp Cloud API PHP WrapperHeyoo JavascriptAll the creditkalebuAll other contributors