LINE Botが盛り上がっているのでNiftyCloudと連携させてみた（ユーザデータ取得）


[2016/04/26 追記]　BOT API Trial Accountの追加募集が開始されたようです。


NiftyCloud mBaaSを使ったiOS(Swift)アプリ[OnWorkってこんなアプリです](http://meltingpot.co.jp/onwork_info/)を作っているのですが、Android対応も必要だけど、いちから作るのは大変だなあと思っていたところ、LINE Bot Trialが発表されました。
これはうまく使えばLINEがプラットフォームになるのでAndroid対応も出来てバッチリ！と思い試しています。
どうやってやろうかと考えていたところ、[LINE BOT API Trialでできる全ての事を試してみた](http://qiita.com/betchi/items/8e5417dbf20a62f2239d)を読んで、「あっphpで出来るんだ！」と気づき、「そういえばWordPressのサイト持ってるじゃん」ということでこれまでphp触ったこともないのに挑戦しています。

<img width=240px alt="LineBot" src="http://meltingpot.co.jp/wp/wp-content/uploads/2016/04/img_3234.png">

##準備
1. [BOT API Trial Account](https://business.line.me/services/products/4/introduction)取得 __＊4/26 追加募集開始されたようです　__ 
2. NiftyCloudのアプリでClassにLINE IDのフィールドを追加する。（今回は会員情報に追加）
3. CallbackにSSL必須なので、レンタルサーバのSSL対応（月額100円なのでとりあえず１ヶ月で契約）
4. サービス時にはサーバ固定IPがいるけれど、とりあえずお試しなのでPINGでIP確認してWhite Listに登録。
5. Line BotのアカウントをLINEでお友達に登録。

##やること
1. LINE BotでCallbackを受診し、応答を返す。
2. LINEのメッセージから送信元のLINE IDとスタンプ情報を取り出す。
3. 送信元のLINE IDをキーにNiftyCloudから会員情報を読出し、応答する。
4. スタンプの情報を判定しメッセージを変える。

##LINE BotでCallbackを受診し、応答を返す
ここは[LINE BOT API Trialでできる全ての事を試してみた](http://qiita.com/betchi/items/8e5417dbf20a62f2239d)のソースを利用させていただき、callback.php の $CHANNEL_ID、$CHANNEL_SECRET、$CHANNEL_MIDを取得したTrial IDに合わせて変更するだけでOKでした。

##LINEのメッセージから送信元のLINE IDとスタンプ情報を取り出す

送信元のLINE IDは受診したメッセージの'from'（$rcv_message->from）に入っています。
スタンプ情報は'contentMetaData'（$rcv_message->contentMetadata->STKPKGID等）に入っています。
メッセージのタイプごとに取れる情報が違います。何の情報が取得できるかは[LINE Botで取得できるデータの一覧](http://qiita.com/hiro_hosono/items/a744c420fd48c9e045ad)に表を載せました。

    
```php:LineBot.php    
private function check_message_type($rcv_message) {

    //line id($rcv_message->from)からユーザ情報を読み出す
    $result_text = $this->ncmb_get_user($rcv_message->from);

    switch ($rcv_message->contentType) {
        case 1: // TEXT
            $result_text .= "\n"."「".$rcv_message->text."」ですね！";
            break;
        case 2: // Image
            $result_text .= "\n"."写真 ですね！";
            break;
        case 3: // Video
            $result_text .= "\n"."ビデオ ですね！";
            break;
        case 4: // Audio
            $result_text .= "\n"."音声メモ ですね！";
            break;
        case 7: // Location
            $result_text .= "\n"."あなたの現在地は ".$rcv_message->location->address;
            $result_text .= "\n"."緯度経度は(".(string)$rcv_message->location->latitude;
            $result_text .= ",".(string)$rcv_message->location->longitude.")ですね。";
            break;
        case 8: // Sticker
            //STKPKGIDとSTKIDからスタンプを判定
            $result_text .= $this->check_sticker((string)$rcv_message->contentMetadata->STKPKGID,
                                          (string)$rcv_message->contentMetadata->STKID);
            break;
        case 10: // Contact
            $result_text .= "\n".".mid=".(string)$rcv_message->contentMetadata->mid;
            $result_text .= "\n".".displayName=".(string)$rcv_message->contentMetadata->displayName;
            break;
        default :
            break;
    }

    return $result_text;

}
```

##送信元のLINE IDをキーにNiftyCloudから会員情報を読出し、応答する

この部分は[WordPressプラグインとして動作するライブラリ（非公式）](https://github.com/ndyuya/ncmb-article-replication) からncmb-client.phpだけを利用させていただきました。

データの読み出しは事前に会員情報にuserNameKanji（漢字指名）とlineIDフィールドを追加しておき、lineIDをキーにuserNameKanjiを読み出しています。
＊最初はlineIDがわからないと思うので、メッセージを送信すると「あなたは誰ですか？LINE id:xxxxxx」と表示されます。このLINE idを会員情報のlineIDに登録してください。


```php:LineBot.php    
include_once('NCMB/ncmb-client.php');

    private function ncmb_get_user($line_id) {
        
        $result_user = null;

        $ncmb_client = new NCMBClient($this->app_key,$this->cli_key);
        $query_string = http_build_query(
            array('where' => json_encode(array(
                'lineID' => $line_id ,
            )))
        );
        
        $search_results_string = $ncmb_client->get('/users?' . $query_string); // usersには/classes付けない

        $search_results = json_decode($search_results_string, true);

        if (count($search_results['results']) == 0) {
            $result_user = 'あなたは誰ですか？'."/n";
            $result_user .= 'LINE id:'.$line_id."/n";
        } else {
            $user_info = $search_results['results'][0];
            $selected_user = $user_info['userNameKanji'];
            $result_user =  $selected_user.'さん';
        }
        return $result_user ;
    }
```

##スタンプの情報を判定しメッセージを変える
STKPKGIDとSTKIDからスタンプを判定しています。
＊STKIDはスタンプセット内の番号ではなさそうなので、こちらだけで判定しても大丈夫かもしれません。
今回は自作の[スタンプ](https://store.line.me/stickershop/product/1269193/ja)を利用してみました。　が、実際にアプリ連動する際には専用スタンプが必要になりそうですね。
 _＊スタンプ作成に関する問い合わせや作成依頼も受け付けますよ_ (^^;;
 
＊STKPKGIDはストアのURL https://store.line.me/stickershop/product/1269193/ja の番号部分と同じようですが、STKIDはクリエイター画面でも不明なので一度実際に送信して確認する必要がありそうです。（スタンプの０１番から４０番が連番にはなっているようです）


```php:LineBot.php 
    private function check_sticker($stkpkgID,$stkID){
        $stk_type = [
            '10913018' => ['command' => 0,'text' =>  "「出勤」ですね。\n今日も1日頑張ってくださいね！"],
            '10913020' => ['command' => 1,'text' =>  "「退勤」ですね。\nお疲れさまでした。"],
        ];

        if ($stkpkgID != self::VALID_STKPKGID) { return $stkpkgID.'は知らないスタンプです';};
        if ($stk_type[$stkID] == null)  { return '意味のないスタンプです';};
        return $stk_type[$stkID]['text'];
    }

```