現在、Google Apps script(GAS)を使って、サーバレスでLine bot を作ってます。
GASはGoogleが提供する、サーバサイドのスクリプトです。
サーバ環境を自前で用意することなく、しかも無料でJavascriptを動作できます。
Line botは、Lineが提供するMassaging APIを利用して作れます。
このGASを使ってMessaging APIと連携し、Line botを作っている人がたくさんいたので、自分も作ることにしました。
まずは、送信されたメッセージをおうむ返しするだけのbotです。
この方のページを参考に作りました。
しかし、botにメッセージを送っても返って来ない現象が起き、なかなか解決できずハマってしまったので、その原因と解決方法を書きます。
原因・解決方法
最初に、Massaging APIを使用するまでのLine上の設定や、GASを使用するためのプロジェクトの準備が必要ですがこれは省略します。
今回自分でハマった箇所についてだけ書きますので、その他設定方法については上記リンク等他のサイトを参考にしてください。
まず、GASのjsのコードは以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | function doPost(e) { var events = JSON.parse(e.postData.contents).events; events.forEach(function(event) { if(event.type == "message") { reply(event); } else if(event.type == "follow") { follow(event); } else if(event.type == "unfollow") { unFollow(event); } } }); } function reply(e) { var channel_access_token = "massaging apiから提供されるchannel_access_token"; var message = { "replyToken" : e.replyToken, "messages" : [ { "type" : "text", "text" : ((e.message.type=="text") ? e.message.text : "Text以外は返せません・・・") } ] }; var replyData = { "method" : "post", "headers" : { "Content-Type" : "application/json", "Authorization" : "Bearer " + channel_access_token, }, "payload" : JSON.stringify(message) }; addLog(replyData); UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", replyData); } |
doPost()は、Messaging apiからwebhookでpostされた時に実行される関数です。
reply()は、送られてきたメッセージをそのままMessaging apiにレスポンスで返す関数です。
ですが、上記のコードだと、line botにメッセージ送っても応答なしでした。
gas上でログを見たら、messaging api からのpostは来ていて、メッセージも受け取れているのに。
いろんな方が書く、おうむ返しのline botの作り方を見ても、原因はわかりませんでした。
しかし、Messaging apiのドキュメントを見たところ、
「ボットアプリのサーバーにwebhookから送信されるHTTP POSTリクエストには、ステータスコード200
を返す必要があります。」
と書かれてました。
そこで、先ほどのコードのreply()の最後に、下記に示すステータスコードを返却するコードを追記したところ、無事おうむ返しできました!!
UrlFetchApp.fetch()はhttpレスポンスを投げるコードで、その戻り値を変数に入れて、
response.getResponseCode()をreturnしたokです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | function reply(e) { var channel_access_token = "massaging apiから提供されるchannel_access_token"; var message = { "replyToken" : e.replyToken, "messages" : [ { "type" : "text", "text" : ((e.message.type=="text") ? e.message.text : "Text以外は返せません・・・") } ] }; var replyData = { "method" : "post", "headers" : { "Content-Type" : "application/json", "Authorization" : "Bearer " + channel_access_token, }, "payload" : JSON.stringify(message) }; addLog(replyData); var response = UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", replyData); return response.getResponseCode(); } |
言ってる説明が100%正しいかわかりませんが
とにかくこのコードでおうむ返しのline botは動きます!!
あと、今回、ログの確認は、スプレッドシートに変数を吐き出して行いました。
gasにもログ見れる機能は備わってますが、doPostが動くときは、gasに備わっているログ確認機能では見れませんでした。
スプレッドシートにログを吐き出す方法は
ここを参考にしました。