Skip to content

Commit 8606c2b

Browse files
committed
webhooks
1 parent ae962f5 commit 8606c2b

File tree

5 files changed

+140
-51
lines changed

5 files changed

+140
-51
lines changed

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# whatsapp-api-client-python
1+
# whatsapp-api-client-python
22

33
[![Python application](https://github.com/green-api/whatsapp-api-client-python/actions/workflows/python-app.yml/badge.svg)](https://github.com/green-api/whatsapp-api-client-python/actions/workflows/python-app.yml)
44
[![Upload Python Package](https://github.com/green-api/whatsapp-api-client-python/actions/workflows/python-publish.yml/badge.svg)](https://github.com/green-api/whatsapp-api-client-python/actions/workflows/python-publish.yml)
@@ -26,7 +26,7 @@ from whatsapp_api_client_python import API
2626

2727
## Примеры
2828

29-
### Инициализация
29+
### Как инициализировать объект
3030

3131
```
3232
restApi = API.RestApi('https://api.green-api.com',
@@ -106,7 +106,7 @@ resultReceive = restApi.receiving.receiveNotification()
106106
`account.reboot` | Метод предназначен для перезапуска аккаунта | [Reboot.md](https://github.com/green-api/docs/blob/master/ru/docs/api/account/Reboot.md)
107107
`account.setProfilePicture` | Метод предназначен для установки аватара аккаунта | [SetProfilePicture.md](https://github.com/green-api/docs/blob/master/ru/docs/api/account/SetProfilePicture.md)
108108
`account.setSettings` | Метод предназначен для установки настроек аккаунта | [SetSettings.md](https://github.com/green-api/docs/blob/master/ru/docs/api/account/SetSettings.md)
109-
`account.setSystemProxy` | Метод предназначен для установки системного прокси. Используйте метод, когда требуется сбросить пользовательские настройки прокси на системные | [SetSystemProxy.md](https://github.com/green-api/docs/blob/master/ru/docs/api/account/SetSystemProxy.md)
109+
`account.setSystemProxy` | Метод предназначен для установки системного прокси. Нужно используйте метод, когда требуется сбросить пользовательские настройки прокси на системные | [SetSystemProxy.md](https://github.com/green-api/docs/blob/master/ru/docs/api/account/SetSystemProxy.md)
110110
`groups.addGroupParticipant` | Метод добавляет участника в групповой чат | [AddGroupParticipant.md](https://github.com/green-api/docs/blob/master/ru/docs/api/groups/AddGroupParticipant.md)
111111
`groups.createGroup` | Метод добавляет участника в групповой чат | [CreateGroup.md](https://github.com/green-api/docs/blob/master/ru/docs/api/groups/CreateGroup.md)
112112
`groups.getGroupData` | Метод получает данные группового чата | [GetGroupData.md](https://github.com/green-api/docs/blob/master/ru/docs/api/account/GetGroupData.md)
@@ -138,7 +138,7 @@ resultReceive = restApi.receiving.receiveNotification()
138138
`serviceMethods.getAvatar` | Метод возвращает аватар корреспондента или группового чата | [GetAvatar.md](https://github.com/green-api/docs/blob/master/ru/docs/api/service/GetAvatar.md)
139139
`serviceMethods.getContactInfo` | Метод предназначен для получения информации о контакте | [GetContactInfo.md](https://github.com/green-api/docs/blob/master/ru/docs/api/service/GetContactInfo.md)
140140
`serviceMethods.getContacts` | Метод предназначен для получения списка контактов текущего аккаунта | [GetContacts.md](https://github.com/green-api/docs/blob/master/ru/docs/api/service/GetContacts.md)
141-
`serviceMethods.setDisappearingChat` | Метод предназначен для изменения настроек исчезающих сообщений в чатах. Используются стандартные настройки приложения: 0 (выключено), 86400 (24 часа), 604800 (7 дней), 7776000 (90 дней) | [SetDisappearingChat.md](https://github.com/green-api/docs/blob/master/ru/docs/api/service/SetDisappearingChat.md)
141+
`serviceMethods.setDisappearingChat` | Метод предназначен для изменения настроек исчезающих сообщений в чатах. Нужно использовать стандартные настройки приложения: 0 (выключено), 86400 (24 часа), 604800 (7 дней), 7776000 (90 дней) | [SetDisappearingChat.md](https://github.com/green-api/docs/blob/master/ru/docs/api/service/SetDisappearingChat.md)
142142
`serviceMethods.archiveChat` | Метод архивирует чат. Архивировать можно чаты, в которых есть хотя бы одно входящее сообщение | [ArchiveChat.md](https://github.com/green-api/docs/blob/master/ru/docs/api/service/ArchiveChat.md)
143143
`serviceMethods.deleteMessage` | Метод удаляет сообщение из чата | [DeleteMessage.md](https://github.com/green-api/docs/blob/master/ru/docs/api/service/deleteMessage.md)
144144
`serviceMethods.unarchiveChat` | Метод разархивирует чат | [UnarchiveChat.md](https://github.com/green-api/docs/blob/master/ru/docs/api/service/UnarchiveChat.md)

examples/receiveNotification.py

Lines changed: 1 addition & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from os import environ
22
from whatsapp_api_client_python import greenAPI as greenAPI
3-
from datetime import datetime
43

54

65
ID_INSTANCE = environ['ID_INSTANCE']
@@ -11,51 +10,7 @@
1110
API_TOKEN_INSTANCE)
1211

1312
def main():
14-
print('Incoming notifications are being received. '\
15-
'To interrupt, press Ctrl+C')
16-
try:
17-
while True:
18-
resultReceive = restApi.receiving.receiveNotification()
19-
if resultReceive.code == 200:
20-
if resultReceive.data == None:
21-
# There are no incoming notifications,
22-
# we send the request again
23-
continue
24-
body = resultReceive.data['body']
25-
idMessage = body['idMessage']
26-
if body['typeWebhook'] == 'incomingMessageReceived':
27-
senderData = body['senderData']
28-
messageData = body['messageData']
29-
if messageData['typeMessage'] == 'textMessage':
30-
message = messageData['textMessageData']['textMessage']
31-
elif messageData['typeMessage'] == 'extendedTextMessage':
32-
message = messageData['extendedTextMessageData']['text']
33-
elif messageData['typeMessage'] in ('imageMessage',
34-
'videoMessage', 'documentMessage', 'audioMessage'):
35-
message = messageData['fileMessageData']['downloadUrl']
36-
elif messageData['typeMessage'] == 'locationMessage':
37-
message = str(messageData['locationMessageData']\
38-
['latitude']) + ', ' \
39-
+ str(messageData['locationMessageData']\
40-
['longitude'])
41-
elif messageData['typeMessage'] == 'contactMessage':
42-
message = messageData['contactMessageData']['vcard']
43-
elif messageData['typeMessage'] == 'quotedMessage':
44-
message = messageData['extendedTextMessageData']['text']
45-
print(idMessage + ': '
46-
+ 'from ' + senderData['sender']
47-
+ ' (' + senderData['senderName'] + ') - ' + message)
48-
elif body['typeWebhook'] == 'incomingCall':
49-
fromWho = body['from']
50-
callDate = datetime.fromtimestamp(body['timestamp'])
51-
print(idMessage + ': '
52-
+ 'Call from ' + fromWho
53-
+ ' at ' + str(callDate))
54-
restApi.receiving.deleteNotification(
55-
resultReceive.data['receiptId'])
56-
except KeyboardInterrupt:
57-
print('End receiving')
58-
pass
13+
restApi.webhooks.startReceivingNotifications()
5914

6015
if __name__ == "__main__":
6116
main()

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
setuptools.setup(
77
name="whatsapp-api-client-python",
8-
version="0.0.15-alpha",
8+
version="0.0.16-alpha",
99
install_requires=['requests'],
1010
author="Ivan Sadovy",
1111
author_email="sadiv@bk.ru",

whatsapp_api_client_python/greenAPI.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from whatsapp_api_client_python.tools.receiving import Receiving
1313
from whatsapp_api_client_python.tools.sending import Sending
1414
from whatsapp_api_client_python.tools.serviceMethods import ServiceMethods
15+
from whatsapp_api_client_python.tools.webhooks import Webhooks
1516

1617
class RestApi:
1718
'REST API class'
@@ -36,6 +37,7 @@ def __init__(self, host: str,
3637
self.receiving = Receiving(self)
3738
self.sending = Sending(self)
3839
self.serviceMethods = ServiceMethods(self)
40+
self.webhooks = Webhooks(self)
3941

4042
def request(self, method: str, url: str,
4143
payload: any = None, files: array = None):
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
from whatsapp_api_client_python.response import Response
2+
from datetime import datetime
3+
from enum import Enum
4+
5+
6+
class TypeWebhook(Enum):
7+
INCOMING_MESSAGE_RECEIVED = 'incomingMessageReceived'
8+
OUTGOING_MESSAGE_RECEIVED = 'outgoingMessageReceived'
9+
OUTGOING_API_MESSAGE_RECEIVED = 'outgoingAPIMessageReceived'
10+
OUTGOING_MESSAGE_STATUS = 'outgoingMessageStatus'
11+
STATE_INSTANCE_CHANGED = 'stateInstanceChanged'
12+
STATUS_INSTANCE_CHANGED = 'statusInstanceChanged'
13+
DEVICE_INFO = 'deviceInfo'
14+
INCOMING_CALL = 'incomingCall'
15+
16+
class TypeMessage(Enum):
17+
TEXT_MESSAGE = 'textMessage'
18+
IMAGE_MESSAGE = 'imageMessage'
19+
VIDEO_MESSAGE = 'videoMessage'
20+
DOCUMENT_MESSAGE = 'documentMessage'
21+
AUDIO_MESSAGE = 'audioMessage'
22+
LOCATION_MESSAGE = 'locationMessage'
23+
CONTACT_MESSAGE = 'contactMessage'
24+
EXTENDED_TEXT_MESSAGE = 'extendedTextMessage'
25+
QUOTED_MESSAGE = 'quotedMessage'
26+
27+
class Webhooks:
28+
def __init__(self, restApi) -> None:
29+
self.restApi = restApi
30+
self.started = False
31+
32+
def startReceivingNotifications(self) -> bool:
33+
self.started = True
34+
self.job()
35+
36+
def stopReceivingNotifications(self) -> bool:
37+
self.started = False
38+
39+
def onIncomingMessageReceived(body):
40+
idMessage = body['idMessage']
41+
eventDate = datetime.fromtimestamp(body['timestamp'])
42+
senderData = body['senderData']
43+
messageData = body['messageData']
44+
print(idMessage + ': '
45+
+ 'At ' + eventDate + 'Incoming from ' \
46+
+ senderData + ' message = ' + messageData)
47+
48+
def onIncomingCall(body):
49+
idMessage = body['idMessage']
50+
eventDate = datetime.fromtimestamp(body['timestamp'])
51+
fromWho = body['from']
52+
print(idMessage + ': '
53+
+ 'Call from ' + fromWho
54+
+ ' at ' + str(eventDate))
55+
56+
def onDeviceInfo(body):
57+
eventDate = datetime.fromtimestamp(body['timestamp'])
58+
deviceData = body['deviceData']
59+
print('At ' + eventDate + ': ' + deviceData)
60+
61+
def onOutgoingMessageReceived(body):
62+
idMessage = body['idMessage']
63+
eventDate = datetime.fromtimestamp(body['timestamp'])
64+
senderData = body['senderData']
65+
messageData = body['messageData']
66+
print(idMessage + ': '
67+
+ 'At ' + eventDate + 'Outgoing from ' \
68+
+ senderData + ' message = ' + messageData)
69+
70+
def onOutgoingAPIMessageReceived(body):
71+
idMessage = body['idMessage']
72+
eventDate = datetime.fromtimestamp(body['timestamp'])
73+
senderData = body['senderData']
74+
messageData = body['messageData']
75+
print(idMessage + ': '
76+
+ 'At ' + eventDate + ' API outgoing from ' + senderData + \
77+
' message = ' + messageData)
78+
79+
def onOutgoingMessageStatus(body):
80+
idMessage = body['idMessage']
81+
status = body['status']
82+
eventDate = datetime.fromtimestamp(body['timestamp'])
83+
print(idMessage + ': '
84+
+ 'At ' + eventDate + ' status = ' + status)
85+
86+
def onStateInstanceChanged(body):
87+
eventDate = datetime.fromtimestamp(body['timestamp'])
88+
stateInstance = body['stateInstance']
89+
print('At ' + eventDate + ' state instance = ' + stateInstance)
90+
91+
def onStatusInstanceChanged(body):
92+
eventDate = datetime.fromtimestamp(body['timestamp'])
93+
statusInstance = body['statusInstance']
94+
print('At ' + eventDate + ' status instance = ' + statusInstance)
95+
96+
def job(self) -> None:
97+
print('Incoming notifications are being received. '\
98+
'To interrupt, press Ctrl+C')
99+
try:
100+
while self.started == True:
101+
resultReceive = self.restApi.receiving.receiveNotification()
102+
if resultReceive.code == 200:
103+
if resultReceive.data == None:
104+
# There are no incoming notifications,
105+
# we send the request again
106+
continue
107+
body = resultReceive.data['body']
108+
typeWebhook = body['typeWebhook']
109+
if typeWebhook == TypeWebhook.INCOMING_MESSAGE_RECEIVED:
110+
self.onIncomingMessageReceived(body)
111+
elif typeWebhook == TypeWebhook.DEVICE_INFO:
112+
self.onDeviceInfo(body)
113+
elif typeWebhook == TypeWebhook.INCOMING_CALL:
114+
self.onIncomingCall(body)
115+
elif typeWebhook == TypeWebhook.INCOMING_MESSAGE_RECEIVED:
116+
self.onIncomingMessageReceived(body)
117+
elif typeWebhook == TypeWebhook.OUTGOING_API_MESSAGE_RECEIVED:
118+
self.onOutgoingAPIMessageReceived(body)
119+
elif typeWebhook == TypeWebhook.OUTGOING_MESSAGE_RECEIVED:
120+
self.onOutgoingMessageReceived(body)
121+
elif typeWebhook == TypeWebhook.OUTGOING_MESSAGE_STATUS:
122+
self.onOutgoingMessageStatus(body)
123+
elif typeWebhook == TypeWebhook.STATE_INSTANCE_CHANGED:
124+
self.onStateInstanceChanged(body)
125+
elif typeWebhook == TypeWebhook.STATUS_INSTANCE_CHANGED:
126+
self.onStatusInstanceChanged(body)
127+
self.restApi.receiving.deleteNotification(
128+
resultReceive.data['receiptId'])
129+
print('End receiving')
130+
except KeyboardInterrupt:
131+
print('End receiving')
132+
pass

0 commit comments

Comments
 (0)