OSDN Git Service

no message
[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
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         header = self.request.headers.get('X-Line-Signature','')
59         body = tornado.escape.json_decode(self.request.body)
60         '''
61         hashid = hmac.new(header.get('X-Line-Signature'),
62             body.decode('utf-8'), hashlib.sha256).digest()
63         signature = base64.b64encode(hashid)
64         parser = WebhookParser(ch)
65         try:
66             events = parser.parse(body, header)
67         except InvalidSignatureError:
68             raise tornado.web.HTTPError(400)
69             return
70         for event in events:
71             if (event['type'] == 'text')and(event['message']['type'] == 'text'):
72                 linebot.reply_message(
73                     event.reply_token,
74                     TextSendMessage(text=self.main(event.Message.text))
75                 )
76         '''
77         event = body
78         linebot.reply_message(event['replyToken'],text=self.main(event['message']['text']))
79         
80 class DummyHandler(tornado.web.RequestHandler):
81     def get(self):
82         f = open('data.txt')
83         data = f.read()
84         f.close()
85         db = pymongo.MongoClient(uri)[ac]
86         table = db['glove']
87         item = []
88         for x in data.split('\n'):
89             if x[0] == '@':
90                 dic = {}
91                 dic['name'] = x[1:]
92             else:
93                 dic['no'] = x
94                 item.append(dic)
95         table.remove()
96         for x in item:
97             table.insert(x)
98
99 application = tornado.web.Application([(r'/callback',WebHookHandler),(r'/init',DummyHandler)])
100
101 if __name__ == '__main__':
102     token = os.environ['Access_Token']
103     ch = os.environ['Channel_Secret']
104     uri = os.environ['MONGODB_URI']
105     ac = os.environ['ACCOUNT']
106     port = int(os.environ.get('PORT',5000))#important in heroku
107     linebot = LineBotApi(token)
108     webhook = WebhookParser(ch)  
109     application.listen(port)
110     tornado.ioloop.IOLoop.instance().start()
111