よいちろ日記

忘れないようにメモ。

LINE BOT つくった。

■ 開発した環境
・Heroku + PHP
 ┗ IP固定のためHerokuアドオンとしてFixie
 
■ つくったもの

f:id:yoichiro0903:20160505025804p:plain

  • マンガのタイトルをBOTに聞くと、マンガ情報をWEBから取得して結果を、「ええと、XXXですか?」というフォーマットで、マンガ情報を返してくれる。
  • 一致するマンガタイトルが無かった場合、適当に週間ランキングから引っ張ってきて「XXXよくわからんからこれでも嫁」と返してくれる。
  • タイトル、ユーザー評価、マンガが購入できるページのリンク、書影画像を返してくれる。
※1: PHPQueryでWEBスクレイピング
※2: URL短縮
※3: HerokuのPHPで日本語文字化け
 
■ ありがたい先人の知恵
・全体の流れがとてもわかりやすく書いてある。
PHPのcallbackプログラムの大枠の構造はここを参考に。
・HeroicでIPを固定して、LINE BOT動かす部分はここ。
 
■ つくったときの流れ
  1. 次のURLで利用登録を完了し、LINE BOTアカウント取得する。( BOT API Trial Account )
    1. Channel ID、Channel Secret、MIDを取得。
  2. HerokuでPHPアプリをデプロイ。( 初心者でも15分で公開できるHerokuのはじめかた
    1. HerokuToolbeltをインストールしておく。
    2. PHPアプリを作ったディレクトリでGit initしてGit管理出来るようにしておく。
  3. FixieでHerokuのアプリのIPを固定。(Herokuは毎回デプロイ先のIPが変わる。)
    1. FixieはHerokuアカウントのVerifyが必要で、クレカ登録必須。
    2. 実際にFixieで固定したIPでデプロイされいているかどうかは、Heroku logs -t で確認。
  4. Fixieで固定したIPをLINE BOTアカウントのServer IP Whitelistに登録。
    1. 2つとも登録する。/ 以下(ポート?)は登録しなくて良い。
  5. index.phpを置くディレクトリと同じディレクトリに、callback.phpを設置する。
    1. callback.phpが実際にBOTのプログラムの窓口になる。
    2. ここにChannel ID、Channel Secret、MIDだとかを書く。
  6. あとはJSONのやりとり。
    1. BOTが返すJSONを作るときに、contentType,ToType,textなどがnullになってしまうとそれはそれでエラーになる。
■ つくったときのメモ(ハマったところ)
① callback先の指定方法は泥臭くていい。
最初は、https://XXXXXXXX.herokuapp.com:443/callback としていてルーティングめんどーってなってたけど、普通に、https://XXXXXXXX.herokuapp.com:443/callback.phpでいい。
 
② Fixieの環境変数の指定の仕方がおかしかった。
いくらheroku logs -tしても、 
{"statusCode":"427","statusMessage":"Your ip address [XXX.XXX.XXX.XXX, YYY.YYY.YYY.YYY] is not allowed to access this API. Please add your IP to the IP whitelist in the developer center.”}
とか出て、ここでハマりまくった。

  curl_setopt($curl, CURLOPT_PROXY, getenv('FIXIE_URL'));のFIXIE_URLにFixie管理画面上で確認できるProxy URLをそのまま突っ込んでいた。
Herokuの管理画面にも環境変数?的な感じで登録されているので、そこで気付いた。

f:id:yoichiro0903:20160505023847p:plain

 

③ toChannel,eventTypeはドキュメントにならう。
単発メッセージを送る時は以下。

f:id:yoichiro0903:20160505022616p:plain

複数メッセージを送る時は以下。

f:id:yoichiro0903:20160505022614p:plain

 
PHPの多次元配列の取得方法がむずかった。
for文の中で、以下のように、結果セットを量産して最後にランダムで取り出す方法をとっているが、単純にnをkeyとして指定して取り出すと、key(n) => array (key => value, key => value ...)という2階層ハッシュの形で取れてしまうため、$resultSet[0]という風に1階層目のkeyを0でとりあえず指定して取得する必要があった。 

 
■ おもったこと
BOTの良さは、「検索コストが下げられる」「チャットというインターフェイスによって、信ぴょう性がすこし増してる」部分で、その利点を活かしたサービスが作れたらアプリの側替え以上の価値が出せると思った。
 
「検索コストが下げられる」
・日常的に使っているLINEであることで、他アプリ立ち上げコストが下げられている。
・入力のインターフェイスも、普段から使い慣れているしゃべり言葉でテキスト入力で済ませられるのが良い。
・学習コストが無いので、新しいサービスを使いはじめやすい。
 
いままで、検索コストと情報価値を無意識に比較して、ググりにくかったこととかが、チャット経由で検索するコストが下がることでよりアクセスされるということは考えられるけど、その人にとってすごい重要な事(家電をどこで買うのが一番オトクかとか、どういうマンガが面白いかとか、チャットボットの作り方はどうするのかとか)は引き続きツイッターとかWebとかでググられるだろうし、いままでもその人にとって大して重要ではなかったことは、引き続きググられることなく、ユーザー受動的なまま(ニュースアプリのまとめサイト紹介とか)だと思う。
 
その間のすごく中途半端な価値の情報(テレビ観ててXXってなんだろ、とちょっと思ったりしたこととか)だったり、一時的にすぐ知りたい情報(近くで夜おそくまでやってるカフェどこ?とか夜の街情報とか)だったりすると相性がいいのかも。
終電を調べるためにYahoo乗り換えアプリを立ち上げるのはコストだが、チャットで、「終電何時?」と聞くだけで、現在地を取得して、「渋谷駅から山手線で0:24が最終です。」と教えてくれるなら、楽、とか。
 
「信ぴょう性が増してる」
・普段、チャットというと向こう側に人がいるという前提で、そのインターフェイスを踏襲している。
・そのため、機械が返してくれていることがわかっていても、なんだか人の温度を感じる。(しゃべり言葉重要。)
 
占いとか、悩み相談とか、知恵袋とか、答えが若干ぶれていても問題ないような返答にも向いていると思う。
 
あと、どこの分野もそうだけど、「ゲーム、コミュニケーション」でハマる部分はあると思う。
テキストを使ったゲーム(クイズ、しりとり、ハングマン)もしくは、匿名チャット&出合い系(LINEかまちょ)とか。
ゲームとコミュニケーションはそれ自体に価値がある。
 
BOTマーケットのブーストとか、広告とかSEOとかどうやるんだろうか。
「終電はXX時!ところで、終電逃したらここのラブホがおすすめ!(URL)」
「終電はXX時!もっと詳しく知るならNavitime!(URL)」
とか。
 
以上整理。