Skip to content

Commit 283acc1

Browse files
committed
tornado and test
1 parent 58639a9 commit 283acc1

5 files changed

Lines changed: 86 additions & 69 deletions

File tree

examples/echo.py

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
from datetime import datetime
22
import json
33

4-
import whatsapp_api_webhook_server_python.webhooksHandler as webhooksHandler
4+
import whatsapp_api_webhook_server_python.webhooksHandler as handler
55

66

7-
def onEvent(webhookHandler: webhooksHandler, typeWebhook: str, body):
7+
def onEvent(webhookHandler: handler.WebhooksHandler, typeWebhook: str, body):
88
if typeWebhook == 'incomingMessageReceived':
99
onIncomingMessageReceived(webhookHandler, body)
1010
elif typeWebhook == 'deviceInfo':
@@ -24,7 +24,7 @@ def onEvent(webhookHandler: webhooksHandler, typeWebhook: str, body):
2424
elif typeWebhook == 'statusInstanceChanged':
2525
onStatusInstanceChanged(webhookHandler, body)
2626

27-
def onIncomingMessageReceived(webhookHandler: webhooksHandler, body: object):
27+
def onIncomingMessageReceived(webhookHandler: handler.WebhooksHandler, body: object):
2828
idMessage = body['idMessage']
2929
eventDate = datetime.fromtimestamp(body['timestamp'])
3030
senderData = body['senderData']
@@ -33,28 +33,31 @@ def onIncomingMessageReceived(webhookHandler: webhooksHandler, body: object):
3333
+ 'At ' + str(eventDate) + ' Incoming from ' \
3434
+ json.dumps(senderData, ensure_ascii=False) \
3535
+ ' message = ' + json.dumps(messageData, ensure_ascii=False)
36-
webhookHandler.wfile.write((50 * '-' + '\n').encode("utf-8"))
37-
webhookHandler.wfile.write(TextOut.encode("utf-8"))
36+
webhookHandler.set_status(200)
37+
webhookHandler.write((50 * '-' + '\n').encode("utf-8"))
38+
webhookHandler.write(TextOut.encode("utf-8"))
3839

39-
def onIncomingCall(webhookHandler: webhooksHandler, body):
40+
def onIncomingCall(webhookHandler: handler.WebhooksHandler, body):
4041
idMessage = body['idMessage']
4142
eventDate = datetime.fromtimestamp(body['timestamp'])
4243
fromWho = body['from']
4344
TextOut = idMessage + ': ' \
4445
+ 'Call from ' + fromWho \
4546
+ ' at ' + str(eventDate)
46-
webhookHandler.wfile.write((50 * '-' + '\n').encode("utf-8"))
47-
webhookHandler.wfile.write(TextOut.encode("utf-8"))
47+
webhookHandler.set_status(200)
48+
webhookHandler.write((50 * '-' + '\n').encode("utf-8"))
49+
webhookHandler.write(TextOut.encode("utf-8"))
4850

49-
def onDeviceInfo(webhookHandler: webhooksHandler, body):
51+
def onDeviceInfo(webhookHandler: handler.WebhooksHandler, body):
5052
eventDate = datetime.fromtimestamp(body['timestamp'])
5153
deviceData = body['deviceData']
5254
TextOut = 'At ' + str(eventDate) + ': ' \
5355
+ json.dumps(deviceData, ensure_ascii=False)
54-
webhookHandler.wfile.write((50 * '-' + '\n').encode("utf-8"))
55-
webhookHandler.wfile.write(TextOut.encode("utf-8"))
56+
webhookHandler.set_status(200)
57+
webhookHandler.write((50 * '-' + '\n').encode("utf-8"))
58+
webhookHandler.write(TextOut.encode("utf-8"))
5659

57-
def onOutgoingMessageReceived(webhookHandler: webhooksHandler, body):
60+
def onOutgoingMessageReceived(webhookHandler: handler.WebhooksHandler, body):
5861
idMessage = body['idMessage']
5962
eventDate = datetime.fromtimestamp(body['timestamp'])
6063
senderData = body['senderData']
@@ -63,10 +66,11 @@ def onOutgoingMessageReceived(webhookHandler: webhooksHandler, body):
6366
+ 'At ' + str(eventDate) + ' Outgoing from ' \
6467
+ json.dumps(senderData, ensure_ascii=False) \
6568
+ ' message = ' + json.dumps(messageData, ensure_ascii=False)
66-
webhookHandler.wfile.write((50 * '-' + '\n').encode("utf-8"))
67-
webhookHandler.wfile.write(TextOut.encode("utf-8"))
69+
webhookHandler.set_status(200)
70+
webhookHandler.write((50 * '-' + '\n').encode("utf-8"))
71+
webhookHandler.write(TextOut.encode("utf-8"))
6872

