update : このドキュメントに出てくるbotは停止しています。
話題のLINE bot APIを触ってみた。
簡単にできるかと思ったら実質3日もかかってしまった。
作ったモノ : DICE cast
使い方
何かを決めなきゃいけないけど手元にサイコロやコインがない!という場合に🎲を投げると何の目が出たか教えてくれます。
※ 🎲が含まれないメッセージを送ると🎲を送ってきてくれます
※ スタンプではなく絵文字の🎲を送って下さい
※ 一部Android端末では正常に動作しない場合があります
以下、これに至るまでの試行錯誤の作業ログ。
ほぼ無駄な手順なので参考にすると痛い目を見ます。
一日目
LINE BUSINESS CENTERに登録
https://business.line.me/ja/ から登録する。
- TRIAL APIの利用は先着で1万人まで
- 本名と住所の登録が必要
- TRIAL APIは友達が50人まで
- SSL必須
- APIを叩く固定IPが必要
というあたりがハードルっぽい。
サーバーを用意
巷ではherokuを利用した構成が多いようだけれどもLet's Encryptを使ってみたかったので、さくらVPSの一番安いやつを契約する。
さくらのVPSは契約からサーバーの立ち上がりまで時間がかかるので一番最初に用意する。
(という算段だったが後にLINE botではLet's Encryptがinvalidと判断されることが判明)
ドメインを用意してVPSに向けておく
これも早めにやっておくにこしたことはない。
QiitaやTwitterでAPIについて調べてみる
どうやらLet's Encryptは使えないらしい。
すべてが嫌になったので酒を飲んで寝る。
2日目
SSLをいかにして用意するか
1. Let's Encryptでがんばってみる
既にチャレンジしている人がいるけれども、いけそうな雰囲気がない。
2. 共有サーバーのSSLでがんばってみる
共有SSLでもOKらしい。
普段使ってるxrea/coreserverが共有SSLを提供しているので、それでいけそうな気がする。
3. Global Signのテスト用証明書を利用する
LINE BOT APIを使ってPythonでLINE BOTを作ってみた
http://osa030.hatenablog.com/entry/2016/04/08/214939
によれば、無料で45日間のテスト用のSSL証明書がとれるらしい。
ただしテスト用証明書ではダメという情報も。
4. StartSSLを利用する
個人であれば1年間のSSLが無料で発行できるらしい。
しかし同じくStartSSLではダメという情報も。
5. 素直にSSLを購入する
さくらが取り扱っているラピッドSSLが年額1500円。
https://ssl.sakura.ad.jp/
サーバー代に比べれば安いが、SSLにお金を払ったら負けかなというゆがんだ価値感覚がとれない。
進め方
せっかくVPS立てたのでGlobal Signのテスト用証明書を使う。
時間が余ったらxrea/coreserverの共有SSLでもいけないか検証してみる。
Global Signの申し込み
ここから申し込む
https://jp.globalsign.com/service/ssl/testcert.html
アカウント作成のために住所とかいろいろ聞かれるので記入。
またアンケートで申し込み理由とか本番導入時期とか聞かれるので、素直に契約時期は全く決まっていないけどテスト用のSSLだけがほしいと答える。
10分くらいすると審査通過のメールが届くのでその手順通りにSSLをゲットする。
サーバーにSSLの設定
ここは特別な手順はない。
PHPで動かす予定なのでテストスクリプトを置いてhttpsでリクエストが通るところまで確認。
ブラウザ上では見えているがLINEからのリクエストが通らない
どうも調べてみるとLet's Encrypt以外のStartSSLとかグローバルサインのテスト証明書とかも全部ダメらしい。
coreserverのSSLも設定が完了しない
「ドメインウェブの設定が見つかりません」のままSSL版の https://ss1.coressl.jp/***.studio15.jp につながらない。
***.studio15.jpにはつながる。
なんなんだこれは。
嫌になったので酒を飲んで寝る。
3日目
やる気が出ない。
4日目
やる気が出たのでcoreserverの状態を見てみたらSSL版のURLが有効になっていた。
試しにテストスクリプトを置いてみたらLINEからのリクエストも通っている。
有効になるまで24時間以上かかった感じがあるので、なるはやで設定をしておいた方がよさげ。
実装
リクエストさえ通ってしまえば後はjsonのやりとりなので楽勝。
<?php
$request = file_get_contents("php://input");
$json = json_decode($request);
$content = $json->result[0]->content;
$header = array(
'Content-Type: application/json; charser=UTF-8',
'X-Line-ChannelID: ****',
'X-Line-ChannelSecret: ****',
'X-Line-Trusted-User-With-ACL: ****',
);
$post = array(
'to' => array($content->from),
'toChannel' => 1383378250,
'eventType' => '138311608800106203',
'content' => array(
'contentType' => 1,
'toType' => 1,
),
);
if (preg_match("/f3bea08f/", bin2hex($content->text))) {
$post['content']['text'] = mt_rand(1, 6);
} else {
$post['content']['text'] = '🎲';
}
$post = json_encode($post);
$ch = curl_init("https://trialbot-api.line.me/v1/events");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
課題と展望
トライアルAPIなので仕方ないけれども友だち50人の制限はかなり渋い。
本気でビジネスbotを運用しようとしている企業が「うちの技術力でもLINE botって作れそう?」という検証を想定しているんだろうか…
しかしトライアルbotが動かせたところでガチ運用に耐えられるというわけでもなさそうなので使いどころが難しい。
大量メッセージが来ても安心なLINE BOTサーバのアーキテクチャ
http://qiita.com/yoichiro@github/items/6d4c7309210af20a5c8f
反省
もう少し絵文字の判定をきちんと書こうと思ったけどSSLでハマったせいで全然注力できなかった。
本来のメイン目的のLet's Encryptも利用できなかった。
良かったところ
botのおかげでLINEの友だちが二桁になりました。