どうも!アモーレkoooheiです。前回**Line botをAWS LambdaとAPI Gatewayでアモーレ!!- 実装編」**では、リトルに言われて自分でアモーレをつくっちゃいました♪
と言っても街行くレディに声かけてもダメなので、Line botとAWSを組み合わせたですよ!
名付けて「ぼくのアモーレ」!!
今回はそこで利用したLambdaのcodeについて解説しちゃいます。
はじめに
まずは今回のcodeを見てみましょう。
var https = require('https');
exports.handler = function(event, context) {
console.log('EVENT:', JSON.stringify(event, null, 0));
var msg = event.result[0];
var data = JSON.stringify({
to: [msg.content.from.toString()],
toChannel: 1383378250,
eventType: "138311608800106203",
content: msg.content
});
var url ='https://trialbot-api.line.me/v1/events';
var opts = {
host: 'trialbot-api.line.me',
path: '/v1/events',
headers: {
"Content-type": "application/json; charset=UTF-8",
"X-Line-ChannelID": "【Channel ID】",
"X-Line-ChannelSecret": "【Channel Secret】",
"X-Line-Trusted-User-With-ACL": "【MID】"
},
method: 'POST'
};
var req = https.request(opts, function(res){
res.on('data', function (chunk) {
console.log(res.statusCode + chunk.toString());
});
req.on('error', function(err) {
console.log('ERROR: ' + err.message);
});
});
req.write(data);
req.end();
};
このアモーレは「node.js 4.3」(現在Lambdaの最新)でできています。
説明
ということで内容を見ていきましょう。
モジュールの読み込み
Line botではやり取りはhttpsで行うため、まずはじめにhttpsモジュールを読み込みます。
var https = require('https');
モジュール化
次に関数をモジュール化を行います。lambdaのイベントハンドラで指定しているのはこの部分です。
index.handlerはindex.jsのhandlerを呼び出しているということになります。
そのため、基本的にはこの中に行いたい処理を記載していきます。
exports.handler = function(event, context) {
...................
}
受け取りデータの処理
はじめに受け取ったデータの処理を行います。
まずはどんなデータを受け取っているのかを確認する必要がありますね。
ここではconsole.logで標準出力をプリントしています。
console.log('EVENT:', JSON.stringify(event, null, 0));
consoleモジュールは標準出力と標準エラーに出力するためのものです。
この関数は引数を複数受けることができるため、この場合はReceived event:
とJSON.stringify(event, null, 0)
の二つの引数を受けています。
出力イメージとしては、
'EVENT:'
"JSON.stringify(event, null, 0)で取得した内容。"
となります。
またLambdaの場合、console.log
の出力はCloudWatchのログへ吐き出されます。
さらに、JSON.stringify(event, null, 0)
を見てみます。
JSON.stringifyはJavaScriptの値をJSON文字列に変換するメソッドです。
さらに詳しく説明すると、このオブジェクトの構文は
JSON.stringify(value[, replacer[, space]])
- 第1引数:value・・・データ
- 第2引数:replacer・・・変換する関数または配列
- 第3引数:space・・・戻り値のJSONテキストにインデントや空白文字、改行文字を追加
となります。
AWS Lambdaでは、event
パラメーターを使用してイベントデータをハンドラーへ渡します。
そのためここでは、event
パラーメーターに入っているデータを標準出力する処理となります。
実際にCloudWatchに吐き出されたログは以下になります。
送信データの作成
続いて送信データの作成を行います。
まず_msg_という変数を用意します。
var msg = event.result[0];
ここでは受け取った_event_データの_result_部分を格納しています。
次に送信するためのデータを作成します。
var data = JSON.stringify({
to: [msg.content.from.toString()],
toChannel: 1383378250,
eventType: "138311608800106203",
content: msg.content
});
内容はline-bot-apiのデータモデルを元に作成しています。
各フィールドについては以下のとおりです。
フィールド | タイプ | 内容 |
---|---|---|
to | Array of Strings | 送信先ユーザーの識別子の配列 (最大150) |
toChannel | Integer | 定数 1383378250 |
eventType | String | 定数 "138311608800106203" |
content | Content Object | このイベントのコンテンツ |
_[msg.content.from.toString()]_はクライアントから送られてきたメッセージの_from_です。つまりこの値が今回の_to_になります。
_toChannel_は送信先のChannel IDとなります。値は固定値なので「1383378250」を設定します。
_eventType_はメッセージ送信のイベントであることを示す「138311608800106203」を指定します。
_content_の_msg.content_はクライアントから送られてきたメッセージの_contet_部分になります。
これが送信コンテンツに入るためオウム返しになっています。
リクエストの作成
_opts_変数を用意し、そこにリクエストを送るために必要なデータを格納しています。
内容はhttps.requestで送るため、その形式で作ります。
var opts = {
host: 'trialbot-api.line.me',
path: '/v1/events',
headers: {
"Content-type": "application/json; charset=UTF-8",
"X-Line-ChannelID": "【LINE_CHANNEL_ID】",
"X-Line-ChannelSecret": "【LINE_CHANNEL_SECRET】",
"X-Line-Trusted-User-With-ACL": "【LINE_CHANNEL_MID】"
},
method: 'POST'
};
header_部分はline-bot-apiのエンドポイントの「-H_」のとおりになります。
次に、https.request(options, callback)に_opts_を与え、リクエストを作成します。
var req = https.request(opts, function(res){
res.on('data', function (chunk) {
console.log(res.statusCode + chunk.toString());
});
req.on('error', function(err) {
console.log('ERROR: ' + err.message);
});
});
さらに、_callback_を引数としてresponseイベントである_function(res){}_を設定します。
リクエストを作成したら、https.request.writeで作成したリクエストを送信します。
req.write(data);
送信が完了したら最後はhttps.request.endでリクエストの送信を終了します。
req.end();
以上が今回利用したcode処理についてです。
おわりに
「とにかく動かす!」とは言ったけれども、やっぱ作ったからには相手のことを知らねばなりませんね。というか知りたくなりますね!アモーレとはそういう存在ですね!ということでの解説編なわけです。
とはいえ、グラッツェ・アモーレkoooheiは実のところシェルスクリプトしか組んだことのない、プログラミング初心者なんですね。
とはいえいい加減なことはなかなか書けません!
なので一応、ドットインストールで学習し、Node.js v4.4.7 DocumentationやNode.js v0.11.11 マニュアル & ドキュメンテーションなどを読みまくりました!
なのでおかしな点がちらほろあるかも。。。ほら!
ということで暖かい目で見ていただければ幸いですm(__)m
関連
Line botをAWS LambdaとAPI Gatewayでアモーレ!!- 実装編
Line botをAWS LambdaとAPI Gatewayでアモーレ!!- code解説編
Line botをAWS LambdaとAPI Gatewayでアモーレ!!- システム解説編