麦星 - arcturus technologies- 

テクノロジー関連情報と日常的な何かを発信しています

Function Compute で LINE BOT

こんばんは。最近、頻繁にLINEと戯れている@うしです。

会社でLINEのサービス(LINE Pay やLINE BOTなど) を調査する機会があり、
LINEについて色々知ったので、LINEからAlibaba Cloudの「Function Compute」を
WEB Hookにて起動させるLINEBOTなどの以下機能を
実装してみたので、内容をシェアさせて頂きます。

 

○ やったこと
  1. LINE BOTの作成 & Function Computeでの応答
  2. Function Compute から LINE へPUSH通知(メッセージ送信)
  3. LINE Clova の(簡易)スキル開発 ・・・こちらは会社のBLOGで記事を書こうと思います。 など
○ 付随してやった作業
  • Alibaba Cloud アプリケーションサービスの「Log Service」の有効化とプロジェクト設定
○ 必要なもの
  • ブラウザ(私はChromeで操作しました)
○ 参考サイト
○ 構成図

ざっくりですが、構成は以下の様になります。
f:id:tangniu:20181229142601p:plain

○ 作業内容
LINE BOTの作成 & Function Computeでの応答 について
  • LINE BOTの作成方法については、上記参考サイトをご参照下さい。

  • Function Computeでの応答 について
    Function Compute の構成は、①サービス > ②関数 > ③トリガーと3段階あり
    作成する順番も①から③順に作成します。 (削除する場合はこの逆)    
    コンソールからサービス・関数を作成する方法はこちらの記事をご参照下さい。

  • 今回作成するサービス・関数の設定を以下の様にします。

    • リージョン ・・・ 日本( TOKYO )
    • サービス名 ・・・ LINE
    • 関数名   ・・・ BOT
    • 関数の説明 ・・・ LINE BOT
    • ランタイム ・・・ PHP7.2
    • コード設定 ・・・ インライン編集
    • トリガー名 ・・・ BOT
    • トリガー  ・・・ HTTPトリガー

※ 上記の1~3の作業全てHTTPトリガーで、インライン編集での作業です。
  
  

  • 作成手順
    1. Function Computeでサービス作成
      f:id:tangniu:20181229143029p:plain

    2. 関数の作成(関数テンプレート選択) f:id:tangniu:20181229143230p:plain

    3. 関数の作成(トリガーの設定) f:id:tangniu:20181229143818p:plain

    4. 関数の作成(関数の設定) f:id:tangniu:20181229143922p:plain

    5. 関数の作成(設定の確認) f:id:tangniu:20181229143955p:plain

  
  

デバッグについて
  • 関数を作成すると、URLが発行され、デバッグが出来る様になります。
  • HTTPトリガーデバッグにあるURL(モザイクの箇所)をコピーし、デバッグを行います。

f:id:tangniu:20181229144159p:plain

  • また、URLへPOSTする以前に、送信するJSONデータを入力し、デバッグを実施することも可能です。
    以下は、LINEのアプリからBOTに対してテキストメッセージを送信した場合に、
    Web Hook にてPOSTされるJSONにサンプルになります。

  • POSTされるJSONサンプル

{
    'events': [{
        'timestamp': 1475888904212,
        'replyToken': '765734es2331b3f3646ea5e96v125',
        'message': {
            'type': 'text',
            'id': '4989775490995',
            'text': '角野卓三?'
        },
        'type': 'message',
        'source': {
            'userId': 'U41db4b49b4fc85bc0a4aacc40e261ac4',
            'type': 'user'
        }
    }]
}
  • デバッグでのはまりどころ
    • 実際のPOSTデータは、当然URLエンコードされています。勿論、JSONエンコードもされています。
    • 以下の画像の様に、Body > raw > JSON(application/json)を選択し、
      サンプルJSONを入力し実行することによりデバッグが出来るのですが、
      JSONデータは、以下画像の様にダブルクォーテーション「"」で括る必要があります。

f:id:tangniu:20181229162752p:plain

  • コードは以下になります。
    "Your Access Token"の箇所にLINEから取得したアクセストークンを設定すれば動作します。
<?php
use RingCentral\Psr7\Response;
function handler($request, $context): Response
{
    $body = $request->getBody()->getContents();
    $body = urldecode (  $body );
    $json = json_decode( $body , true );
    if( !is_null( $json ))
    {
      $events = $json["events"][0];
      $message_type = $events["message"]["type"];
      if($message_type != "text") exit;
      $replyToken = $events["replyToken"];
      $message_text = $events["message"]["text"];
      $type = $events["type"];
      $userId = $events["source"]["userId"];
      $return_message_text = "「" . $message_text . "」じゃねーよwww";
      $response_format_text = [
        "type" => $message_type,
        "text" => $return_message_text
      ];
 
      $post_data = [
          "replyToken" => $replyToken,
          "messages" => [$response_format_text]
      ];
      $ch = curl_init("https://api.line.me/v2/bot/message/reply");
      $accessToken = "Your Access Token";
      curl_setopt($ch, CURLOPT_POST, true);
      curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));
      curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json; charser=UTF-8',
        'Authorization: Bearer ' . $accessToken
      ));
      $result = curl_exec($ch);
      curl_close($ch);
    }
    return new Response(
        200,
        array(
            "Content-Type" => "application/json",
        ),
        "hello world"
    );
}
○ 実際の動作

実際に動作させてみると・・・
角野卓三?と入力すると「角野卓三?」じゃねーよwwwの様にBOTが駆動し返信します。

f:id:tangniu:20181229175114p:plain

○ まとめ
  • ここまで読んで頂きありがとうございます。
  • Function Computeは、色々なイベントをトリガーに、手軽に駆動させられる
    イベント駆動型のツールなのでリアルタイムでの処理なんかに向いているね☆と思いました。
  • また、推奨されない設定ですが、「Function Compute」から「Function Compute」を駆動してみたり、
    Alibaba Cloud 内のサービスとの連携が色々できそうなので、Alibaba のサービスが増える度に用途が広がりそうです。
  • 次回は、LINE Clova のスキル開発と「Function Compute」についてブログを書きたいと思います。

でわ