LoginSignup
3
2

More than 5 years have passed since last update.

FacebookのBOTで何度も同じレスポンスが返ってくる時の対処法

Last updated at Posted at 2016-09-14

Facebook Messangerにおけるエラー

Facebook Messanger上でBOTを開発し始めた矢先、奇妙なエラーに長い時間はまってしまった。

この下の画像が証拠の画像なのだが、一つのメッセージのリクエストに対して、一定時間ごとに同じレスポンスが返ってきてしまっている。

IMG_1151.jpg

このエラーをいかに対処したかという方法をシェアしたいと思う。

書いていたコード

こちらが書いていたコードの一部抜粋である。一見トークンもちゃんとリクエストで送られていたりとしっかりしているように見える。
しかし、上記の通り何度も同じレスポンスが返ってきてしまっていた。

before
http.createServer(function (req, res) {
    if (!req.url.match(/\/zip|\/\?hub\.mode/)){
        res.statusCode = 404;
        res.setHeader('Content-Type', 'text/plain');
        res.end('error');
        return;
    } else if (req.url.match(/\/\?hub\.mode/)){
        var param = url.parse(req.url,true);
        if (param.query['hub.verify_token'] === '***') {
            res.end(param.query['hub.challenge']);
        } else {
            res.end('Error, wrong validation token');
        }
        return;
    }
    if(req.method=='POST') {
        var body='';

        req.on('data', function (data) {
            body +=data;
        });
        req.on('end',function(){

            qs.parse(body);

            //決められたテキストや画像や音声を送るメソッド
            sendResponse(JSON.parse(body), res);
        });
    }else if(req.method=='GET') {
        res.end('');
    }
}).listen(process.env.PORT || 5000);


Facebookのリファレンスを見ると

Stackoverflowで質問してみたところ、リファレンスをよく見ろとの言葉が。(海外エンジニアの優しさが身にしみます)

要するに、「webhookのコールバックではFacebookからのレスポンスがちゃんと来たことを知らせるために、200のステータスコードを持つレスポンスを送る必要がある」と書いてある。

Response
Your webhook callback should always return a 200 OK HTTP response when invoked by Facebook. Failing to do so may cause your webhook to be unsubscribed by the Messenger Platform.

Facebookとしてみたら、いつまでたってもちゃんと届いたというレスポンスがないために、同じメッセージが何度も送られていたようである。

こちらが修正したコードである。

after
if(req.method=='POST') {
        var body='';

        req.on('data', function (data) {
            body +=data;
        });
        req.on('end',function(){

            qs.parse(body);
            sendResponse(JSON.parse(body), res);

            //以下追記したコード
            res.statusCode = 200;
            res.end('');


        });

まとめ

たった2行のコードがないために、ちょっとしたエラーが起きてしまった。BOT開発に慣れていないために、少し戸惑ってしまった。困ったらリファレンスに戻る癖をつけていこうと再認識した。

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