LINEのチャットボットプラットフォーム「Messaging API」(通称:LINE Bot)でチャットボットを開発する方法を説明する本連載。前回は、Messaging APIが利用を開始するところまで作業を行った。第2回となる今回は、LINEアカウントでメッセージを送信するスクリプトを作ってみる。

シェルを使ってコーディングしてみよう

コーディングしてMessaging APIを利用するにあたっては、基本的には「LINE API Reference - Messaging API」の説明やサンプルコードを参考にすればよい。サンプルとしてシェル、Java、Ruby、Go、PHP、Perl、Python、Node.jsのコードが掲載されているので、それぞれ得意としているプログラミング言語を使ってもらえばよいと思う。

LINE API Reference - Messaging API

どのプログラミング言語を使ってもよいが、ここではすぐに試すことができるということでシェル(コマンド)を使った方法を取り上げておこう。

Linuxや*BSDサーバ、またはmacOSを使っている開発者であれば、この手のAPIはcurl(1)コマンドでかなり自由に操作できることを知っているはずだ。必要に応じて、現場で使われているプログラミング言語に落とし込んでもらえばよいが、手っ取り早く動作を確認するにはcurlコマンドで試すのが便利だ。

今回はリプライを目的にチャットボットを作成する前段階として、メッセージを送信する処理を実装する。先に結果を書いておくと、次のようにcurl(1)コマンドを実行することで作成したLINEのアカウントとしてメッセージを送信することができる。

LINEアカウントでメッセージを送信するスクリプト

#!/bin/sh


curl -X POST \
-H 'Content-Type:application/json' \
-H 'Authorization: Bearer {ここにアクセストークンを記述}' \
-d '{
    "to": "ここにユーザーIDを記述",
    "messages":[
        {
        "type": "text",
        "text": "新大陸へようこそ"
    }
    ]
}' https://api.line.me/v2/bot/message/push

curl(1)コマンドで行っていることは2つだ。https://api.line.me/v2/bot/message/pushに対するHTTP POSTリクエストのヘッダに「Content-Type:application/json」と「Authorization: Bearer {ここにアクセストークンを記述}」というヘッダを追加し、「{"to":"ここにユーザIDを記述", "messages":[ { "type": "text", "text": "新大陸へようこそ" } ] }」というコンテンツを送っている。アクセストークンとユーザーIDはそれぞれ自分のものに書き換えてほしい。

このスクリプトを実行すると、LINEアプリに次のようにメッセージが送信されてくることを確認できる。思った以上に簡単ではないだろうか。なお、アクセストークンは他者に公開してはいけないので、管理には十分気をつけてほしい。

スクリプト発LINEサーバ経由でLINEアプリに送られてきたメッセージ

送信できるメッセージにはテキストに加えてスタンプも含めることができるし、画像や動画、URL、それらの複合コンテンツなども送信できる。記述方法は前述したAPI Referenceに記載されているので、そこからサンプルを持ってきて書き換えていけばよいだろう。

いろいろ組み合わせたメッセージを送信するとなると、次のような感じになる。基本的にはJSONデータの部分が複雑になるだけで、それ以外の部分は同じだ。

スタンプや確認ダイアログを送信するスクリプト

#!/bin/sh

curl -X POST \
-H 'Content-Type:application/json' \
-H 'Authorization: Bearer {ここにアクセストークンを記述}' \
-d '{
    "to": "ここにユーザIDを記述",
    "messages":[
        {
        "type": "text",
        "text": "送信できるメッセージはテキスト以外にも画像や動画、スタンプ、またはURLコンテンツ、またはそれらの複合データなどです。テキストには絵文字を含めることができます。Unicodeで定義されている絵文字はそのまま含めておけば利用できます"
    },
    {
        "type": "sticker",
        "packageId": "4",
        "stickerId": "300"
    },
    {
        "type": "template",
        "altText": "参加確認テンプレート",
        "template": {
            "type": "confirm",
            "text": "スマホアプリに限られますが、確認ダイアログを表示させることができます。ラベルと、それを選択したときに出力するテキストを設定しておくことができます。",
            "actions": [
            {
                "type": "message",
                "label": "YES",
                "text": "YESが選択されました"
            },
            {
                "type": "message",
                "label": "NO",
                "text": "NOが選択されました"
            }
            ]
        }
    }
    ]
}' https://api.line.me/v2/bot/message/push

LINEアプリには、次のようなメッセージが送られてくることを確認できる。また、確認ダイアログ的なテンプレートでは、押したラベルに応じたテキストが入力されることを確認できる。

LINEアプリ側で確認したメッセージ

押したラベルに対応するテキストが送信されることを確認できる

このように簡単なコマンドでメッセージの送信ができることがわかっただけでも、Messaging APIの面白さを理解していただけたのではないだろうか。メッセージをテキストデータで保持しておき、あとはcron(8)経由で定期的にメッセージを送信するといったこともできる。難しいコーディングをしなくてもWeb APIを利用できる、しかもソーシャルネットワークサービスのAPIが利用できるということをわかってもらえればと思う。

デバッグはどうやってやる?

デバッグというか、何かが間違っている場合はレスポンスコンテンツにその内容が書いてあるので、その内容に従ってデバッグを行っていけばよい。

まず、コンテンツを得るタイプのAPIでない場合、次のようにレスポンスコンテンツには何も入っていない。

成功した場合の例

% ./push_message.sh

{}
%

どこかが間違えていると、次のような感じで間違えている場所がわかるようになっている。この場合はContent-Typeに指定した内容が間違っていることが示されている。apllication/jsonではなくapplication/jsonが正しい記述だ。

Content--Typeが違うというメッセージが返ってきている

% ./push_message.sh

{"message":"The content type, 'apllication/json', is not supported"}
%

アクセストークンが間違っている場合は次のようなコンテンツが返ってくる。

アクセストークンが間違っている場合のレスポンスコンテンツ

% ./push_message.sh

{"message":"Authentication failed due to the following reason: invalid token. Confirm that the access token in the authorization header is valid."}
%

curl(1)コマンドに--includeオプションを指定して実行すると、次のようにHTTPのレスポンスステータスが401になっていることも確認できる。アクセス認証に失敗したことがこちらでも示されているわけだ。

ヘッダを確認するとステータスが401になっていることも確認できる

% ./push_message.sh

HTTP/1.1 100 Continue

HTTP/1.1 401
Server: nginx
Date: Tue, 15 Aug 2017 09:11:44 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Line-Request-Id: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
WWW-Authenticate: Bearer error="invalidtoken", errordescription="invalid token"

{"message":"Authentication failed due to the following reason: invalid token. Confirm that the access token in the authorization header is valid."}
%

開発する時のポイントは、作っては動かしてという作業を細かく繰り返すことだ。ちょっと作ったら動作させ、またちょっと作ったら動作させ、といったことを繰り返してみていただきたい。

まずは動かしてみよう

Web APIを利用するというと、難しいことをするというイメージを持つかもしれない。しかし、実際にやってみると、それほど難しい作業ではないことに気がついてもらえるんじゃないだろうか。

チャットボットを作るところまでいくには、サーバを用意してそちらの中身もデプロイしないといけないので、面倒といえば面倒なのだが、メッセージを送信するくらいであれば今回紹介したようにコマンドを実行する方法で実現できる。こうした経験を通じて、まずはMessaging APIがどのような動きをするもかを体感してもらえればと思う。

今回取り上げた例は、あくまでもユーザーが主体となってメッセージを送信するという内容だ。次回はもう一歩進めて、入力されたメッセージに対して自動的にメッセージをリプライするプログラムを作る方法を紹介しよう。