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