bot(もどき)を作ってみた。bot(もどき)を作ってみた。bot(もどき)を作ってみた。bot(もどき)作ってみました。APIを使って、ユーザー個人に合わせた体験をLINE上で提供するボットを作成できます。プラットフォームのチャネルに紐付けます。チャネルを作成すると生成されるLINE公式アカウントをボットモードで運用すると、LINE公式アカウントがボットとして動作します。APIを使って、ボットサーバーとLINEプラットフォームの間でデータを交換できます。リクエストは、JSON形式でHTTPSを使って送信されます。APIよりHTTPSを使ってJSON形式のデータやりとりできればbotを作れるとのこと。何らかのWebサーバが必要ですが私は既に構築済み。以下、Webサーバ構築関連の記事です。MAMPを卒業して、Webサーバを1から構築してみた。2019年版httpからhttpsへ移行しました。APIを利用するにはこちらの手順に従い、チャンネルを作ります。チャネルとはチャネルは、LINEプラットフォームが提供する機能を、プロバイダーが開発するサービスで利用するための通信路です。LINEプラットフォームを利用するには、チャネルを作成し、サービスをチャネルに関連付けます。チャネルを作成するには、名前、説明文、およびアイコン画像が必要です。チャネルを作成すると、固有のチャネルIDが識別用に発行されます。次のガイドに従ってbotの作成準備を行います。APIを使ってLINEボットを作成する方法を説明します。ボットを作成するより私が作ったbot「涙目です(ToT)」の設定はこんな感じです。Secretが与えられますのでコピーしておきましょう。APIで受け取ったデータの署名を確認するときに使います。APIを使うときにアクセストークン(めっちゃ長い)が与えられますのでコピーしておきましょう。「Webhook送信」を「利用する」に設定します。URL」には、友だち追加やメッセージ受信などのイベントを受け取るWebサーバのURLを指定します。URLで待ち受けるプログラムが動いていないので、「接続確認」を押すと、無効なHTTPステータスコードを返しました。現段階では気にしない。設定画面その4「自動応答メッセージ」及び「友だち追加時あいさつ」は「利用しない」に設定します。botが応答するので。QRコードは、botを友だち追加するときに使います。bot用Webサーバを開通させます。前に書いた記事で下地が出来上がっています。後はPythonスクリプトの記述とApacheの設定変更(mod_wsgi)のみ。私の環境ではHTTPSのListenを設定しているのはhttpd-ssl.conf。このファイルにmod_wsgiの設定を加えます。下記の設定では、https://blue-back.ink/namidame以下にアクセスしたときに、/Users/username/webApp/namidame/application.pyが応答するようになります。granted</Directory></VirtualHost>Apacheを再起動して設定を読み込みます。仮想環境を構築し、モジュールbottleをインストールします。bottlePython用のSDKを使うとコーディングが楽です。ありがたく使わせてもらいます。line-bot-sdkapplication.pyを用意します。開通テスト用にGETとPOSTに応答するハンドラを用意しました。get_hander()とwebhook_hander()です。WSGI)開通テストブラウザでhttps://blue-black.ini/namidame/にアクセスしました。GETメソッドによるアクセスに成功。「接続確認」をクリックするとPOSTメソッドでサーバにアクセスします。」が表示されたらOKです。以上、bot用のWebサーバの開通が確認できました。本格的なbotを作成したいのは山々ですが腕も時間もありませんので、line-bot-sdk-pythonを使いエコーbotに毛が生えたようなものを作ってみました。application.pyを次のように書き換えました。channal_access_tokenとchannel_secretはbotの設定のときに与えられたものを記述します。ブロックしたユーザのIDなどを使って何かできる。ブロックしたユーザのIDなどを使って何かできる。WSGI)以下、勘所の解説です。LINEがJSONデータをPOSTしてきたときのハンドラです。mismatch.')リクエストがLINEプラットフォームから送られたことを確認するために、ボットサーバーでリクエストヘッダーのX-Line-Signatureを検証する必要があります。チャネルシークレットを秘密鍵として、HMAC-SHA256アルゴリズムを使用してリクエストボディからBase64でエンコードされたダイジェスト値を生成します。リクエストヘッダーにあるX-Line-Signatureの署名がダイジェスト値と一致することを確認します。ボットを作成するよりリクエストボディをチャンネルシークレットでゴニョゴニョした値と、ヘッダのX-Line-Signatureの値が一致しているか確認することで、LINEからのアクセスなのか否かを検証します。signature)の所です。bottle.request.bodyで得られる型がio.BytesIOなので、io.BytesIO.getvalue()でbytesに変換し、さらにbytes.decode('utf-8')でstringへ変換してからhunder.hundle()へ渡してます。各イベント(友だち追加、ブロック、メッセージ受信など)に対するハンドラを記述します。どのイベントに対するハンドラかは、デコレータで指定します。友だち追加に対するハンドラは、次のとおり。botを友だち追加してみました。