Symfoware

Symfowareについての考察blog

LINE API + Google App Engine + Pythonでボットを作成する

LINE APIをPythonで触ってみています。
LINE 素のPythonでpush通知を送信する
LINE API + Pythonでスタンプや画像メッセージの送信

今回はユーザーから送信されたメッセージを受け取り、応答してみようとお込みます。

Webhook送信



管理サイトを開いて「Channel基本設定」を表示します。
https://developers.line.me/

「メッセージ送受信設定」で「Webhook送信」を「利用する」に変更。
「Webhook URL」にメッセージを受信したときのデータ送信先を指定するのですが、
「※SSLのみ対応」でどうしたものか。


Google App Engine



Google App Engineのスタンダードを利用すれば無料&デフォルトでSSL対応です。
Ubuntu 18.04にGoogle App Engine(GAE) + Pythonの開発環境を構築する

GAE + Pythonでbotアプリを作ってみることにしました。



Webhook



こちらを参考に処理を記載していきます。
Webhook

送信された文字をそのまま返信するエコーボットです。
試行錯誤しながら書いたプログラムがこちら。

・main.py


  1. # -*- coding:utf-8 -*-
  2. import logging
  3. import base64
  4. import hashlib
  5. import hmac
  6. import urllib2
  7. import json
  8. import webapp2
  9. class MainPage(webapp2.RequestHandler):
  10.     def get(self):
  11.         logging.debug('### debug output ###')
  12.         self.response.headers['Content-Type'] = 'text/plain'
  13.         self.response.write('LINE API BOT')
  14. class Webhook(webapp2.RequestHandler):
  15.     def get(self):
  16.         self.response.set_status(200)
  17.         self.response.write('pre-prod-10')
  18.     def post(self):
  19.         
  20.         # signatureの比較
  21.         signature_header = self.request.headers['X-Line-Signature']
  22.         body = self.request.body
  23.         if not self._check_signature(signature_header, body):
  24.             self.response.set_status(400)
  25.             return
  26.         # jsonから連想配列に変換
  27.         data = json.loads(body)
  28.         # イベントごとに処理
  29.         for event in data['events']:
  30.             self._process_event(event)
  31.         #self._send_message('ok')
  32.         
  33.         # ステータスコード 200を応答
  34.         self.response.set_status(200)
  35.     def _process_event(self, event):
  36.         replyToken = event['replyToken']
  37.         source = event['source']
  38.         message = event['message']
  39.         url = 'https://api.line.me/v2/bot/message/reply'
  40.         # 返信のデータ
  41.         data = {
  42.             'replyToken' : replyToken,
  43.             'messages' : [
  44.                 {
  45.                     'type' : 'text',
  46.                     'text' : message['text']
  47.                 }
  48.             ]
  49.         }
  50.         self._send_post_data(url, data)
  51.     # X-Line-Signatureの妥当性チェック
  52.     def _check_signature(self, signature_header, body):
  53.         channel_secret = '[管理画面のChannel Secret]' # Channel secret string
  54.         hash = hmac.new(channel_secret, body, hashlib.sha256).digest()
  55.         signature = base64.b64encode(hash)
  56.         # Compare X-Line-Signature request header and the signature
  57.         return signature == signature_header
  58.     def _send_message(self, text):
  59.         url = 'https://api.line.me/v2/bot/message/push'
  60.         user_id = 'xxxx'
  61.         # 送信用のデータ
  62.         data = {
  63.             'to' : user_id,
  64.             'messages' : [
  65.                 {
  66.                     'type' : 'text',
  67.                     'text' : text
  68.                 }
  69.             ]
  70.         }
  71.         self._send_post_data(url, data)
  72.     def _send_post_data(self, url, data):
  73.         
  74.         channel_access_token = '[管理画面のアクセストークン]'
  75.         # Content-Type:application/json
  76.         # Authorization:Bearer {channel access token}
  77.         # method:post
  78.         request = urllib2.Request(url, data=json.dumps(data))
  79.         request.add_header('Content-Type', 'application/json')
  80.         request.add_header('Authorization', 'Bearer ' + channel_access_token)
  81.         request.get_method = lambda: 'POST'
  82.         # 送信実行
  83.         response = urllib2.urlopen(request)
  84.         ret = response.read()
  85. app = webapp2.WSGIApplication([
  86.     ('/', MainPage),
  87.     ('/webhook', Webhook)
  88. ], debug=True)




・app.yaml


  1. runtime: python27
  2. api_version: 1
  3. threadsafe: true
  4. handlers:
  5. - url: /.*
  6. script: main.app
  7. skip_files:
  8. - env/
  9. - ^(.*/)?\.pyc$



メッセージを送ると応答がありました。

875_01.png

Google App EngineでもLINEボットが作れそうです。
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2018/05/04(金) 16:20:47|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Ubuntu 18.04 に OpenJDK 11をインストール | ホーム | Google App Engine + Pythonでローカル実行、サーバー実行時のログの出力>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
https://symfoware.blog.fc2.com/tb.php/2170-12a59840
この記事にトラックバックする(FC2ブログユーザー)