69-
def onOutgoingAPIMessageReceived(webhookHandler: webhooksHandler, body):
73+
def onOutgoingAPIMessageReceived(webhookHandler: handler.WebhooksHandler, body):
7074
idMessage = body['idMessage']
7175
eventDate = datetime.fromtimestamp(body['timestamp'])
7276
senderData = body['senderData']
@@ -75,35 +79,39 @@ def onOutgoingAPIMessageReceived(webhookHandler: webhooksHandler, body):
7579
+ 'At ' + str(eventDate) + ' API outgoing from ' \
7680
+ json.dumps(senderData, ensure_ascii=False) + \
7781
' message = ' + json.dumps(messageData, ensure_ascii=False)
78-
webhookHandler.wfile.write((50 * '-' + '\n').encode("utf-8"))
79-
webhookHandler.wfile.write(TextOut.encode("utf-8"))
82+
webhookHandler.set_status(200)
83+
webhookHandler.write((50 * '-' + '\n').encode("utf-8"))
84+
webhookHandler.write(TextOut.encode("utf-8"))
8085

81-
def onOutgoingMessageStatus(webhookHandler: webhooksHandler, body):
86+
def onOutgoingMessageStatus(webhookHandler: handler.WebhooksHandler, body):
8287
idMessage = body['idMessage']
8388
status = body['status']
8489
eventDate = datetime.fromtimestamp(body['timestamp'])
8590
TextOut = idMessage + ': ' + str(eventDate) + ' status = ' + status
86-
webhookHandler.wfile.write((50 * '-' + '\n').encode("utf-8"))
87-
webhookHandler.wfile.write(TextOut.encode("utf-8"))
91+
webhookHandler.set_status(200)
92+
webhookHandler.write((50 * '-' + '\n').encode("utf-8"))
93+
webhookHandler.write(TextOut.encode("utf-8"))
8894

89-
def onStateInstanceChanged(webhookHandler: webhooksHandler, body):
95+
def onStateInstanceChanged(webhookHandler: handler.WebhooksHandler, body):
9096
eventDate = datetime.fromtimestamp(body['timestamp'])
9197
stateInstance = body['stateInstance']
9298
TextOut = 'At ' + str(eventDate) + ' state instance = ' \
9399
+ json.dumps(stateInstance, ensure_ascii=False)
94-
webhookHandler.wfile.write((50 * '-' + '\n').encode("utf-8"))
95-
webhookHandler.wfile.write(TextOut.encode("utf-8"))
100+
webhookHandler.set_status(200)
101+
webhookHandler.write((50 * '-' + '\n').encode("utf-8"))
102+
webhookHandler.write(TextOut.encode("utf-8"))
96103

97-
def onStatusInstanceChanged(webhookHandler: webhooksHandler, body):
104+
def onStatusInstanceChanged(webhookHandler: handler.WebhooksHandler, body):
98105
eventDate = datetime.fromtimestamp(body['timestamp'])
99106
statusInstance = body['statusInstance']
100107
TextOut = 'At ' + str(eventDate) + ' status instance = ' \
101108
+ json.dumps(statusInstance, ensure_ascii=False)
102-
webhookHandler.wfile.write((50 * '-' + '\n').encode("utf-8"))
103-
webhookHandler.wfile.write(TextOut.encode("utf-8"))
109+
webhookHandler.set_status(200)
110+
webhookHandler.write((50 * '-' + '\n').encode("utf-8"))
111+
webhookHandler.write(TextOut.encode("utf-8"))
104112

105113
def main():
106-
webhooksHandler.startServer('127.0.0.1', 8000, onEvent)
114+
handler.startServer('127.0.0.1', 8000, onEvent)
107115

108116
if __name__ == "__main__":
109117
main()

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
requests
1+
tornado

setup.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55

