質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google Apps Script

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

Q&A

解決済

2回答

18218閲覧

LINE bot でおうむ返しができない【初心者】

vac

総合スコア11

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google Apps Script

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

0グッド

1クリップ

投稿2018/11/27 10:34

編集2018/11/28 14:05

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)

アクセストークンは再発行して最新のものに書き換えたので、問題ないと思いますが、何か手がかりがあれば教えていただけると嬉しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

console.logが動いていないということで考えられるのが
・LineのデベロッパーサイトのURLの設定が間違えている
・Webアプリケーションとして導入で新規作成をしていないかアクセスできる人を匿名を含むにしていない
・設定が正しいが反映されていない(以前自分もweb hocksを設定したのにリクエストが飛んでこないためLINEデベロッパーサイトで、Web hocksをOFFとON繰り返したところ動きました)

投稿2018/12/04 04:44

tamanegine

総合スコア177

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

vac

2018/12/05 07:37

tamanegine様のお答えを試して見たところ、動きました! 動かなかったのは、『Webアプリケーションとして導入』で『新規作成』にしていなかったのが原因でした!プロジェクトバージョンは更新していかないと前のプロジェクトが動いてしまうということなんですね... 序の序でつまづいて諦めかけていた所だったので、本当に助かりました。 ありがとうございました!
guest

0

fetch()の戻り値を判断したほうが良いです。
多分200以外で返っていると思うので、ステータスコードから原因を調査して下さい。

ログはLoggerではなくconsoleを使います。

GAS

1// サンプル 2try { 3 var response = UrlFetchApp.fetch(line_endpoint, options); // optionsはPOSTデータ 4 var rcode = response.getResponseCode(); 5 var rbody = response.getContentText(); 6 if (rcode !== 200) { 7 console.log("%d: %s", rcode, rbody); 8 } 9} catch(e) { 10 console.log(e); 11}

投稿2018/11/27 11:46

編集2018/11/27 12:03
shozi3

総合スコア691

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

vac

2018/11/28 06:49

ご回答ありがとうございます。 console.log()で調査してみたところ、401が返ってきていました。アクセストークンが期限切れと表示されていました。 ``` "message":"Authentication failed due to the following reason: accessToken expired(2). ``` これなのですが、アクセストークンは最新のものを使っていたはずなのですが、なぜこのような表示になるのでしょうか...?アクセストークンを再発行して再度試してみても上手く動きません。何度かアクセストークンの再発行はしましたが、コードは最新のアクセストークンに置き換えていたのですが。
shozi3

2018/11/28 11:53

「ウェブアプリケーションとして導入」を更新する度に行っていますか?
vac

2018/11/28 13:25

はい、行っています。
vac

2018/11/28 13:51

すいません、console.log()で調査したと申し上げたのですが、よく見るとそれすらも動いていませんでした。3つ前のコメントに貼った出力は、リクエストに失敗すると自動で出るログのようです。console.log()をdoPost()内の先頭に追加しても出てきません。
shozi3

2018/11/28 23:11

fetchを try-catchで囲まないと意味ないと思いますけど。 アクセストークン、Webhook URLは正しく設定したが doPostがコールされないということですか?
papinianus

2018/12/04 05:35

ウェブアプリケーションとして導入のときにバージョンを新規作成に変えていますか?
vac

2018/12/05 07:40

shozi3 さん、ご回答ありがとうございました。デバッグ法を知れたので今後役に立つ方法を学ばせていただきました。 papinianus さん、ご回答ありがとうございます。まさにその通りでした!回答はtamanegineさんの方がお早かったのでBAはそちらにしましたが、お気持ちに感謝します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問