webscript.ioでLINE BOT APIの事始め

f:id:yamamotomanabu:20160408005017p:plain

2016/12/26追記 ---
この記事で取り扱っているBOT APIは、Messaging APIの公開に伴い、開発者アカウントの削除、API仕様の変更が行われています。

webscript.ioを使ったMessaging API連携というところでは、id:JUNKI_fuglyさんが記事を書かれていますのでこちらが参考になると思います!
qiita.com --- ここまで

BOT API Trial Accountの受付が開始されたので、早速試してみました。
APIの仕様はこちらをご覧ください。

今回はいくつかあるAPIの中から、ユーザーからのメッセージを受け取るReceiving messagesと、ユーザーにメッセージを送るSending messagesを使って、メッセージを受け取ったら、そのメッセージの末尾に"やで"を付けてオウム返しするBOTを作ってみようと思います。

Sending messagesはBOT製作者にしか分からないアプリケーション情報や、送信先のユーザー情報、メッセージをHTTPヘッダやボディに乗せてPOSTで送る分かりやすいAPIなのですが、Receiving messagesはWebhook方式になっていて、LINE developersと呼ばれるBOT製作者向けの管理画面上でメッセージ受信時のコールバックURLを設定する仕組みになっています。
このコールバックURLには制約事項があって、HTTPSでなければならず、更にオレオレ証明証はNGのようなので注意が必要です。
制約事項についてはこちらに記載があるのでチェックしてください。

Once registered, requests will be sent to your callback URL. The callback URL must use HTTPS.

Note: The SSL certificate must be issued by an authorized CA. If a self-issued SSL certificate is applied to your server, requests sent from the LINE platform will fail.

最初、手持ちのIDCF Cloudの仮想マシンを使おうと思ったのですが、証明書を準備するのが億劫だったので、webscript.ioを使ってみようと思います。
webscript.io自体の使い方はChatWorkさんのブログで詳しく解説されているので、そちらをご覧ください。
サーバー不要で Lua 言語な webscript.io で ChatWork API を叩いてみる

早速スクリプトを作成しましょう。
f:id:yamamotomanabu:20160408013951p:plain

スクリプトの内容はこれだけです。

-- 認証情報
ChannelID = あなたのChannel ID
ChannelSecret = あなたのChannel Secret
MID = あなたのMID

-- 受信メッセージから送信メッセージを構築
body = json.parse(request.body)
res = body.result[1].content.text .. 'やで'
reply = body.result[1].content.from
data = {
    ['to'] = {reply},
    ['toChannel'] = '1383378250', -- 固定値
    ['eventType'] = '138311608800106203', -- 固定値
    ['content'] = {
        ['contentType'] = 1,
        ['toType'] = 1,
        ['text'] = res
    }
}

-- メッセージ送信
local response = http.request {
    url = 'https://trialbot-api.line.me/v1/events',
    method = 'POST',
    data = json.stringify(data),
    headers = {
        ['Content-Type'] = 'application/json; charser=UTF-8',
        ['X-Line-ChannelID'] = ChannelID,
        ['X-Line-ChannelSecret'] = ChannelSecret,
        ['X-Line-Trusted-User-With-ACL'] = MID
    }
}

return true

先頭の認証情報の3行はご自身のアプリケーション情報に置き換えてください。必要な情報はLINE developersのBasic informationで確認することができます。 f:id:yamamotomanabu:20160408021504p:plain

続いて同じLINE developersのBasic informationでコールバックURLを設定します。 f:id:yamamotomanabu:20160408022609p:plain

ポート番号を明示的に指定する必要があるので、
https//指定したサブドメイン名.webscript.io:443/指定したディレクトリ名
のような形式で設定してください。

最後にLINE developersのServer IP Whitelistを設定します。 Sending messagesを実行するホストのIPアドレスホワイトリスト方式で列挙する必要があります。 f:id:yamamotomanabu:20160408023102p:plain

webscript.ioの接続元IPである54.159.34.187を設定してください。(私の環境では54.159.34.187だけで問題なく動作しているのですが、もしかしたレンジ指定する必要があるかもしれません。。)

コールバックURLやホワイトリストの設定が反映されるのに丸一日近く掛かったという報告が挙がっています。自分が作業行った際は特に待ち時間なかったのですが、人が増えて負荷が上がったんですかね・・・。設定後は気長に待ちましょう。(2016/4/11追記)

LINE developersのBasic informationにあるQRコードなどを使って、BOTを友だち追加してメッセージを送ってみてください。
f:id:yamamotomanabu:20160408024124p:plain

これでオウム返しBOTが完成です。
f:id:yamamotomanabu:20160408024154j:plain