66
setuptools.setup(
77
name="whatsapp-api-webhook-server-python",
8-
version="0.0.3",
9-
install_requires=[],
8+
version="0.0.4",
9+
install_requires=['tornado'],
1010
author="Ivan Sadovy",
1111
author_email="sadiv@bk.ru",
1212
description="This library helps you easily create a python '\

tests/test_main.py

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,25 @@
1+
import time
12
import requests
2-
import whatsapp_api_webhook_server_python.webhooksHandler as webhooksHandler
3+
import asyncio
4+
import whatsapp_api_webhook_server_python.webhooksHandler as handler
35

46
result = None
57

68
class TestClass:
7-
def test_getResponse(self):
8-
webhooksHandler.startServer('127.0.0.1', 8000, onEvent)
9-
headers = {}
10-
payload = {
11-
'receiptId':1,
12-
'body':{'typeWebhook':'incomingMessageReceived'}}
13-
response = requests.request('POST', 'https://127.0.0.1:8000',
14-
headers=headers, data=payload)
15-
if response.code != 200:
16-
print('Error code: ' + response.code)
17-
assert response.code == 200
9+
def test_Started(self):
10+
started = True
11+
try:
12+
handler.startServer('http://127.0.0.1', 8000, onEvent, False)
13+
except:
14+
started = False
15+
assert started == True
1816

19-
def onEvent(webhooksHandler: webhooksHandler, typeWebhook: str, body):
17+
def onEvent(webhooksHandler: handler.WebhooksHandler, typeWebhook: str, body):
2018
global result
2119
result = True
2220

2321
def main():
24-
TestClass.test_getResponse(TestClass)
22+
TestClass.test_Started(TestClass)
2523

2624
if __name__ == "__main__":
2725
main()
Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,46 @@
1-
from http.server import HTTPServer
2-
from http.server import BaseHTTPRequestHandler
1+
import tornado.ioloop
2+
import tornado.web
33

44
from whatsapp_api_webhook_server_python.webhooks import Webhooks
55

66

7-
class webhooksHandler(BaseHTTPRequestHandler):
7+
class WebhooksHandler(tornado.web.RequestHandler):
88

9-
def do_GET(self):
10-
length = self.headers['Content-Length']
9+
def get(self):
10+
length = self.request.headers.get('Content-Length')
1111
if length != None:
12-
content_length = int()
13-
body = self.rfile.read(content_length)
14-
Webhooks.webhookProccessing(body, self.onEvent)
12+
dataBytes = self.request.body
13+
dataText = dataBytes.decode("utf-8", 'ignore')
14+
Webhooks.webhookProccessing(dataText, self.onEvent)
1515
else:
16-
self.send_response(200)
17-
self.send_header('Content-type', 'text/html')
18-
self.end_headers()
16+
self.set_status(200)
17+
self.set_header('Content-type', 'text/html')
1918

20-
def do_POST(self):
21-
content_length = int(self.headers['Content-Length'])
22-
dataBytes = self.rfile.read(content_length)
23-
dataText = dataBytes.decode("utf-8", 'ignore')
24-
Webhooks.webhookProccessing(dataText, self.onEvent)
19+
def post(self):
20+
length = self.request.headers.get('Content-Length')
21+
if length != None:
22+
dataBytes = self.request.body
23+
dataText = dataBytes.decode("utf-8", 'ignore')
24+
Webhooks.webhookProccessing(dataText, self.onEvent)
2525

26-
def do_DELETE(self):
27-
content_length = int(self.headers['Content-Length'])
28-
body = self.rfile.read(content_length)
29-
Webhooks.webhookProccessing(body, self.onEvent)
26+
def delete(self):
27+
length = self.request.headers.get('Content-Length')
28+
if length != None:
29+
dataBytes = self.request.body
30+
dataText = dataBytes.decode("utf-8", 'ignore')
31+
Webhooks.webhookProccessing(dataText, self.onEvent)
3032

31-
def startServer(host: str, port: int, onEvent):
32-
Handler = webhooksHandler
33-
Handler.onEvent = onEvent
34-
httpd = HTTPServer((host, port), Handler)
35-
httpd.serve_forever()
33+
class Application(tornado.web.Application):
34+
def __init__(self, handler):
35+
handlers = [
36+
(r"/", handler),
37+
]
38+
tornado.web.Application.__init__(self, handlers)
39+
40+
def startServer(host: str, port: int, onEvent, startLoop: bool = True):
41+
handler = WebhooksHandler
42+
handler.onEvent = onEvent
43+
http_server = tornado.httpserver.HTTPServer(Application(handler))
44+
http_server.listen(port=port, address=host)
45+
if startLoop:
46+
tornado.ioloop.IOLoop.instance().start()

0 commit comments

Comments
 (0)