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 tornado.escape
11 import json, os, hmac, base64, hashlib, pytz, pymongo, re
12 from datetime import datetime
13 from linebot import LineBotApi, WebhookParser, WebhookHandler
14 from linebot.exceptions import InvalidSignatureError
15 from linebot.models import TextSendMessage
16
17
18 class WebHookHandler(tornado.web.RequestHandler):   
19     def get(self):
20         self.write(self.main('2'))
21         
22     def main(self,no):
23         pz = pytz.timezone('Asia/Tokyo')
24         now = datetime.now(pz)
25         t = now.hour
26         w = now.weekday()
27         if (w < 5)and(t >= 9)and(t < 16):
28             obj = {'type':'text','text':u'仕事中'}
29             j = json.dump(obj, ensure_ascii=False)
30             self.write(j)
31             return
32         db = pymongo.MongoClient(uri)[ac]
33         table = db['glove']
34         item = table.find({'no':re.compile(no)})
35         if item.count() == 1:
36             ans = item['name']+'\n'+item['no']
37         else:
38             ans = ''
39             for x in item.sort('no'):
40                 ans += x['no']+'\n'
41             if ans == '':
42                 for x in table.find().sort('no'):
43                     ans += x['no']+'\n'
44         return ans
45         
46     def post(self):
47         header = json.load(self.request.headers)
48         body = json.load(self.request.body)
49         hash = hmac.new(header['X-LINE-SIGNATURE'].encode('utf-8'),
50             body.encode('utf-8'), hashlib.sha256).digest()
51         signature = base64.b64encode(hash)
52         try:
53             events = webhook.parse(body, signature)
54         except InvalidSignatureError:
55             raise tornado.web.HTTPError(400)
56             return
57         for event in events:
58             if (event['type'] == 'text')and(event['message']['type'] == 'text'):
59                 linebot.reply_message(
60                     event.reply_token,
61                     TextSendMessage(text=self.main(event.Message.text))
62                 )
63         
64 class DummyHandler(tornado.web.RequestHandler):
65     def get(self):
66         f = open('data.txt')
67         data = f.read()
68         f.close()
69         db = pymongo.MongoClient(uri)[ac]
70         table = db['glove']
71         item = []
72         for x in data.split('\n'):
73             if x[0] == '@':
74                 dic = {}
75                 dic['name'] = x[1:]
76             else:
77                 dic['no'] = x
78                 item.append(dic)
79         table.remove()
80         for x in item:
81             table.insert(x)
82
83 application = tornado.web.Application([(r'/callback',WebHookHandler),(r'/init',DummyHandler)],{'Debug':True})
84
85 if __name__ == '__main__':
86     token = os.environ['Access_Token']
87     ch = os.environ['Channel_Secret']
88     uri = os.environ['MONGODB_URI']
89     ac = os.environ['ACCOUNT']
90     linebot = LineBotApi(token)
91     webhook = WebhookParser(ch)  
92     application.listen(5000)
93     tornado.ioloop.IOLoop.instance().start()
94