OSDN Git Service

署名の検証
[simple-tornado-bot/simple-tornado-bot.git] / bot.py
1 # -*- coding: utf-8 -*-
2 """
3 Created on Sat Sep  1 11:18:39 2018
4
5 @author: fuke masasi
6 """
7
8 import tornado.ioloop
9 import tornado.web
10 import json, os, hmac, base64, hashlib
11 from linebot import LineBotApi, WebhookParser, WebhookHandler
12 from linebot.exceptions import InvalidSignatureError
13 from linebot.models import MessageEvent, TextMessage, TextSendMessage
14
15
16 class WebHookHandler(tornado.web.RequestHandler):    
17     def post(self):
18         header = json.load(self.request.headers['X-Line-Signature'])
19         body = json.load(self.request.body)
20         hash = hmac.new(header.encode('utf-8'),
21             body.encode('utf-8'), hashlib.sha256).digest()
22         signature = base64.b64encode(hash)
23         try:
24             events = webhook.parse(body, signature)
25         except InvalidSignatureError:
26             raise tornado.web.HTTPError(400)
27             return
28         for event in events:
29             if not isinstance(event, MessageEvent):
30                 continue
31             if not isinstance(event.message, TextMessage):
32                 continue
33             linebot.reply_message(
34                 event.reply_token,
35                 TextSendMessage(text=event.message.text)
36             )
37         self.set_status(200)
38
39 application = tornado.web.Application([(r'/callback',WebHookHandler)])
40
41 if __name__ == '__main__':
42     token = os.environ['Access_Token']
43     ch = os.environ['Channel_Secret']
44     linebot = LineBotApi(token)
45     webhook = WebhookParser(ch)  
46     application.listen(5000)
47     tornado.ioloop.IOLoop.instance().start()