質問編集履歴

2 修正

vac

vac score 9

2018/11/28 23:04  投稿

LINE bot でおうむ返しができない【初心者】
## LINE botを作ろうとしているのですが、その最初であるオウム返しbotが上手く動きません。
bot初心者です。LINE botを作ってみたいと思い、
https://qiita.com/tetrapod117/items/e7b48485c98f6b88f311
上記の記事を読みながら進めていったのですが、上手く動きません。
原因となりそうなものを教えてくださるか、原因箇所の切り分けの仕方を教えていただけるととても嬉しいです。
## 挙動
LINEで友達になってメッセージを送っても、既読がつくのみで何も返信がこない。
## 概要
botの概要としては、botをGoogleAppsScript上で動かして、MessangerAPIからのPOSTを確認して、そのまま返すだけです。
以下のコードをGAS上にペーストし、アクセストークンを書き換えました。
```
//LINE Developersで取得したアクセストークンを入れる
var CHANNEL_ACCESS_TOKEN = 'YOUR_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の接続確認を行うと「✔︎成功しました」となります
POSTがされないのか、doPost()が呼ばれていないのか、返答が遅れていないのか、よくわかりません。Loggerも使ってみましたが何も表示されずよくわからず仕舞いです...
## デバッグ
## 追加検証(追記)
console.log()等で原因探しを進めてみましたが、StackdriverLoggingの方には、リクエスト失敗のエラーしか出力されません。
```
function doPost(e) {
 console.info("ここまできた");   //出力されてない
 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; 
 // メッセージを返信   
 var response = UrlFetchApp.fetch(line_endpoint, {
   'headers': {
     'Content-Type': 'application/json; charset=UTF-8',
     'Authorization': 'Bearer ' + access_token,
   },
   'method': 'post',
   'payload': JSON.stringify({
     'replyToken': reply_token,
     'messages': [{
       'type': 'text',
       'text': message,
     }],
   }),
 });
 
 // サンプル
 try {
   var rcode = response.getResponseCode();
   var rbody = response.getContentText();
   if (rcode !== 200) {
     console.log("%d: %s", rcode, rbody); //出力されてない
   }
 } catch(e) {
   console.log(e); //出力されていない
 }
 return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}
```
##### 結果
```
https://api.line.me/v2/bot/message/reply のリクエストに失敗しました(エラー: 401)。サーバー応答の一部: {"message":"Authentication failed due to the following reason: accessToken expired(2). Confirm that the access token in the authorization header is...(応答の全文を見るには muteHttpExceptions オプションを使用してください) at doPost(コード:19)
```
アクセストークンは再発行して最新のものに書き換えたので、問題ないと思いますが、何か手がかりがあれば教えていただけると嬉しいです。
  • Google Apps Script

    1543 questions

    Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

1 デバッグを進めました

vac

vac score 9

2018/11/28 23:04  投稿

LINE bot でおうむ返しができない【初心者】
## LINE botを作ろうとしているのですが、その最初であるオウム返しbotが上手く動きません。
bot初心者です。LINE botを作ってみたいと思い、
https://qiita.com/tetrapod117/items/e7b48485c98f6b88f311
上記の記事を読みながら進めていったのですが、上手く動きません。
原因となりそうなものを教えてくださるか、原因箇所の切り分けの仕方を教えていただけるととても嬉しいです。
## 挙動
LINEで友達になってメッセージを送っても、既読がつくのみで何も返信がこない。
## 概要
botの概要としては、botをGoogleAppsScript上で動かして、MessangerAPIからのPOSTを確認して、そのまま返すだけです。
以下のコードをGAS上にペーストし、アクセストークンを書き換えました。
```
//LINE Developersで取得したアクセストークンを入れる
var CHANNEL_ACCESS_TOKEN = 'YOUR_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の接続確認を行うと「✔︎成功しました」となります
POSTがされないのか、doPost()が呼ばれていないのか、返答が遅れていないのか、よくわかりません。Loggerも使ってみましたが何も表示されずよくわからず仕舞いです...
POSTがされないのか、doPost()が呼ばれていないのか、返答が遅れていないのか、よくわかりません。Loggerも使ってみましたが何も表示されずよくわからず仕舞いです...
## デバッグ
console.log()等で原因探しを進めてみましたが、StackdriverLoggingの方には、リクエスト失敗のエラーしか出力されません。
```
function doPost(e) {
 console.info("ここまできた");   //出力されてない
 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; 
 // メッセージを返信   
 var response = UrlFetchApp.fetch(line_endpoint, {
   'headers': {
     'Content-Type': 'application/json; charset=UTF-8',
     'Authorization': 'Bearer ' + access_token,
   },
   'method': 'post',
   'payload': JSON.stringify({
     'replyToken': reply_token,
     'messages': [{
       'type': 'text',
       'text': message,
     }],
   }),
 });
 
 // サンプル
 try {
   var rcode = response.getResponseCode();
   var rbody = response.getContentText();
   if (rcode !== 200) {
     console.log("%d: %s", rcode, rbody); //出力されてない
   }
 } catch(e) {
   console.log(e); //出力されていない
 }
 return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}
```
##### 結果
```
https://api.line.me/v2/bot/message/reply のリクエストに失敗しました(エラー: 401)。サーバー応答の一部: {"message":"Authentication failed due to the following reason: accessToken expired(2). Confirm that the access token in the authorization header is...(応答の全文を見るには muteHttpExceptions オプションを使用してください) at doPost(コード:19)
```
アクセストークンは再発行して最新のものに書き換えたので、問題ないと思いますが、何か手がかりがあれば教えていただけると嬉しいです。
  • Google Apps Script

    1543 questions

    Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る