-
Notifications
You must be signed in to change notification settings - Fork 1k
/
app.py
118 lines (98 loc) · 3.48 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# -*- coding: utf-8 -*-
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import os
import sys
import wsgiref.simple_server
from argparse import ArgumentParser
from builtins import bytes
from linebot.v3 import (
WebhookParser
)
from linebot.v3.exceptions import (
InvalidSignatureError
)
from linebot.v3.webhooks import (
MessageEvent,
TextMessageContent,
)
from linebot.v3.messaging import (
Configuration,
ApiClient,
MessagingApi,
ReplyMessageRequest,
TextMessage
)
from linebot.v3.utils import PY3
# get channel_secret and channel_access_token from your environment variable
channel_secret = os.getenv('LINE_CHANNEL_SECRET', None)
channel_access_token = os.getenv('LINE_CHANNEL_ACCESS_TOKEN', None)
if channel_secret is None:
print('Specify LINE_CHANNEL_SECRET as environment variable.')
sys.exit(1)
if channel_access_token is None:
print('Specify LINE_CHANNEL_ACCESS_TOKEN as environment variable.')
sys.exit(1)
parser = WebhookParser(channel_secret)
configuration = Configuration(
access_token=channel_access_token
)
def application(environ, start_response):
# check request path
if environ['PATH_INFO'] != '/callback':
start_response('404 Not Found', [])
return create_body('Not Found')
# check request method
if environ['REQUEST_METHOD'] != 'POST':
start_response('405 Method Not Allowed', [])
return create_body('Method Not Allowed')
# get X-Line-Signature header value
signature = environ['HTTP_X_LINE_SIGNATURE']
# get request body as text
wsgi_input = environ['wsgi.input']
content_length = int(environ['CONTENT_LENGTH'])
body = wsgi_input.read(content_length).decode('utf-8')
# parse webhook body
try:
events = parser.parse(body, signature)
except InvalidSignatureError:
start_response('400 Bad Request', [])
return create_body('Bad Request')
# if event is MessageEvent and message is TextMessage, then echo text
for event in events:
if not isinstance(event, MessageEvent):
continue
if not isinstance(event.message, TextMessageContent):
continue
with ApiClient(configuration) as api_client:
line_bot_api = MessagingApi(api_client)
line_bot_api.reply_message_with_http_info(
ReplyMessageRequest(
reply_token=event.reply_token,
messages=[TextMessage(text=event.message.text)]
)
)
start_response('200 OK', [])
return create_body('OK')
def create_body(text):
if PY3:
return [bytes(text, 'utf-8')]
else:
return text
if __name__ == '__main__':
arg_parser = ArgumentParser(
usage='Usage: python ' + __file__ + ' [--port <port>] [--help]'
)
arg_parser.add_argument('-p', '--port', type=int, default=8000, help='port')
options = arg_parser.parse_args()
httpd = wsgiref.simple_server.make_server('', options.port, application)
httpd.serve_forever()