Facebook Messangerにおけるエラー
Facebook Messanger上でBOTを開発し始めた矢先、奇妙なエラーに長い時間はまってしまった。
この下の画像が証拠の画像なのだが、一つのメッセージのリクエストに対して、一定時間ごとに同じレスポンスが返ってきてしまっている。

このエラーをいかに対処したかという方法をシェアしたいと思う。
書いていたコード
こちらが書いていたコードの一部抜粋である。一見トークンもちゃんとリクエストで送られていたりとしっかりしているように見える。
しかし、上記の通り何度も同じレスポンスが返ってきてしまっていた。
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としてみたら、いつまでたってもちゃんと届いたというレスポンスがないために、同じメッセージが何度も送られていたようである。
こちらが修正したコードである。
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開発に慣れていないために、少し戸惑ってしまった。困ったらリファレンスに戻る癖をつけていこうと再認識した。