Messaging APIを使ってLINE bot(もどき)を作ってみた。

SDK(line-bot-sdk-python)を使って、LINE bot(もどき)作ってみました。

1. LINE Messaging APIとは

Messaging APIを使って、ユーザー個人に合わせた体験をLINE上で提供するボットを作成できます。

作成したボットは、LINE プラットフォームのチャネルに紐付けます。チャネルを作成すると生成されるLINE公式アカウントをボットモードで運用すると、LINE公式アカウントがボットとして動作します。

Messaging APIを使って、ボットサーバーとLINEプラットフォームの間でデータを交換できます。リクエストは、JSON形式でHTTPSを使って送信されます。

Messaging APIより

HTTPSを使ってJSON形式のデータやりとりできればbotを作れるとのこと。
何らかのWebサーバが必要ですが私は既に構築済み。以下、Webサーバ構築関連の記事です。

MAMPを卒業して、Webサーバを1から構築してみた。

ApacheとBottleとの連携

MacのPython環境を整える 2019年版

httpからhttpsへ移行しました。

2. Messaging APIを利用するには

こちらの手順に従い、チャンネルを作ります。

チャネルとは
チャネルは、LINEプラットフォームが提供する機能を、プロバイダーが開発するサービスで利用するための通信路です。LINEプラットフォームを利用するには、チャネルを作成し、サービスをチャネルに関連付けます。チャネルを作成するには、名前、説明文、およびアイコン画像が必要です。チャネルを作成すると、固有のチャネルIDが識別用に発行されます。

Messaging APIを利用するにはより

3. botの設定

次のガイドに従ってbotの作成準備を行います。

このガイドでは、Messaging APIを使ってLINEボットを作成する方法を説明します。

ボットを作成するより

 

私が作ったbot「涙目です(ToT)」の設定はこんな感じです。

設定画面その1

Channel Secretが与えられますのでコピーしておきましょう。
Messaging APIで受け取ったデータの署名を確認するときに使います。

設定画面その2

設定画面その3

Messaging APIを使うときにアクセストークン(めっちゃ長い)が与えられますのでコピーしておきましょう。
「Webhook送信」を「利用する」に設定します。
「Webhook URL」には、友だち追加やメッセージ受信などのイベントを受け取るWebサーバのURLを指定します。
まだWebhook URLで待ち受けるプログラムが動いていないので、「接続確認」を押すと、無効なHTTPステータスコードを返しました。となります。現段階では気にしない。

設定画面その4

「自動応答メッセージ」及び「友だち追加時あいさつ」は「利用しない」に設定します。なぜならbotが応答するので。
QRコードは、botを友だち追加するときに使います。

4. Webサーバの開通テスト

Apache、mod_wsgi、WebフレームワークBottleで、Line bot用Webサーバを開通させます。
前に書いた記事で下地が出来上がっています。後はPythonスクリプトの記述とApacheの設定変更(mod_wsgi)のみ。

Apacheの設定変更

私の環境ではHTTPSのListenを設定しているのはhttpd-ssl.conf。このファイルにmod_wsgiの設定を加えます。

下記の設定では、https://blue-back.ink/namidame以下にアクセスしたときに、/Users/username/webApp/namidame/application.pyが応答するようになります。

Apacheを再起動して設定を読み込みます。

仮想環境の構築

仮想環境を構築し、モジュールbottleをインストールします。

Python用のSDKを使うとコーディングが楽です。ありがたく使わせてもらいます。

 

application.pyを用意します。

開通テスト用にGETとPOSTに応答するハンドラを用意しました。
get_hander()webhook_hander()です。

 

開通テスト

ブラウザでhttps://blue-black.ini/namidame/にアクセスしました。GETメソッドによるアクセスに成功。

Line Developersのbot設定画面から 接続確認してみます。
「接続確認」をクリックするとPOSTメソッドでサーバにアクセスします。「成功しました。」が表示されたらOKです。

以上、bot用のWebサーバの開通が確認できました。

 

5. bot作成

本格的なbotを作成したいのは山々ですが腕も時間もありませんので、line-bot-sdk-pythonを使いエコーbotに毛が生えたようなものを作ってみました。

application.pyを次のように書き換えました。

channal_access_tokenchannel_secretはbotの設定のときに与えられたものを記述します。

 

以下、勘所の解説です。

LINEがJSONデータをPOSTしてきたときのハンドラです。

 

リクエストがLINEプラットフォームから送られたことを確認するために、ボットサーバーでリクエストヘッダーのX-Line-Signatureを検証する必要があります。

  1. チャネルシークレットを秘密鍵として、HMAC-SHA256アルゴリズムを使用してリクエストボディからBase64でエンコードされたダイジェスト値を生成します。
  2. リクエストヘッダーにあるX-Line-Signatureの署名がダイジェスト値と一致することを確認します。

ボットを作成するより

リクエストボディをチャンネルシークレットでゴニョゴニョした値と、ヘッダのX-Line-Signatureの値が一致しているか確認することで、LINEからのアクセスなのか否かを検証します。これを実行しているのがhandler.handle(body, signature)の所です。

なお、bottle.request.bodyで得られる型がio.BytesIOなので、io.BytesIO.getvalue()でbytesに変換し、さらにbytes.decode('utf-8')でstringへ変換してからhunder.hundle()へ渡してます。

各イベント(友だち追加、ブロック、メッセージ受信など)に対するハンドラを記述します。
どのイベントに対するハンドラかは、デコレータで指定します。

例えば、友だち追加に対するハンドラは、次のとおり。

 

LINEアプリでQRコードを読み込み、 botを友だち追加してみました。結果は次のとおり。うまくいきました。

テキストメッセージ受信のハンドラは次のとおり。

 

スタンプを送ると、涙スタンプコレクションの中の1つをランダムに返します。

 

画像を送ると、画像を返します。

 

などなど、SDKを使うと簡単に応答メッセージをプログラム出来ます。
LINEメッセージの文脈解釈して受け答えする本格的なbotを構築することも頑張ったら出来そうですね。
(素人にはこれが一番難しい…)

本記事公開時にはWebhook URLは削除済み、つまりbotはもう存在しません。URL叩いても何も出ないのであしからず。

以上、LINE bot構築の一助になれば幸いです。

おっと、平成が終わるぞ。

Leave a Comment

メールアドレスが公開されることはありません。

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください