4月7日に LINE が LINE トークを使った bot 開発用のアカウント "BOT API Trial Account" を先着1万名で提供する、という発表がありました:
http://www.itmedia.co.jp/news/articles/1604/07/news134.html


このニュースはあっという間に広まり、その作り方や実際に作ったボットが早くも多く公開されています。これまでは LINE ビジネスコネクトを通したビジネスアカウントがないと作れなかった LINE のボットが誰でも作れるようになりました。今回の発表で提供されている機能では作ったボットは 50 名のユーザーに対してのみ公開可能(ボットは 50 人までとしか友達になれない)という制限は付きますが、仲間内で使うぶんには充分だし、今後この制約が拡張されることがあればより便利に使えると思っています。 ちなみに昨日友人が試した限りでは、まだアカウントの申し込みが可能でした。

自分も早速 Bot を作って動かしてみました。自分の場合は IBM Bluemix を使って Bot を動かしています。Bot の作り方そのものは Qiita などに数多くの投稿がされているようなので、そちらを参照ください。以下は IBM Bluemix を使って Bot を動かす場合のコツや注意点を中心にまとめたものです。



(1) Bluemix のランタイム作成

まず Bluemix 上に Bot として動くことになるウェブアプリケーションのランタイムを作成します。ちなみに Bluemix のランタイムは標準で SSL が動き、Let's Encrypt 問題のような「この SSL 証明書はダメ」のような現象はおきていません。要するに Bluemix でランタイムを作って動かせばあまり深く考えなくても LINE Bot で使える、ということです。

Bluemix に用意されたランタイムはどの種類を使っても大丈夫だと思います。自分は PHP を使ってコールバック部分を作るつもりなので PHP にしました。Bluemix のサービスは必要に応じて追加してください(なくても動きます):
2016041304
 ↑dotnsf-line.mybluemix.net で PHP サーバーを作成


(2) BOT API Trial Account 作成

次に LINE BUSINESS CENTER へ行き、BOT API Trial Account を作成します:
2016041301


で、Bot を新規に作成して登録します。Channel ID と Channel Secret、MID は後で使うことになるのでメモしておきましょう。App icon は Bot が実際に LINE トーク上に現れる時のアイコンになるので、何か入れておいたほうが面白いと思います:
2016041302


重要な要素が Callback URL です。LINE トーク上でこの Bot に話しかけると、ここで指定した URL が呼ばれて実行されます。ここに指定できる URL は SSL が前提で、かつポート番号 443 を明示指定する必要があります。今回は上記で作成した Bluemix 上のランタイムに callback.php(この下で作ります)をデプロイして動かすので、Callback URL としては https://dotnsf-line.mybluemix.net:443/callback.php という指定になります:
2016041303

White List はこの後で指定します。


(3) Bot 作成&デプロイ

コールバックで動くことになる Bot アプリケーションを作ってデプロイします。ここは Bluemix だから特別に・・・という部分ではありません。自分はこの API を使って、呼びかけた通過ペア(例えば "USDJPY" とか "EURJPY" とか)に対してリアルタイムの為替価格を表示する、という Bot にしてみました:
2016041301
 ↑実際に動いている様子。問いかけた通貨の現在価格を返答してくれます。


ソースコードはこんな感じ。コード内の (Channel ID), (Channel Secret), (MID) の部分には上記で取得した実際の値を指定して書き換えてください:
<?php

$json_string = file_get_contents( 'php://input' );
$jsonObj = json_decode( $json_string );
$results = $jsonObj->{"result"};
$cnt = count($results);
for( $i = 0; $i < $cnt; $i ++ ){
  $result = $results[$i];
  $to = $result->{"content"}->{"from"};


  $cur = "USDJPY";
  $_cur = $result->{"content"}->{"text"};
  if( $_cur ){
    $cur = $_cur;
  }
  $cur = strtoupper( $cur );

  $fx_url = "http://fx.mybluemix.net/";
  $text = file_get_contents( $fx_url );
  $json = json_decode( $text );
  $datetime = $json->datetime;
  
  $rate = $json->rate;
  $r = "(" . $datetime . ")" . $cur . ":" . $rate->{$cur};

  $response_format_text = ['contentType'=>1,"toType"=>1,"text"=>$r];
  $post_data = ["to"=>[$to],"toChannel"=>"1383378250","eventType"=>"138311608800106203","content"=>$response_format_text];

  $ch = curl_init("https://trialbot-api.line.me/v1/events");
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));
  curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json; charser=UTF-8',
    'X-Line-ChannelID: (Channel ID)',
    'X-Line-ChannelSecret: (Channel Secret)',
    'X-Line-Trusted-User-With-ACL: (MID)'
    ));
  $res = curl_exec($ch);
  curl_close($ch);
}
?>

このコードを Bluemix にデプロイすればOK、なのですが、ちょっとまだ足りない部分があるのでデプロイは次の (4) の後にまとめて行うことにします。


(注 この (4) の作業に関してはこちらの作業を行うことで不要にすることもできます)

(4) WhiteList 登録

LINE Bot の、特に Bluemix ランタイムで LINE Bot を動かす上での最大の関所がこの WhiteList 登録だと思ってます。Bot が LINE のサーバーに対して返答の POST を実行する際、あらかじめ許可されたサーバーからのリクエストのみが受け付けられるようなホワイトリストの仕組みが用意されています。つまり LINE Bot を動かすにはどの IP アドレスからリクエストするのかをあらかじめ登録しておく必要があります。

一方で Bluemix のランタイムは再起動や再ステージングを行う度にリクエスト元の IP アドレスが変わる仕様になっています。Bluemix のアプリケーションはデプロイするたびに再ステージングを行うので、要するに作りなおしたアプリをデプロイする度にリクエスト元の IP アドレスを調べてホワイトリストを更新する必要があるのでした。この仕組がちと面倒で、注意する必要があります。

そして更に話がややこしいことに、このリクエスト元の IP アドレスを調べる方法というのがまた面倒だったりします。IaaS のアプリケーションサーバーであれば SSH などでログインして「確認くん」などで調べる方法もありますが、PaaS のランタイムである Bluemix だとそれも簡単ではありません。

方法は何通りかあると思うのですが、基本的な考え方は外部の HTTP サーバーや DB サーバーを用意し、Bluemix からそのサーバーにアクセスを行って、ログを見る(ログのアクセス元の IP アドレスを調べる)という方法です。自宅サーバーなどでダイナミック DNS を使う時のようなテクニックが必要になると思っています。

僕がやってるのはこんな感じ。わざとつながらない DB サーバーに Bluemix ランタイムからアクセスして(アクセスするような PHP アプリを書いて実行して)エラーログを参照する、という方法です。良い子はマネしちゃいけません:
2016041302


というわけで、順序としては (3) で作ったコールバックのアプリケーションに加え、ここでランタイムの IP アドレスをチェックするためのアプリも作り、それらをまとめてデプロイ(プッシュ)する、ということになります。

そして、ランタイムの IP アドレスを取得して LINE Bot の White List IP アドレスに設定します(ネットマスクは 24 を指定して動きました)。この作業はランタイムをステージングするたびに行う必要がある点に注意が必要です:
2016041303


このホワイトリストの反映には数分かかっているようですが、ホワイトリストが正しく反映されていれば自分のボットも動くようになっているはず、たぶん。


Bluemix 環境を活用した LINE Bot は他にも色々作れそうなので、いずれまたブログエントリとして書くつもりです。 上記のようにホワイトリストの所だけちと面倒ではあるのですが、ランタイムが自由に作れて SSL も問題なさそうだし、これにワトソンなどのコグニティブエンジンを組み合わせた Bot を作ると面白いかな、と考えています。