OSDN Git Service

test
[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 os, hmac, base64, hashlib, re, json
12 import pytz, pymongo
13 from datetime import datetime
14 from linebot import LineBotApi, WebhookParser
15 from linebot.exceptions import InvalidSignatureError
16 from linebot.models import TextSendMessage
17
18
19 class WebHookHandler(tornado.web.RequestHandler):   
20     def get(self):
21         mes = self.get_argument('code','')
22         self.write(self.main(mes))
23         
24     def main(self,no):
25         pz = pytz.timezone('Asia/Tokyo')
26         now = datetime.now(pz)
27         t = now.hour
28         w = now.weekday()
29         if (w < 5)and(t >= 9)and(t < 16):
30             return u'仕事中.'
31         db = pymongo.MongoClient(uri)[ac]
32         table = db['glove']
33         item = table.find({'no':re.compile(no,re.IGNORECASE)})
34         if item.count() == 1:
35             x = item[0]
36             ans = x['name']+'\n'+x['no']
37         elif item.count() > 1:
38             ans = ''    
39             obj = list(item)
40             list1 = sorted(obj, key=lambda k:k['name'])
41             for x in list1:
42                 if x['name'] == list1[0]['name']:
43                     ans += x['name']+'\n'+x['no']+'\n'
44                 else:
45                     break
46             else:
47                 return ans         
48             ans = ''             
49             for x in sorted(list1, key=lambda k:k['no']):
50                 ans += x['no']+'\n'
51         else:
52             ans = ''
53             for x in table.find().sort('no'):
54                 ans += x['no']+'\n'
55         return ans
56             
57     def post(self):
58         events = tornado.escape.json_decode(self.request)
59         for event in events:
60             if event['replyToken'] != None:
61                 linebot.reply_message(
62                     event['replyToken'],
63                     TextSendMessage(text=self.main('RR')))
64         return
65     
66         header = self.request.headers.get('X-Line-Signature','')
67         body = json.load(self.request.body)
68         hashid = hmac.new(header.get('X-Line-Signature'),
69             body.decode('utf-8'), hashlib.sha256).digest()
70         signature = base64.b64encode(hashid)
71         parser = WebhookParser(ch)
72         try:
73             events = parser.parse(body, signature)
74         except InvalidSignatureError:
75             raise tornado.web.HTTPError(400)
76             return
77         for event in events:
78             if (event['type'] == 'text')and(event['message']['type'] == 'text'):
79                 linebot.reply_message(
80                     event.reply_token,
81                     TextSendMessage(text=self.main(event.Message.text))
82                 )
83         
84 class DummyHandler(tornado.web.RequestHandler):
85     def get(self):
86         f = open('data.txt')
87         data = f.read()
88         f.close()
89         db = pymongo.MongoClient(uri)[ac]
90         table = db['glove']
91         item = []
92         for x in data.split('\n'):
93             if x[0] == '@':
94                 dic = {}
95                 dic['name'] = x[1:]
96             else:
97                 dic['no'] = x
98                 item.append(dic)
99         table.remove()
100         for x in item:
101             table.insert(x)
102
103 application = tornado.web.Application([(r'/callback',WebHookHandler),(r'/init',DummyHandler)])
104
105 if __name__ == '__main__':
106     token = os.environ['Access_Token']
107     ch = os.environ['Channel_Secret']
108     uri = os.environ['MONGODB_URI']
109     ac = os.environ['ACCOUNT']
110     port = int(os.environ.get('PORT',5000))#important in heroku
111     linebot = LineBotApi(token)
112     webhook = WebhookParser(ch)  
113     application.listen(port)
114     tornado.ioloop.IOLoop.instance().start()
115