Amazon Echo経由でLINE botにメッセージを投げてもらう(3)
Amazon Echo経由でLINE botにメッセージを投げてもらう - ごーちのにっき
Amazon Echo経由でLINE botにメッセージを投げてもらう(2) - ごーちのにっき
の続きです。
My Alexa Skillと書いているところとLINEについてまとめます。
設定の都合上、LINE側からまとめます。
LINE bot
上記URLから開発者登録 & botを一つ作りましょう。公式ページにも始め方は書いてますが、例えば次のページなど、いろいろ別のページにもあるので割愛します。。
botはMessaging APIで作ります。プランはDeveloper Trialです。
「メッセージ送受信設定」でBotのグループトーク参加が利用するになっているかを確認します。(今回はグループにbotを参加させてメッセージを配信させる)
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だけでも触れてみるといいかもしれません。