bot初心者です。LINE botを作ってみようと思って、
https://qiita.com/tetrapod117/items/e7b48485c98f6b88f311
上記の記事を読みながらやりましたが、うまく動きません。
なぜ動かないのかとエラー原因をgasで見つける方法を教えてください。
- 挙動
lineでbotと友達になって、botと自分が入っているグループにメッセージを送っても既読がつくのみで何も返信が来ません。 - gasに書いたコード
//LINE Developersで取得したアクセストークンを入れる var CHANNEL_ACCESS_TOKEN = 'CHANNEL_ACCESS_TOKEN'; var line_endpoint = 'https://api.line.me/v2/bot/message/reply'; //ポストで送られてくるので、送られてきたJSONをパース function doPost(e) { var json = JSON.parse(e.postData.contents); //返信するためのトークン取得 var reply_token= json.events[0].replyToken; if (typeof reply_token === 'undefined') { return; } //送られたメッセージ内容を取得 var message = json.events[0].message.text; // メッセージを返信 UrlFetchApp.fetch(line_endpoint, { 'headers': { 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, }, 'method': 'post', 'payload': JSON.stringify({ 'replyToken': reply_token, 'messages': [{ 'type': 'text', 'text': message, }], }), }); return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); };
-詳細
GAS側でアプリケーションにアクセスするユーザは「全員(匿名ユーザを含む)」になっています。
LINE Developers側でWebhookの接続確認を行うと「✔︎成功しました」となります。
そして下記の質問の回答に書いてある解決方法もやって見ましたが反応しませんでした
https://teratail.com/questions/160664
https://teratail.com/questions/5ko552bvfjhnte
この質問の回答にあるようにUrlFetchApp.fetchの戻り値を確認してみてください。
TypeError: Cannot read property 'postData' of undefined
上のようなエラーが出て、YAmaGNZさんの書いてくださった質問の回答のような結果が出ませんでした。
私が提示した内容にpostDataを指定するような箇所はありませんし、質問に提示されているソースのUrlFetchApp.fetchの部分にもpostDataを指定している箇所はありません。
どのように書いてそのエラーが出たのでしょうか?
//LINE Developersで取得したアクセストークンを入れる
var CHANNEL_ACCESS_TOKEN = 'CHANNEL_ACCESS_TOKEN';
var line_endpoint = 'https://api.line.me/v2/bot/message/reply';
//ポストで送られてくるので、送られてきたJSONをパース
function doPost(e) {
var json = JSON.parse(e.postData.contents);
//返信するためのトークン取得
var reply_token= json.events[0].replyToken;
if (typeof reply_token === 'undefined') {
return;
}
//送られたメッセージ内容を取得
var message = json.events[0].message.text;
// メッセージを返信
let res=UrlFetchApp.fetch(line_endpoint, {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
},
'method': 'post',
'payload': JSON.stringify({
'replyToken': reply_token,
'messages': [{
'type': 'text',
'text': message,
}],
}),
});
Logger.log(res.getResponseCode() + ' ' + res);
return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
};
上記のように書きました
もしかして、デバッグ実行などで直接doPostを実行されたのでしょうか?
もしそうなのであれば正しい実行方法ではありません。
Logger.logでUrlFetchApp.fetchを確認する方法を提示すべきではありませんでした。
申し訳ありません。
ログに出力して確認するのではなく、スプレッドシートなどに出力して確認してみてください。
質問にあるソースをコピペして動作させて見ましたが正常に動作しました。
変更した箇所はCHANNEL_ACCESS_TOKENの部分のみなのでCHANNEL_ACCESS_TOKENが間違っている
(コードに記載した以降に再発行してしまいトークンが変わっている等)可能性があるかと思います。
それもUrlFetchApp.fetchの戻り値を確認できれば判明するかと思います。
CHANNEL_ACCESS_TOKENを入れて見ても無理でした。
gasで作ったapiって反応したり、しなかったりすることってありますか?
UrlFetchApp.fetchの戻り値がスプシで出力されませんでした。
これって、UrlFetchApp.fetchの戻り値を得られなかったということですか?
既読がつくということはWebhookURLは呼ばれているかと思います。
スプレッドシートに出力されないのはどのようなコードで出力されたのか不明ですので何とも言えません。
すいません、コードは下のように書きました。
//LINE Developersで取得したアクセストークンを入れる
var CHANNEL_ACCESS_TOKEN = 'CHANNEL_ACCESS_TOKEN';
var line_endpoint = 'https://api.line.me/v2/bot/message/reply';
//ポストで送られてくるので、送られてきたJSONをパース
function doPost(e) {
if (typeof e === "undefined"){
//eがundefinedの場合動作を終了する
return;
}
//JSON文字列をパース(解析)し、変数jsonに格納する
var json = JSON.parse(e.postData.contents);
log(json)
//受信したメッセージ情報を変数に格納する
var reply_token = json.events[0].replyToken; //reply token
log(reply_token);
//送られたメッセージ内容を取得
var message = json.events[0].message.text;
log(message);
// メッセージを返信
var result=UrlFetchApp.fetch(line_endpoint, {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
},
'method': 'post',
'payload': JSON.stringify({
'replyToken': reply_token,
'messages': [{
'type': 'text',
'text': message,
}],
})
});
log(result);
return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
};
function log(message2){
var spreadsheet = SpreadsheetApp.openById('1WJtGzpHwOzWv3DvFmImQwjOH4-4g5MJthpHzU6_k2Fg');
var ss = spreadsheet.getSheetByName('シート1');
ss.appendRow([message2]);};
一応の確認ですが、出力されないのはUrlFetchApp.fetchの結果のみで、他のlog(message);等は出力されるのですよね?
提示されたソースを実行してみましたがCHANNEL_ACCESS_TOKENをわざと間違えた場合にUrlFetchApp.fetchにてExceptionが発生しスプレッドシートにログが出力されていませんでした。
try {
// メッセージを返信
var result=UrlFetchApp.fetch(line_endpoint, {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
},
'method': 'post',
'payload': JSON.stringify({
'replyToken': reply_token,
'messages': [{
'type': 'text',
'text': message,
}],
})
});
log(result);
} catch (e) {
log(e);
}
という感じでtry~catchにてExceptionをキャッチしログを出力するとどうでしょうか?
ログの出力が全くされないというのであれば、スプレッドシートのIDをミスっているとかデプロイのミスとかが考えられるかと思います。
教えていただいたtry~catchによってスプシにexceptionがログに書かれるようになり、
解決することができました。
エラーが起こった原因は、CHANNEL_ACCESS_TOKENをコピーするページがgoogle翻訳により日本語になるようになっていて、google翻訳がCHANNEL_ACCESS_TOKENの+や-を全角にしていたためでした。
2日間デバッグ方法やコードを見ていただきありがとうございました。
回答1件
あなたの回答
tips
プレビュー