初めに
GASを用いてLINE BOTからのリクエストを処理しようと思っていたのですが、リクエストヘッダー情報が取れずリクエストの検証ができませんでした。
doPost()とは
doPost()
は、デプロイしたGASに対してPostのリクエストを投げた際、そのリクエストを処理する関数になります。
同様に、GETのリクエストを処理するdoGet()
もあります。
/*
* 引数eにはリクエスト情報が入っている
*/
function doPost(e) {
// レスポンスで
return ContentService.createTextOutput(
JSON.stringify({'content': 'post ok'})
).setMimeType(ContentService.MimeType.JSON);
}
リクエスト情報には何が入っているのか
ということで、引数のe
に何が入っているのかを見てみようと思います。
e
をそのままスプレッドシートに吐き出すようなコードを書いてみました。
function doPost(e) {
// リクエスト情報のeをログ出力してみる
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName('log');
sheet.appendRow([new Date(), JSON.stringify(e)]);
return ContentService.createTextOutput(
JSON.stringify({'content': 'post ok'})
).setMimeType(ContentService.MimeType.JSON);
}
送るリクエストは以下です。
ヘッダーに付与した値がe
に含まれているかどうかを見てみましょう。
こちらが実際にe
に送られてきたデータを整形したものになります。
postData->type
にリクエストヘッダで指定したContent-Type
の値が入ってますが、それ以外の値はとれていません。
{
"contextPath": "",
"parameter": {},
"queryString": "",
"parameters": {},
"postData": {
"contents": "{\n \"test\": \"ttt\"\n}",
"length": 19,
"name": "postData",
"type": "application/json"
},
"contentLength": 19
}
一応公式ドキュメントも見てみる
GASの公式ドキュメントを見ると、e
にはヘッダー情報は詰められてなさそうです。
終わりに
ということで、doPostではリクエストヘッダーを取得することはできませんでした。取得したい場合はGASじゃなくGoogle Cloud Functionsなど使うのがべきなんでしょうね。
LINE Bot自体はヘッダー情報がなくても動かすことができますが、本当にLINEからのリクエストかどうかを検証することはできません。Google Cloud FunctionsやLambdaでの実装を検討しようと思います。
もしGAS上で取得できる方法を知っている方いたら教えてください。
ここまでご覧いただきありがとうございました!