彼女つくれなかった ~LINEBotを試してみる(MessageAPI+AWS GatewayAPI+Lambda)~

記事のタイトルでいきなり落ちちゃってますが、

カノジョできないエンジニア Advent Calendar 2016
http://qiita.com/advent-calendar/2016/no-girlfriend

こちらのカレンダーで、

彼女がいないなら創ればいいじゃない

という題名で、彼女を作る予定でしたが、時間的に知識的にもいろいろ無理でした。

ということでのカノジョできないエンジニア Advent Calendar 2016、16日目です。
とりあえず時間もないのでそれっぽいものを作ろうと、
LINE MessageAPI + AWS GatewayAPI+Lambdaを使ってかんたんなLINEBotを作りました。

全体像はこんな感じです(GatewayAPIのスクショ貼ってサボるやつ)

流れは、
Botに対してメッセージが飛んできたら、LINEDevelopersに登録したWebhookURL(GatewayAPI)にリクエストが飛んで来るので、
GatewayAPIで受け取って、Lambdaにあげて、MessageAPIに適切なリクエスト投げる感じです。

MessageAPIの申請とかAWSの使い方は、いろんなところに溢れてるので、
LambdaのFunctionと実際のスクショを扠さっと貼って終わりにしたいと思います!!!
(手順は暇な時にできたら追記します!!)

LINE API Reference
https://devdocs.line.me/ja/

Amazon API Gateway (API を簡単に作成・管理) | AWS
https://aws.amazon.com/jp/api-gateway/

AWS Lambda とは – AWS Lambda
http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html

 

Lambda node.js Function

お返事の内容が必要なのでDoCoMo雑談対話APIを使ってサボることにしました!

雑談対話 | docomo Developer support | NTTドコモ
https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=dialogue&p_name=api_reference

var https = require('https');

exports.handler = function(event, context) {

    // 色々気持ち悪かったからきれいにする
    var param = JSON.parse(JSON.stringify(event));

    if (!param.events){
        return context.fail("fail");
    }
    var reply;

    // userとutt(話しかける内容)以外は公式通りに入れてみる
    var data = JSON.stringify({
      "utt": param.events[0].message.text,
      "context": "10001",
      "user": param.events[0].source.userId,
      "nickname": "光",
      "nickname_y": "ヒカリ",
      "sex": "女",
      "bloodtype": "B",
      "birthdateY": "1997",
      "birthdateM": "5",
      "birthdateD": "30",
      "age": "16",
      "constellations": "双子座",
      "place": "東京",
      "mode": "dialog",
      "t": "20"
    });

    // パラメータ準備
    var opts = {
        host: 'api.apigw.smt.docomo.ne.jp',
        path: '/dialogue/v1/dialogue?APIKEY={APIKEY}',
        method: 'POST',
        headers: {
            "Content-Type": "application/json",
        }
    };

    //リクエスト送信
    var req = https.request(opts, function(res){
        res.on('data', function(d){
            console.log('statusCode: ', res.statusCode);
            console.log('headers: ', res.headers);

            var reply = JSON.parse(d);
            // 返事のテキストとreplyTokenをセットする
            var data = JSON.stringify({
                replyToken: param.events[0].replyToken,
                messages : [
                    {
                        "type":"text",
                        "text": reply.utt
                    }
                ]
            });
            // ポストする
            post_message(data);
        }).on('error', function(e){
            console.log(e.stack);
        });
    });
    req.write(data);
    req.end();

    /**
     * MessageAPIにPOSTを投げる
     */
    function post_message(data) {

        // パラメータ準備  
        var opts = {
            host: 'api.line.me',
            path: '/v2/bot/message/reply',
            headers: {
                "Content-Type": "application/json; charset=UTF-8",
                "Authorization": " Bearer " + "{ChannelAccessToken}"
            },
            method: 'POST'
        };

        //リクエスト送信
        var req = https.request(opts, function(res){
            console.log('statusCode: ', res.statusCode);
            console.log('headers: ', res.headers);
            res.on('data', function(d){
                console.log(d.toString());
            }).on('error', function(e){
                console.log(e.stack);
            });
        });
        req.write(data);
        req.end();
    }
};

 

できあがったのがこれ

最終的には結ばれました。
めでたしめでたし。

(๑´•.̫ • `๑)

コメントを残す