3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Line botをAWS LambdaとAPI Gatewayでアモーレ!!- code解説編

Last updated at Posted at 2016-07-21

どうも!アモーレkoooheiです。前回**Line botをAWS LambdaとAPI Gatewayでアモーレ!!- 実装編」**では、リトルに言われて自分でアモーレをつくっちゃいました♪
と言っても街行くレディに声かけてもダメなので、Line botとAWSを組み合わせたですよ!
名付けて「ぼくのアモーレ」!!

今回はそこで利用したLambdaのcodeについて解説しちゃいます。

はじめに

まずは今回のcodeを見てみましょう。

myAmore
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モジュール
    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に吐き出されたログは以下になります。
amore04_log.png

送信データの作成

続いて送信データの作成を行います。
まず_msg_という変数を用意します。

event
var msg = event.result[0];

ここでは受け取った_event_データの_result_部分を格納しています。
amore04_log2.png

次に送信するためのデータを作成します。

JSON.stringify
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_になります。
amore04_log3.png

_toChannel_は送信先のChannel IDとなります。値は固定値なので「1383378250」を設定します。

_eventType_はメッセージ送信のイベントであることを示す「138311608800106203」を指定します。

_content_の_msg.content_はクライアントから送られてきたメッセージの_contet_部分になります。
amore04_log4.png

これが送信コンテンツに入るためオウム返しになっています。

リクエストの作成

_opts_変数を用意し、そこにリクエストを送るために必要なデータを格納しています。
内容はhttps.requestで送るため、その形式で作ります。

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_を与え、リクエストを作成します。

https.request
    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で作成したリクエストを送信します。

https.request.write
req.write(data);

送信が完了したら最後はhttps.request.endでリクエストの送信を終了します。

https.request.end
req.end();

以上が今回利用したcode処理についてです。

おわりに

「とにかく動かす!」とは言ったけれども、やっぱ作ったからには相手のことを知らねばなりませんね。というか知りたくなりますね!アモーレとはそういう存在ですね!ということでの解説編なわけです。
とはいえ、グラッツェ・アモーレkoooheiは実のところシェルスクリプトしか組んだことのない、プログラミング初心者なんですね。
とはいえいい加減なことはなかなか書けません!
なので一応、ドットインストールで学習し、Node.js v4.4.7 DocumentationNode.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でアモーレ!!- システム解説編

3
3
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
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?