OSDN Git Service

test commit
[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, 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 = self.list(sorted(list1, key=lambda k:k['no']))
49         else:
50             ans = self.list(table.find().sort('no'))
51         return ans
52     
53     def list(self,item):
54         i = 0
55         ans = ''
56         for x in item:
57             ans += x['no']+'  '
58             if i == 2:
59                 ans += '\n'
60                 i = 0
61             i += 1
62         return ans
63                         
64     def post(self):
65         '''
66         signature = self.request.headers['X-Line-Signature']
67         body = self.request.body
68         parser = WebhookParser(ch)
69         try:
70             parser.parse(body, signature)
71         except InvalidSignatureError:
72             tornado.web.HTTPError(404)
73             return
74         '''
75         dic = tornado.escape.json_decode(self.request.body)              
76         for event in dic['events']:
77             if 'replyToken' in event:
78                 linebot.reply_message(
79                     event['replyToken'],
80                     TextSendMessage(text=self.main(event['message']['text']))
81                 )
82         
83 class DummyHandler(tornado.web.RequestHandler):
84     def get(self):
85         f = open('data.txt')
86         data = f.read()
87         f.close()
88         db = pymongo.MongoClient(uri)[ac]
89         table = db['glove']
90         item = []
91         for x in data.split('\n'):
92             if x[0] == '@':
93                 dic = {}
94                 dic['name'] = x[1:]
95             else:
96                 dic['no'] = x
97                 item.append(dic)
98         table.remove()
99         for x in item:
100             table.insert(x)
101
102 application = tornado.web.Application([(r'/callback',WebHookHandler),(r'/init',DummyHandler)])
103
104 if __name__ == '__main__':
105     token = os.environ['Access_Token']
106     ch = os.environ['Channel_Secret']
107     uri = os.environ['MONGODB_URI']
108     ac = os.environ['ACCOUNT']
109     port = int(os.environ.get('PORT',5000))#important in heroku
110     linebot = LineBotApi(token)
111     webhook = WebhookParser(ch)  
112     application.listen(port)
113     tornado.ioloop.IOLoop.instance().start()
114