Amazon Echo経由でLINE botにメッセージを投げてもらう(3)

Amazon Echo経由でLINE botにメッセージを投げてもらう - ごーちのにっき 

Amazon Echo経由でLINE botにメッセージを投げてもらう(2) - ごーちのにっき

の続きです。

My Alexa Skillと書いているところとLINEについてまとめます。

 

f:id:kmgc:20171225231555j:plain

設定の都合上、LINE側からまとめます。

LINE bot

LINE Developers

上記URLから開発者登録 & botを一つ作りましょう。公式ページにも始め方は書いてますが、例えば次のページなど、いろいろ別のページにもあるので割愛します。。

LINE bot の始め方。

 

botはMessaging APIで作ります。プランはDeveloper Trialです。
「メッセージ送受信設定」でBotグループトーク参加が利用するになっているかを確認します。(今回はグループにbotを参加させてメッセージを配信させる)

f:id:kmgc:20171229200612p:plain

Push配信を実現するためには2個の情報が必要です。

  • アクセストーク
  • 配信するユーザ もしくは グループのid

アクセストークンは「メッセージ送受信設定」で作成するだけです。

一方のidの取得は少し手がかかります。
https://developers.line.me/ja/docs/messaging-api/reference/#common-properties
の「送信元ユーザ」や「送信元グループ」に明記してあるIdによって、どこ(誰)からbotへ発信されたかが特定できるようになっています。Push配信ではこのIdが必要です。
しかし、今回のシナリオでは常にPushするだけなのでグループのIdを特定するタイミングがなさそうに見えます。

結論ですが【グループに参加させる】時にIdを取得しておきます。
botをグループに参加させたときの「参加イベント」のデータ形式を見ると
{ "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA", "type": "join", "timestamp": 1462629479859, "source": { "type": "group", "groupId": "C4af4980629..." } }
とあります。このデータが【Webhook先に指定したURLへ送信されるデータ】です。つまりWebhook先に「参加イベント」のデータ形式を受け取れるプログラムを別に作って記録すればOKです。*1

Push指示するAWS Lambda

Javaで作っています。ソースコードは次の通り。
public class LambdaFunctionHandler implements RequestHandler<SNSEvent, String> { 
   public String handleRequest(SNSEvent event, Context context) {
       String message = event.getRecords( ).get(0).getSNS( ).getMessage( );
       TextMessage textMessage = new TextMessage(message);
       PushMessage pushMessage = new PushMessage(
                                         System.getenv("DESTINATION"), textMessage);
       try {
          Response<BotApiResponse> response =
               LineMessagingServiceBuilder.create(System.getenv("ACCESSTOKEN"))
               .build( ).pushMessage(pushMessage).execute( ); 

         System.out.println(response.code( ) + " " + response.message( ));
      }catch(IOException ioe) { ioe.printStackTrace( ); }
      return message;   
    }
}

"DESTINATION", "ACCESSTOKEN"にそれぞれ「GroupID」と「アクセストークン」が入ります。

pomの設定です。

https://developers.line.me/ja/docs/messaging-api/line-bot-sdk/からたどれる
https://github.com/line/line-bot-sdk-javaを参考にpom.xmlの<dependencies>タグ内に3個の<dependency>を追加します。

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>
<dependency>
    <groupId>com.linecorp.bot</groupId>
    <artifactId>line-bot-model</artifactId>
    <version>1.12.0</version>
</dependency>
<dependency>
    <groupId>com.linecorp.bot</groupId>
    <artifactId>line-bot-api-client</artifactId>
    <version>1.12.0</version>
</dependency>

Lambda Functionを作ったあとアップロードします。このFunctionのARNをSNSの設定に使います。

2つのLambdaを繋ぐSNS

トピックを作りサブスクリプション先(通知先)に、Push配信するLambda FunctionのARNを設定します。また作成したトピックのARNをメッセージを加工するAWS Lambdaに使います。

メッセージを加工するAWS Lambda

Amazon Echo経由でLINE botにメッセージを投げてもらう(2) - ごーちのにっき

にも掲載したNode.jsでSNSに渡す情報の部分だけ再掲します。
var params = {
    Message: 'フレックス'+sign+'でお願いします。',
    Subject: 'hoge',
    TopicArn: 'arn:aws:sns:ap-northeast-1:XXX:flex'
};
TopicArnに、SNSのARNを指定します。

 

まとめ

Alexa以降はAWSの各種サービスを使ったことがあれば比較的簡単です。
まだ使ったことがない方はこれを機にAWS Lambdaだけでも触れてみるといいかもしれません。

 

*1:今回はAPI Gateway + AWS Lambdaを利用してWebhook先を実現しましたが詳細は割愛します