LoginSignup
18
17

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-04-21

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

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

LineBot

準備

  1. BOT API Trial Account取得 *4/26 追加募集開始されたようです 
  2. NiftyCloudのアプリでClassにLINE IDのフィールドを追加する。(今回は会員情報に追加)
  3. CallbackにSSL必須なので、レンタルサーバのSSL対応(月額100円なのでとりあえず1ヶ月で契約)
  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でできる全ての事を試してみたのソースを利用させていただき、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で取得できるデータの一覧に表を載せました。

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プラグインとして動作するライブラリ(非公式) からncmb-client.phpだけを利用させていただきました。

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

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はスタンプセット内の番号ではなさそうなので、こちらだけで判定しても大丈夫かもしれません。
今回は自作のスタンプを利用してみました。 が、実際にアプリ連動する際には専用スタンプが必要になりそうですね。
*スタンプ作成に関する問い合わせや作成依頼も受け付けますよ (^^;;

*STKPKGIDはストアのURL https://store.line.me/stickershop/product/1269193/ja の番号部分と同じようですが、STKIDはクリエイター画面でも不明なので一度実際に送信して確認する必要がありそうです。(スタンプの01番から40番が連番にはなっているようです)

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'];
    }

18
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
17