linebot入門編

目標:送られてきた文字列を判別して返信する


目標

「hello」と送られたら「world」と返し、それ以外の言葉が送られたら「えびちゃん」と返す

サンプルコードはこちら


      #!/usr/bin/python3
      # -*- coding: utf-8 -*-
      import cgitb
      cgitb.enable()
      import json, sys, requests
      CHANNEL_ACCESS_TOKEN='アクセストークンをここにコピペしてください'
      LINE_API_REPLY = 'https://api.line.me/v2/bot/message/reply'

      def output(message):
          LOG_FILE="logfile.log" 
          with oprn(LOG_FILE,'a') as ff:
              ff.writelines(str("\n"))
              ff.writelines(str(message))

      def main():
          try:
              json_data=json.load(sys.stdin)
              events=json_data["events"]
              user_message=events[0]["message"]["text"]
              for event in events:   
                  #データとヘッダーを用意する、最後にリクエスト,ポストで返信する
                  reply_token=event['replyToken']
                  headers={
                                  'Content-Type': 'application/json; charset=UTF-8',
                                  'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
                              }
                  
                  
                  if user_message == "hello":
                      message="world"
                  else:
                      message="えびちゃん"
                  
                  postdata={
                              'replyToken': reply_token,
                              'messages': [{
                                'type': 'text',
                                'text': message
                              }],
                            }
                  requests.post(LINE_API_REPLY, data=json.dumps(postdata), headers=headers)
                        
          except Exception as e:
              output(e)

            
      if __name__ == "__main__":
          print("Access-Control-Allow-Headers: Origin, Content-Type\r\nAccess-Control-Allow-Origin: *\r\nAccess-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS\r\nContent-Type: application/json\r\n")
          print(json.JSONEncoder().encode(main()))
    

python以外でやること
1.アクセストークンの発行
2.webhookを有効にする
3.サーバーにアップロードする


1.アクセストークンの発行
LINEDevelopersのページから自作した公式LINEのアカウントの設定画面を開き、messagingAPIの項目を選択する。

LINEbotを作るにはページの一番下にある「チャネルアクセストークン」が必要です。赤丸で囲ってあるところをクリックすると発行されます。このタイミングで応答メッセージを無効にしておくことをオススメします。 応答メッセ―ジはデフォルトでは有効になっています。編集から、応答メッセージのラジオボタンを切ることで無効に出来ます。

2.webhookを有効にする
アクセストークンと同じページの少し上にWebhookの設定の項目があるので、赤丸で囲ってあるところのチェックを有効にします。
また、webhookURLにpythonファイルのURLを設定します。 白い「編集」ボタンを押すとURLが入力できます。 黒い「検証」ボタンは設定したURLが有効なものか判別してくれます。
3.サーバーにアップロードする
pythのコードは「cgi-bin」のフォルダでアップロードしないといけない。また、LINEからの情報をプログラムで読み取ったり書き込んだりできるようにプロパティの設定も忘れずにしましょう。

pyファイルをアップロードしても中身が更新されてない場合は一度ファイルを開いて適当な場所を変更して戻してファイルを保存しなおすと良いです。

コードの解説

#!/usr/bin/python3
        # -*- coding: utf-8 -*-
        import cgitb
        cgitb.enable()
        import json, sys, requests
        CHANNEL_ACCESS_TOKEN='アクセストークンをここにコピペしてください'
        LINE_API_REPLY = 'https://api.line.me/v2/bot/message/reply'
1行目のおまじないは"python3"にしておく。 このおまじないは”どのpython環境をつかうか?”を選択しています。このサーバ上では~~python3がpython3系をつかうときのパスで、ここにpython3を使うためのファイルたちが眠ってるとおもわれます。 たとえば、このパスを !/home/ec/.venv/bin/python って指定すると、べつのpython環境で実行できるようになります。こっちに指定するとmongoというデータベースとかも使えます。だから電子マネー系のシステムとかはこっちの環境で開発してたりするそうです。
def output(message):
        LOG_FILE="logfile.log" 
        with oprn(LOG_FILE,'a') as ff:
            ff.writelines(str("\n"))
            ff.writelines(str(message))
新しくファイルを作成してそこにログなどを書き込むようにするコードです。 9行目、コンプロでは習わなかった「with open()」という関数を使っています。「writelines()」も同様です。 下の画像のようにopenのみだとファイルの作成は出来たがjsonのオブジェクトを書き込むことができなかったので何も書かれていないファイルになってしまいます。


        def main():
          try:
              json_data=json.load(sys.stdin)
              events=json_data["events"]
              user_message=events[0]["message"]["text"]
      
20行目から50行目までで返信の設定をしています。
json_data=json.load(sys.stdin)でwebhookからの標準入力を受け取っています。
そのあとの2行でユーザーから送られてきた文字を切り出しています。
下の画像がoutput関数から出力したLOG_FILEの出力結果です。
青色で囲んだところがeventsの中身で赤色で囲んだところがuser_messageの中身です。
この画像の55行目ではjson_dataを出力しており、56行目はevents、57行目はeventsのリストの0番目を出力して、58行目で送信された文字列のみを出力出来ています。
26~47行目で具体的に返信の設定をしています。以下のサイトを参考にしました。
PythonでLine botを作ってみた
LINE Messaging APIをGASで実行するLINEボット開発方法(サンプル+設定手順付)

補足

今回は、任意のメッセージをユーザーに送れるようになることが目標でした。 まだまだLINEbotでできる事はたくさんあります。参考:Messaging APIの特徴