LINEでサイコロを振ってみる

**update : このドキュメントに出てくるbotは停止しています。**

話題のLINE bot APIを触ってみた。
簡単にできるかと思ったら実質3日もかかってしまった。

# 作ったモノ : DICE cast

![xlg5799c.png](https://qiita-image-store.s3.amazonaws.com/0/16060/00b09840-9fa8-5885-89d0-aae834a195ab.png)

## 使い方

何かを決めなきゃいけないけど手元にサイコロやコインがない！という場合に🎲を投げると何の目が出たか教えてくれます。 

※ 🎲が含まれないメッセージを送ると🎲を送ってきてくれます
※ スタンプではなく絵文字の🎲を送って下さい
※ 一部Android端末では正常に動作しない場合があります

<img width="375" alt="写真 2016-04-12 23 22 04.png" src="https://qiita-image-store.s3.amazonaws.com/0/16060/1d993b13-d037-3831-c3a5-373a26cd9e35.png">

以下、これに至るまでの試行錯誤の作業ログ。

**ほぼ無駄な手順なので参考にすると痛い目を見ます。**

# 一日目

## 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証明書がとれるらしい。
ただし[テスト用証明書ではダメ](http://qiita.com/git6_com/items/008404506836011af33b#%E4%BD%BF%E3%81%88%E3%81%B8%E3%82%93)という情報も。

**4. StartSSLを利用する**
個人であれば1年間のSSLが無料で発行できるらしい。
しかし同じく[StartSSLではダメ](http://qiita.com/git6_com/items/008404506836011af33b#%E4%BD%BF%E3%81%88%E3%81%B8%E3%82%93)という情報も。

**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
<?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の友だちが二桁になりました。

![写真 2016-04-12 23 20 52.png](https://qiita-image-store.s3.amazonaws.com/0/16060/22bbac1c-bf71-9505-6a46-ea4761d42c89.png)