# -*- 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 ] [--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()