LoginSignup
4
4

More than 5 years have passed since last update.

Facebook Bot向けアプリをAWS Lambdaで実装する

Last updated at Posted at 2016-05-03

ここまでの準備

AWS API GatewayとAWS Lambdaで、HelloWorldを作成する
http://qiita.com/akira-sasaki/items/b9e8e8a0330818e3b71d

AWS API GatewayとAWS Lambdaで、Facebook Botを作成する
http://qiita.com/akira-sasaki/items/961cb7a1aa7386764863

Facebookから送られてくるJSON

Facebookから送られてくるJSON
{
  "object":"page",
  "entry":[
    {
      "id":PAGE_ID,
      "time":1457764198246,
      "messaging":[
        {
          "sender":{
            "id":USER_ID
          },
          "recipient":{
            "id":PAGE_ID
          },
          "timestamp":1457764197627,
          "message":{
            "mid":"mid.1457764197618:41d102a3e1ae206a38",
            "seq":73,
            "text":"hello, world!"
          }
        }
      ]
    }
  ]
}
Field Name Description Type
sender.id Sender user id Number
recipient.id Recipient user id Number
timestamp Timestamp of message Number
message Message Object

データ送信

Curl例
curl -X POST -H "Content-Type: application/json" -d '{
    "recipient":{
        "id":"USER_ID"
    }, 
    "message":{
        "text":"hello, world!"
    }
}' "https://graph.facebook.com/v2.6/me/messages?access_token=PAGE_ACCESS_TOKEN"

ACCESS_TOKENを取得

access_token.png

access_token2.png

おうむ返しのBotを作る

FacebookBotCallback.js
var http = require ('https');

var accessToken = "アクセストークン";
var sendingCount = 0;
var myContext;

exports.handler = function(event, context) {
    console.log('Received event:', JSON.stringify(event, null, 2));
    myContext = context;

    // パラメータチェック
    var entry = event.entry;
    if (!entry || entry.length === 0) {
        context.fail("invalid parameter");
        return;
    }

    // 各メッセージの処理
    for (var i = 0; i < entry.length; i++) {
        var messaging_events = entry[i].messaging;
        var timestamp = entry[i].time;
        for (var j = 0; j < messaging_events.length; j++) {
            var messaging = entry[i].messaging[j];
            var sender = messaging.sender.id;
            // メッセージ
            if (messaging.message && messaging.message.text) {
                var text = messaging.message.text;
                sendMessage(sender, {text: text});
            }
        }
    }
    // context.done();
};

// メッセージ送信
function sendMessage(sender, messageData) {
    var json_data = {
        recipient: {id: sender},
        message: messageData
    };
    var post_data = JSON.stringify(json_data);
    console.log("* sendMessage *" + post_data);

    var post_options = {
        host: 'graph.facebook.com',
        port: '443',
        path: '/v2.6/me/messages?access_token='+accessToken,
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Content-Length': Buffer.byteLength(post_data)
        }
    };

    var post_req = http.request(post_options, function(res) {
        res.setEncoding('utf8');
        // res.on('data', function (chunk) {
        //     console.log('Response: ' + chunk);
        // });
        res.on('end', function () {
            // console.log('End');
            sendingCount -= 1;
            if (sendingCount === 0) {
                myContext.done();
            }
        });
    });

    post_req.on('error', function (e) {
        console.error('HTTP error: ' + e.message);
        sendingCount -= 1;
        if (sendingCount === 0) {
            myContext.done();
        }
    });

    // post the data
    post_req.write(post_data);
    post_req.end();
}
4
4
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
4
4