whatsapp-python 4.0.2__tar.gz → 4.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- whatsapp_python-4.3.0/CONTRIBUTING.md +22 -0
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/PKG-INFO +16 -15
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/README.md +13 -12
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/examples/reply_to_message_obj.py +2 -2
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/examples/sending_audio.py +2 -3
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/examples/sending_button.py +2 -3
- whatsapp_python-4.3.0/examples/sending_button_async.py +40 -0
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/examples/sending_document.py +2 -3
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/examples/sending_image.py +3 -0
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/examples/sending_location.py +2 -3
- whatsapp_python-4.3.0/examples/sending_message.py +14 -0
- whatsapp_python-4.3.0/examples/sending_message_async.py +19 -0
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/examples/sending_template_message.py +3 -3
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/examples/sending_video.py +2 -3
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/examples/standalone_hook.py +4 -8
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/pyproject.toml +1 -1
- whatsapp_python-4.3.0/tests/async_tests.py +180 -0
- whatsapp_python-4.3.0/tests/tests.py +123 -0
- whatsapp_python-4.3.0/whatsapp/__init__.py +944 -0
- whatsapp_python-4.3.0/whatsapp/async_ext/_buttons.py +122 -0
- whatsapp_python-4.3.0/whatsapp/async_ext/_media.py +169 -0
- whatsapp_python-4.3.0/whatsapp/async_ext/_message.py +178 -0
- whatsapp_python-4.3.0/whatsapp/async_ext/_send_media.py +392 -0
- whatsapp_python-4.3.0/whatsapp/async_ext/_send_others.py +124 -0
- {whatsapp_python-4.0.2/whatsapp/ext → whatsapp_python-4.3.0/whatsapp/async_ext}/_static.py +2 -0
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/whatsapp/constants.py +1 -1
- whatsapp_python-4.3.0/whatsapp/errors.py +290 -0
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/whatsapp/ext/_buttons.py +8 -3
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/whatsapp/ext/_media.py +14 -10
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/whatsapp/ext/_message.py +17 -7
- whatsapp_python-4.3.0/whatsapp/ext/_property.py +5 -0
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/whatsapp/ext/_send_media.py +41 -30
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/whatsapp/ext/_send_others.py +3 -2
- whatsapp_python-4.3.0/whatsapp/ext/_static.py +331 -0
- whatsapp_python-4.0.2/CONTRIBUTING.md +0 -19
- whatsapp_python-4.0.2/examples/sending_message.py +0 -15
- whatsapp_python-4.0.2/whatsapp/__init__.py +0 -399
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/.github/FUNDING.yml +0 -0
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/.github/ISSUE_TEMPLATE/custom.md +0 -0
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/.github/dependabot.yml +0 -0
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/.github/workflows/codeql.yml +0 -0
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/.github/workflows/dependency-review.yml +0 -0
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/.github/workflows/python-publish.yml +0 -0
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/.gitignore +0 -0
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/CODE_OF_CONDUCT.md +0 -0
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/LICENSE +0 -0
- {whatsapp_python-4.0.2 → whatsapp_python-4.3.0}/SECURITY.md +0 -0
- {whatsapp_python-4.0.2/whatsapp/ext → whatsapp_python-4.3.0/whatsapp/async_ext}/_property.py +0 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# How to contribute
|
|
2
|
+
|
|
3
|
+
First of all, thank you for considering contributing to this project! It's people like you that make it a reality and help me keep it alive and updated.
|
|
4
|
+
|
|
5
|
+
If you are unsure about anything, feel free to ask me. I am here to help you.
|
|
6
|
+
|
|
7
|
+
Any bug report, feature request, or code contribution is welcome. Here are some guidelines to help you get started.
|
|
8
|
+
|
|
9
|
+
## Submitting changes
|
|
10
|
+
|
|
11
|
+
Please open a [Pull Request](https://github.com/filipporomani/whatsapp-python/pull/new/master) with a list of what you've done (read more about [pull requests](http://help.github.com/pull-requests/)). Make sure, if possible, that all of your commits are atomic (one feature per commit).
|
|
12
|
+
|
|
13
|
+
Always write a clear log message for your commits. One-line messages are fine for small changes, but bigger changes should look like this:
|
|
14
|
+
|
|
15
|
+
$ git commit -m "feat: a brief summary of the commit
|
|
16
|
+
>
|
|
17
|
+
> A paragraph describing what changed and its impact."
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
* This is an open source software. Keep in mind to make your code readable to others. It's sort of like driving a car: perhaps you love doing donuts when you're alone, but with passengers the goal is to make the ride as smooth as possible.
|
|
21
|
+
|
|
22
|
+
There isn't any other particular guideline, feel free to contribute!
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: whatsapp-python
|
|
3
|
-
Version: 4.0
|
|
3
|
+
Version: 4.3.0
|
|
4
4
|
Summary: Open source Python wrapper for the WhatsApp Cloud API
|
|
5
5
|
Project-URL: Homepage, https://github.com/filipporomani/whatsapp-python
|
|
6
6
|
Project-URL: Docs, https://github.com/filipporomani/whatsapp-python/wiki
|
|
@@ -8,7 +8,6 @@ Project-URL: Issues Reporting, https://github.com/filipporomani/whatsapp-python/
|
|
|
8
8
|
Project-URL: Download, https://github.com/filipporomani/whatsapp-python/releases/latest
|
|
9
9
|
Project-URL: Changelog, https://github.com/filipporomani/whatsapp-python/releases
|
|
10
10
|
Author-email: Filippo Romani <mail@filipporomani.it>
|
|
11
|
-
License-File: LICENSE
|
|
12
11
|
Classifier: Development Status :: 4 - Beta
|
|
13
12
|
Classifier: Intended Audience :: Customer Service
|
|
14
13
|
Classifier: Intended Audience :: Developers
|
|
@@ -27,10 +26,11 @@ Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
|
|
|
27
26
|
Classifier: Topic :: Software Development :: Build Tools
|
|
28
27
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
29
28
|
Requires-Python: >=3.10
|
|
29
|
+
Requires-Dist: aiohttp
|
|
30
|
+
Requires-Dist: asyncio
|
|
30
31
|
Requires-Dist: beautifulsoup4
|
|
31
32
|
Requires-Dist: fastapi
|
|
32
33
|
Requires-Dist: python-dotenv
|
|
33
|
-
Requires-Dist: requests
|
|
34
34
|
Requires-Dist: requests-toolbelt
|
|
35
35
|
Requires-Dist: uvicorn
|
|
36
36
|
Description-Content-Type: text/markdown
|
|
@@ -38,7 +38,8 @@ Description-Content-Type: text/markdown
|
|
|
38
38
|
<div align="center">
|
|
39
39
|
<img src="https://gist.githubusercontent.com/boywithkeyboard/e8dc5b1810bd29e1d70346ca11d7f09d/raw/7f7eeea482f5047e62944e54182aa26c89cc299a/whatsapp_python.svg" alt="logo" width="128px">
|
|
40
40
|
<h1>whatsapp-python</h1>
|
|
41
|
-
<p>Free, open-source Python wrapper for the <a href="https://developers.facebook.com/docs/whatsapp/cloud-api">WhatsApp Cloud API</a>.<br>Forked from <a href="https://github.com/Neurotech-HQ/heyoo">Neurotech-HQ/heyoo</a
|
|
41
|
+
<p>Free, open-source Python wrapper for the <a href="https://developers.facebook.com/docs/whatsapp/cloud-api">WhatsApp Cloud API</a>.<br>Forked from <a href="https://github.com/Neurotech-HQ/heyoo">Neurotech-HQ/heyoo</a>.
|
|
42
|
+
</p>
|
|
42
43
|
<img src="https://img.shields.io/badge/made%20in-italy-008751.svg?style=flat-square" alt="Made in Italy">
|
|
43
44
|
<a href="https://pepy.tech/project/whatsapp-python"><img src="https://static.pepy.tech/personalized-badge/whatsapp-python?period=total&units=none&left_color=grey&right_color=blue&left_text=Downloads" alt="Downloads"></a>
|
|
44
45
|
<a href="https://pepy.tech/project/whatsapp-python"><img src="https://pepy.tech/badge/whatsapp-python/month" alt="Monthly Downloads"></a>
|
|
@@ -70,24 +71,24 @@ hatch shell
|
|
|
70
71
|
|
|
71
72
|
Documentation is available in the [wiki](https://github.com/filipporomani/whatsapp/wiki) here on GitHub.
|
|
72
73
|
|
|
73
|
-
|
|
74
|
+
### Key features:
|
|
75
|
+
- Modern interface using `async` and `await`
|
|
76
|
+
- Full support for Graph API error handling
|
|
77
|
+
- Optimized for high-load workflows using asyncronous programming
|
|
78
|
+
- Always up to date
|
|
79
|
+
- All of the WhatsApp chat UI features supported
|
|
74
80
|
|
|
75
|
-
The main reason why I decided to fork the original library is that it uses an old version of the API, it's missing many and it's not mantained anymore.
|
|
76
81
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
### Supported features:
|
|
83
|
-
|
|
84
|
-
- Listening to events (messages, media, etc.)
|
|
82
|
+
### All features
|
|
83
|
+
- Event listener (incoming messages)
|
|
84
|
+
- Async ready
|
|
85
|
+
- Error handling
|
|
85
86
|
- Sending messages
|
|
86
87
|
- Sending messages from different numbers individually
|
|
87
88
|
- Marking messages as read
|
|
88
89
|
- Replying to messages
|
|
89
90
|
- Reacting to messages
|
|
90
|
-
- Sending
|
|
91
|
+
- Sending medias (images, audios, videos, links and documents)
|
|
91
92
|
- Sending location
|
|
92
93
|
- Sending interactive buttons
|
|
93
94
|
- Sending template messages
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
<img src="https://gist.githubusercontent.com/boywithkeyboard/e8dc5b1810bd29e1d70346ca11d7f09d/raw/7f7eeea482f5047e62944e54182aa26c89cc299a/whatsapp_python.svg" alt="logo" width="128px">
|
|
3
3
|
<h1>whatsapp-python</h1>
|
|
4
|
-
<p>Free, open-source Python wrapper for the <a href="https://developers.facebook.com/docs/whatsapp/cloud-api">WhatsApp Cloud API</a>.<br>Forked from <a href="https://github.com/Neurotech-HQ/heyoo">Neurotech-HQ/heyoo</a
|
|
4
|
+
<p>Free, open-source Python wrapper for the <a href="https://developers.facebook.com/docs/whatsapp/cloud-api">WhatsApp Cloud API</a>.<br>Forked from <a href="https://github.com/Neurotech-HQ/heyoo">Neurotech-HQ/heyoo</a>.
|
|
5
|
+
</p>
|
|
5
6
|
<img src="https://img.shields.io/badge/made%20in-italy-008751.svg?style=flat-square" alt="Made in Italy">
|
|
6
7
|
<a href="https://pepy.tech/project/whatsapp-python"><img src="https://static.pepy.tech/personalized-badge/whatsapp-python?period=total&units=none&left_color=grey&right_color=blue&left_text=Downloads" alt="Downloads"></a>
|
|
7
8
|
<a href="https://pepy.tech/project/whatsapp-python"><img src="https://pepy.tech/badge/whatsapp-python/month" alt="Monthly Downloads"></a>
|
|
@@ -33,24 +34,24 @@ hatch shell
|
|
|
33
34
|
|
|
34
35
|
Documentation is available in the [wiki](https://github.com/filipporomani/whatsapp/wiki) here on GitHub.
|
|
35
36
|
|
|
36
|
-
|
|
37
|
+
### Key features:
|
|
38
|
+
- Modern interface using `async` and `await`
|
|
39
|
+
- Full support for Graph API error handling
|
|
40
|
+
- Optimized for high-load workflows using asyncronous programming
|
|
41
|
+
- Always up to date
|
|
42
|
+
- All of the WhatsApp chat UI features supported
|
|
37
43
|
|
|
38
|
-
The main reason why I decided to fork the original library is that it uses an old version of the API, it's missing many and it's not mantained anymore.
|
|
39
44
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
### Supported features:
|
|
46
|
-
|
|
47
|
-
- Listening to events (messages, media, etc.)
|
|
45
|
+
### All features
|
|
46
|
+
- Event listener (incoming messages)
|
|
47
|
+
- Async ready
|
|
48
|
+
- Error handling
|
|
48
49
|
- Sending messages
|
|
49
50
|
- Sending messages from different numbers individually
|
|
50
51
|
- Marking messages as read
|
|
51
52
|
- Replying to messages
|
|
52
53
|
- Reacting to messages
|
|
53
|
-
- Sending
|
|
54
|
+
- Sending medias (images, audios, videos, links and documents)
|
|
54
55
|
- Sending location
|
|
55
56
|
- Sending interactive buttons
|
|
56
57
|
- Sending template messages
|
|
@@ -4,11 +4,11 @@ from dotenv import load_dotenv
|
|
|
4
4
|
|
|
5
5
|
if __name__ == "__main__":
|
|
6
6
|
load_dotenv()
|
|
7
|
-
messenger = WhatsApp(token=getenv("TOKEN"), phone_number_id={1:"1234", 2: "5678"})
|
|
7
|
+
messenger = WhatsApp(token=getenv("TOKEN"), phone_number_id={1: "1234", 2: "5678"})
|
|
8
8
|
|
|
9
9
|
data = {"your": "data"}
|
|
10
10
|
|
|
11
|
-
msg = Message(data=data, instance=messenger,sender=1)
|
|
11
|
+
msg = Message(data=data, instance=messenger, sender=1)
|
|
12
12
|
msg.reply("lol")
|
|
13
13
|
|
|
14
14
|
print(msg)
|
|
@@ -4,13 +4,12 @@ from dotenv import load_dotenv
|
|
|
4
4
|
|
|
5
5
|
if __name__ == "__main__":
|
|
6
6
|
load_dotenv()
|
|
7
|
-
messenger = WhatsApp(token=getenv("TOKEN"),
|
|
8
|
-
phone_number_id={1:"1234", 2: "5678"})
|
|
7
|
+
messenger = WhatsApp(token=getenv("TOKEN"), phone_number_id={1: "1234", 2: "5678"})
|
|
9
8
|
|
|
10
9
|
response = messenger.send_audio(
|
|
11
10
|
audio="https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3",
|
|
12
11
|
recipient_id="255757xxxxxx",
|
|
13
|
-
sender=1
|
|
12
|
+
sender=1,
|
|
14
13
|
)
|
|
15
14
|
|
|
16
15
|
print(response)
|
|
@@ -4,8 +4,7 @@ from dotenv import load_dotenv
|
|
|
4
4
|
|
|
5
5
|
if __name__ == "__main__":
|
|
6
6
|
load_dotenv()
|
|
7
|
-
messenger = WhatsApp(token=getenv("TOKEN"),
|
|
8
|
-
phone_number_id={1:"1234", 2: "5678"})
|
|
7
|
+
messenger = WhatsApp(token=getenv("TOKEN"), phone_number_id={1: "1234", 2: "5678"})
|
|
9
8
|
|
|
10
9
|
response = messenger.send_button(
|
|
11
10
|
recipient_id="255757xxxxxx",
|
|
@@ -30,5 +29,5 @@ if __name__ == "__main__":
|
|
|
30
29
|
],
|
|
31
30
|
},
|
|
32
31
|
},
|
|
33
|
-
sender=1
|
|
32
|
+
sender=1,
|
|
34
33
|
)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from os import getenv
|
|
2
|
+
from whatsapp import AsyncWhatsApp, AsyncMessage
|
|
3
|
+
import asyncio
|
|
4
|
+
from dotenv import load_dotenv
|
|
5
|
+
|
|
6
|
+
if __name__ == "__main__":
|
|
7
|
+
load_dotenv()
|
|
8
|
+
messenger = AsyncWhatsApp(token=getenv("TOKEN"), phone_number_id={1: "1234", 2: "5678"})
|
|
9
|
+
|
|
10
|
+
async def run_test():
|
|
11
|
+
response = await messenger.send_button(
|
|
12
|
+
recipient_id="255757xxxxxx",
|
|
13
|
+
button={
|
|
14
|
+
"header": "Header Testing",
|
|
15
|
+
"body": "Body Testing",
|
|
16
|
+
"footer": "Footer Testing",
|
|
17
|
+
"action": {
|
|
18
|
+
"button": "Button Testing",
|
|
19
|
+
"sections": [
|
|
20
|
+
{
|
|
21
|
+
"title": "iBank",
|
|
22
|
+
"rows": [
|
|
23
|
+
{"id": "row 1", "title": "Send Money", "description": ""},
|
|
24
|
+
{
|
|
25
|
+
"id": "row 2",
|
|
26
|
+
"title": "Withdraw money",
|
|
27
|
+
"description": "",
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
sender=1,
|
|
35
|
+
)
|
|
36
|
+
while not response.done():
|
|
37
|
+
await asyncio.sleep(.1)
|
|
38
|
+
print(response.result())
|
|
39
|
+
|
|
40
|
+
asyncio.run(run_test())
|
|
@@ -5,13 +5,12 @@ from dotenv import load_dotenv
|
|
|
5
5
|
if __name__ == "__main__":
|
|
6
6
|
load_dotenv()
|
|
7
7
|
|
|
8
|
-
messenger = WhatsApp(token=getenv("TOKEN"),
|
|
9
|
-
phone_number_id={1:"1234", 2: "5678"})
|
|
8
|
+
messenger = WhatsApp(token=getenv("TOKEN"), phone_number_id={1: "1234", 2: "5678"})
|
|
10
9
|
|
|
11
10
|
response = messenger.send_document(
|
|
12
11
|
document="http://www.africau.edu/images/default/sample.pdf",
|
|
13
12
|
recipient_id="255757294146",
|
|
14
|
-
sender=1
|
|
13
|
+
sender=1,
|
|
15
14
|
)
|
|
16
15
|
|
|
17
16
|
print(response)
|
|
@@ -4,8 +4,7 @@ from dotenv import load_dotenv
|
|
|
4
4
|
|
|
5
5
|
if __name__ == "__main__":
|
|
6
6
|
load_dotenv()
|
|
7
|
-
messenger = WhatsApp(token=getenv("TOKEN"),
|
|
8
|
-
phone_number_id={1:"1234", 2: "5678"})
|
|
7
|
+
messenger = WhatsApp(token=getenv("TOKEN"), phone_number_id={1: "1234", 2: "5678"})
|
|
9
8
|
|
|
10
9
|
response = messenger.send_location(
|
|
11
10
|
lat=1.29,
|
|
@@ -13,7 +12,7 @@ if __name__ == "__main__":
|
|
|
13
12
|
name="Singapore",
|
|
14
13
|
address="Singapore",
|
|
15
14
|
recipient_id="255757294146",
|
|
16
|
-
sender=1
|
|
15
|
+
sender=1,
|
|
17
16
|
)
|
|
18
17
|
|
|
19
18
|
print(response)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from os import getenv
|
|
2
|
+
from whatsapp import WhatsApp, Message
|
|
3
|
+
from dotenv import load_dotenv
|
|
4
|
+
|
|
5
|
+
if __name__ == "__main__":
|
|
6
|
+
load_dotenv()
|
|
7
|
+
messenger = WhatsApp(token=getenv("TOKEN"), phone_number_id={1: "1234", 2: "5678"})
|
|
8
|
+
|
|
9
|
+
msg = Message(
|
|
10
|
+
instance=messenger, content="Hello World!", to="919999999999", sender=1
|
|
11
|
+
)
|
|
12
|
+
response = msg.send()
|
|
13
|
+
|
|
14
|
+
print(response)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from os import getenv
|
|
2
|
+
from whatsapp import AsyncWhatsApp, AsyncMessage
|
|
3
|
+
import asyncio
|
|
4
|
+
from dotenv import load_dotenv
|
|
5
|
+
|
|
6
|
+
if __name__ == "__main__":
|
|
7
|
+
load_dotenv()
|
|
8
|
+
messenger = AsyncWhatsApp(token=getenv("TOKEN"), phone_number_id={1: "1234", 2: "5678"})
|
|
9
|
+
|
|
10
|
+
msg = AsyncMessage(
|
|
11
|
+
instance=messenger, content="Hello World!", to="919999999999", sender=1
|
|
12
|
+
)
|
|
13
|
+
async def run_test():
|
|
14
|
+
response = await msg.send()
|
|
15
|
+
while not response.done():
|
|
16
|
+
await asyncio.sleep(.1)
|
|
17
|
+
print(response.result())
|
|
18
|
+
|
|
19
|
+
asyncio.run(run_test())
|
|
@@ -4,10 +4,10 @@ from dotenv import load_dotenv
|
|
|
4
4
|
|
|
5
5
|
if __name__ == "__main__":
|
|
6
6
|
load_dotenv()
|
|
7
|
-
messenger = WhatsApp(token=getenv("TOKEN"),
|
|
8
|
-
phone_number_id={1:"1234", 2: "5678"})
|
|
7
|
+
messenger = WhatsApp(token=getenv("TOKEN"), phone_number_id={1: "1234", 2: "5678"})
|
|
9
8
|
|
|
10
9
|
response = messenger.send_template(
|
|
11
|
-
"hello_world", "255757xxxxxx", components=[], lang="en_US", sender=1
|
|
10
|
+
"hello_world", "255757xxxxxx", components=[], lang="en_US", sender=1
|
|
11
|
+
)
|
|
12
12
|
|
|
13
13
|
print(response)
|
|
@@ -4,13 +4,12 @@ from dotenv import load_dotenv
|
|
|
4
4
|
|
|
5
5
|
if __name__ == "__main__":
|
|
6
6
|
load_dotenv()
|
|
7
|
-
messenger = WhatsApp(token=getenv("TOKEN"),
|
|
8
|
-
phone_number_id={1:"1234", 2: "5678"})
|
|
7
|
+
messenger = WhatsApp(token=getenv("TOKEN"), phone_number_id={1: "1234", 2: "5678"})
|
|
9
8
|
|
|
10
9
|
response = messenger.send_video(
|
|
11
10
|
video="https://www.youtube.com/watch?v=K4TOrB7at0Y",
|
|
12
11
|
recipient_id="255757xxxxxx",
|
|
13
|
-
sender=1
|
|
12
|
+
sender=1,
|
|
14
13
|
)
|
|
15
14
|
|
|
16
15
|
print(response)
|
|
@@ -9,8 +9,7 @@ app = Flask(__name__)
|
|
|
9
9
|
|
|
10
10
|
# Load .env file
|
|
11
11
|
load_dotenv("../.env")
|
|
12
|
-
messenger = WhatsApp(os.getenv("TOKEN"),
|
|
13
|
-
phone_number_id=os.getenv("ID"))
|
|
12
|
+
messenger = WhatsApp(os.getenv("TOKEN"), phone_number_id=os.getenv("ID"))
|
|
14
13
|
VERIFY_TOKEN = "30cca545-3838-48b2-80a7-9e43b1ae8ce4"
|
|
15
14
|
|
|
16
15
|
# Logging
|
|
@@ -51,8 +50,7 @@ def hook():
|
|
|
51
50
|
message = msg.content
|
|
52
51
|
name = msg.name
|
|
53
52
|
logging.info("Message: %s", message)
|
|
54
|
-
m = Message(instance=messenger, to=mobile,
|
|
55
|
-
content="Hello World")
|
|
53
|
+
m = Message(instance=messenger, to=mobile, content="Hello World")
|
|
56
54
|
m.send()
|
|
57
55
|
|
|
58
56
|
elif message_type == "interactive":
|
|
@@ -62,8 +60,7 @@ def hook():
|
|
|
62
60
|
interactive_type = message_response.get("type")
|
|
63
61
|
message_id = message_response[interactive_type]["id"]
|
|
64
62
|
message_text = message_response[interactive_type]["title"]
|
|
65
|
-
logging.info(
|
|
66
|
-
f"Interactive Message; {message_id}: {message_text}")
|
|
63
|
+
logging.info(f"Interactive Message; {message_id}: {message_text}")
|
|
67
64
|
|
|
68
65
|
elif message_type == "location":
|
|
69
66
|
message_location = msg.location
|
|
@@ -71,8 +68,7 @@ def hook():
|
|
|
71
68
|
return Response(status=400)
|
|
72
69
|
message_latitude = message_location["latitude"]
|
|
73
70
|
message_longitude = message_location["longitude"]
|
|
74
|
-
logging.info("Location: %s, %s",
|
|
75
|
-
message_latitude, message_longitude)
|
|
71
|
+
logging.info("Location: %s, %s", message_latitude, message_longitude)
|
|
76
72
|
|
|
77
73
|
elif message_type == "image":
|
|
78
74
|
image = msg.image
|
|
@@ -31,7 +31,7 @@ classifiers=[
|
|
|
31
31
|
dynamic = [
|
|
32
32
|
"version"
|
|
33
33
|
]
|
|
34
|
-
dependencies = ["fastapi", "uvicorn", "requests_toolbelt", "
|
|
34
|
+
dependencies = ["fastapi", "uvicorn", "requests_toolbelt", "asyncio", "aiohttp", "python-dotenv", "BeautifulSoup4"]
|
|
35
35
|
|
|
36
36
|
[project.urls]
|
|
37
37
|
Homepage = "https://github.com/filipporomani/whatsapp-python"
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
from whatsapp import WhatsApp, Message, AsyncWhatsApp
|
|
2
|
+
from dotenv import load_dotenv
|
|
3
|
+
from os import getenv
|
|
4
|
+
import asyncio
|
|
5
|
+
from logging import getLogger, basicConfig, DEBUG
|
|
6
|
+
|
|
7
|
+
load_dotenv()
|
|
8
|
+
token = getenv("GRAPH_API_TOKEN")
|
|
9
|
+
phone_number_id = {1: getenv("TEST_PHONE_NUMBER_ID")}
|
|
10
|
+
dest_phone_number = getenv("DEST_PHONE_NUMBER")
|
|
11
|
+
|
|
12
|
+
app = AsyncWhatsApp(token=token, phone_number_id=phone_number_id, update_check=False, logger=True, debug=True)
|
|
13
|
+
syncapp = WhatsApp(token=token, phone_number_id=phone_number_id, update_check=False, logger=True, debug=True)
|
|
14
|
+
loop = asyncio.get_event_loop()
|
|
15
|
+
msg = app.create_message(to=dest_phone_number, content="Hello world")
|
|
16
|
+
|
|
17
|
+
basicConfig(level=DEBUG)
|
|
18
|
+
logger = getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
async def run_test():
|
|
21
|
+
|
|
22
|
+
# test every single method and print the result
|
|
23
|
+
print("Testing send_text")
|
|
24
|
+
v = await msg.send()
|
|
25
|
+
# print(v)
|
|
26
|
+
# await asyncio.sleep(1)
|
|
27
|
+
# print("Getting request status")
|
|
28
|
+
# print(v.result())
|
|
29
|
+
|
|
30
|
+
print("Testing send_reply_button")
|
|
31
|
+
v = await app.send_reply_button(
|
|
32
|
+
button={
|
|
33
|
+
"type": "button",
|
|
34
|
+
"body": {"text": "This is a test button"},
|
|
35
|
+
"action": {
|
|
36
|
+
"buttons": [
|
|
37
|
+
{
|
|
38
|
+
"type": "reply",
|
|
39
|
+
"reply": {"id": "b1", "title": "This is button 1"},
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"type": "reply",
|
|
43
|
+
"reply": {"id": "b2", "title": "this is button 2"},
|
|
44
|
+
},
|
|
45
|
+
]
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
recipient_id=dest_phone_number,
|
|
49
|
+
sender=1,
|
|
50
|
+
)
|
|
51
|
+
print(f"send_reply_button: {v}")
|
|
52
|
+
|
|
53
|
+
print("Creating button")
|
|
54
|
+
v = app.create_button(
|
|
55
|
+
button={
|
|
56
|
+
"header": {"type": "text", "text": "your-header-content"},
|
|
57
|
+
"body": {"text": "your-text-message-content"},
|
|
58
|
+
"footer": {"text": "your-footer-content"},
|
|
59
|
+
"action": {
|
|
60
|
+
"button": "cta-button-content",
|
|
61
|
+
"sections": [
|
|
62
|
+
{
|
|
63
|
+
"title": "your-section-title-content",
|
|
64
|
+
"rows": [
|
|
65
|
+
{
|
|
66
|
+
"id": "unique-row-identifier",
|
|
67
|
+
"title": "row-title-content",
|
|
68
|
+
"description": "row-description-content",
|
|
69
|
+
}
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
)
|
|
76
|
+
print(f"create_button: {v}")
|
|
77
|
+
print("sending button")
|
|
78
|
+
v = await app.send_button(
|
|
79
|
+
{
|
|
80
|
+
"header": "Header Testing",
|
|
81
|
+
"body": "Body Testing",
|
|
82
|
+
"footer": "Footer Testing",
|
|
83
|
+
"action": {
|
|
84
|
+
"button": "cta-button-content",
|
|
85
|
+
"sections": [
|
|
86
|
+
{
|
|
87
|
+
"title": "your-secti",
|
|
88
|
+
"rows": [
|
|
89
|
+
{
|
|
90
|
+
"id": "unique-row-",
|
|
91
|
+
"title": "row-title-",
|
|
92
|
+
"description": "row-description-",
|
|
93
|
+
}
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
dest_phone_number,
|
|
100
|
+
sender=1,
|
|
101
|
+
)
|
|
102
|
+
while not v.done():
|
|
103
|
+
await asyncio.sleep(1)
|
|
104
|
+
try: app.handle(v.result())
|
|
105
|
+
except Exception as error:
|
|
106
|
+
print(f"error: {error}")
|
|
107
|
+
print("sending wrong button")
|
|
108
|
+
v = await app.send_button(
|
|
109
|
+
{
|
|
110
|
+
"header": "Header Testing",
|
|
111
|
+
|
|
112
|
+
},
|
|
113
|
+
dest_phone_number,
|
|
114
|
+
sender=1,
|
|
115
|
+
)
|
|
116
|
+
while not v.done():
|
|
117
|
+
await asyncio.sleep(1)
|
|
118
|
+
try: app.handle(v.result())
|
|
119
|
+
except Exception as error:
|
|
120
|
+
print(f"error: {error}")
|
|
121
|
+
raise Exception("Error")
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
print(f"send_button: {v}")
|
|
125
|
+
print("sending image")
|
|
126
|
+
v = await app.send_image(
|
|
127
|
+
"https://filesamples.com/samples/image/jpeg/sample_640%C3%97426.jpeg",
|
|
128
|
+
dest_phone_number,
|
|
129
|
+
sender=1,
|
|
130
|
+
)
|
|
131
|
+
print(f"send_image: {v}")
|
|
132
|
+
print("sending video")
|
|
133
|
+
v = await app.send_video(
|
|
134
|
+
"https://filesamples.com/samples/video/mp4/sample_1280x720_surfing_with_audio.mp4",
|
|
135
|
+
dest_phone_number,
|
|
136
|
+
sender=1,
|
|
137
|
+
)
|
|
138
|
+
print(f"send_video: {v}")
|
|
139
|
+
print("sending audio")
|
|
140
|
+
v = await app.send_audio(
|
|
141
|
+
"https://filesamples.com/samples/audio/mp3/Symphony%20No.6%20(1st%20movement).mp3",
|
|
142
|
+
dest_phone_number,
|
|
143
|
+
sender=1,
|
|
144
|
+
)
|
|
145
|
+
print(f"send_audio: {v}")
|
|
146
|
+
print("sending document")
|
|
147
|
+
v = await app.send_document(
|
|
148
|
+
"https://filesamples.com/samples/document/docx/sample1.docx",
|
|
149
|
+
dest_phone_number,
|
|
150
|
+
sender=1,
|
|
151
|
+
)
|
|
152
|
+
print(f"send_document: {v}")
|
|
153
|
+
print("sending location")
|
|
154
|
+
v = await app.send_location(
|
|
155
|
+
"37.7749", "-122.4194", "test", "test, test", dest_phone_number, sender=1
|
|
156
|
+
)
|
|
157
|
+
print(f"send_location: {v}")
|
|
158
|
+
print("sending template")
|
|
159
|
+
v = await app.send_template("hello_world", dest_phone_number, sender=1)
|
|
160
|
+
print(
|
|
161
|
+
f"send_template: {v}"
|
|
162
|
+
) # this returns error if the phone number is not a test phone number
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
await asyncio.sleep(60)
|
|
168
|
+
|
|
169
|
+
async def upload():
|
|
170
|
+
print("uploading media")
|
|
171
|
+
f = await app.upload_media(
|
|
172
|
+
getenv("TEST_IMAGE_PATH"),
|
|
173
|
+
sender=1
|
|
174
|
+
)
|
|
175
|
+
print(f"upload_media: {f}")
|
|
176
|
+
print(f)
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
asyncio.run(run_test())
|
|
180
|
+
asyncio.run(upload())
|