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

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

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

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

5972閲覧

LINE Messaging APIで【エラー Webhookが200以外のHTTPステータスコードを返しました】というエラーが出る

pikari

総合スコア14

LINE Messaging API

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/04/25 17:06

記事と全く同じように実装してみました。

初めてオウム返しをするLINEBOTを作成しようと、コピペして実装しましたが「Webhookが200以外のHTTPステータスコードを返しました」とエラーが出てきてしまい、APIの接続確認が出来ません。
オウム返しのLINEBOTを完成させたいです。
お時間ありましたら、ご回答頂けますと幸いです。

【利用環境】
LINE MessagingAPI,GoogleAppsScript

リンク内容

【ソースコード】

var

1 2var CHANNEL_ACCESS_TOKEN = 'YOUR_CHANNEL_ACCESS_TOKEN'; 3 4function doPost(e) { 5 var event = JSON.parse(e.postData.contents).events[0]; 6 var replyToken= event.replyToken; 7 8 if (typeof replyToken === 'undefined') { 9 return; // エラー処理 10 } 11 var userId = event.source.userId; 12 var nickname = getUserProfile(userId); 13 14 if(event.type == 'follow') { 15 // ユーザーにbotがフォローされた場合に起きる処理 16 } 17 18 if(event.type == 'message') { 19 var userMessage = event.message.text; 20 // 今回は鸚鵡返しなので届いたメッセージをそのまま返します。 21 var replyMessage = userMessage 22 23 // もし届いたユーザーからのメッセージによって他にやりたい処理 24 // (ex: spread sheetへの記入など)がある場合は、ここに入れて下さい。 25 26 var url = 'https://api.line.me/v2/bot/message/reply'; 27 28 UrlFetchApp.fetch(url, { 29 'headers': { 30 'Content-Type': 'application/json; charset=UTF-8', 31 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, 32 }, 33 'method': 'post', 34 'payload': JSON.stringify({ 35 'replyToken': replyToken, 36 'messages': [{ 37 'type': 'text', 38 'text': replyMessage, 39 }], 40 }), 41 }); 42 return ContentService.createTextOutput( 43 JSON.stringify({'content': 'post ok'}) 44 ).setMimeType(ContentService.MimeType.JSON); 45 } 46} 47 48// profileを取得してくる関数 49function getUserProfile(userId){ 50 var url = 'https://api.line.me/v2/bot/profile/' + userId; 51 var userProfile = UrlFetchApp.fetch(url,{ 52 'headers': { 53 'Authorization' : 'Bearer ' + CHANNEL_ACCESS_TOKEN, 54 }, 55 }) 56 return JSON.parse(userProfile).displayName; 57} 58コード

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

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

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

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

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

guest

回答1

0

ベストアンサー

doPost()TextOutputを返すとLINEサーバー側にステータスコードとして302が返されるので、何も返さないようにすればいいです。

JavaScript

1function doPost(e) { 2 //(中略) 3 4 //(変更前) 5 //return ContentService.createTextOutput( 6 // JSON.stringify({ content: "post ok" }) 7 //).setMimeType(ContentService.MimeType.JSON); 8 9 //(変更後) 10 return; 11} 12

投稿2020/04/25 17:22

draq

総合スコア2577

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

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

pikari

2020/04/26 10:14

ご回答ありがとうございます。 以下で試してみましたが、再度「Webhookが200以外のHTTPステータスコードを返しました」と表示されてしまいます。 var CHANNEL_ACCESS_TOKEN = ''; function doPost(e) { var event = JSON.parse(e.postData.contents).events[0]; var replyToken= event.replyToken; if (typeof replyToken === 'undefined') { return; // エラー処理 } var userId = event.source.userId; var nickname = getUserProfile(userId); if(event.type == 'follow') { // ユーザーにbotがフォローされた場合に起きる処理 } if(event.type == 'message') { var userMessage = event.message.text; // 今回は鸚鵡返しなので届いたメッセージをそのまま返します。 var replyMessage = userMessage // もし届いたユーザーからのメッセージによって他にやりたい処理 // (ex: spread sheetへの記入など)がある場合は、ここに入れて下さい。 var url = 'https://api.line.me/v2/bot/message/reply'; UrlFetchApp.fetch(url, { 'headers': { 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, }, 'method': 'post', 'payload': JSON.stringify({ 'replyToken': replyToken, 'messages': [{ 'type': 'text', 'text': replyMessage, }], }), }); return; } } // profileを取得してくる関数 function getUserProfile(userId){ var url = 'https://api.line.me/v2/bot/profile/' + userId; var userProfile = UrlFetchApp.fetch(url,{ 'headers': { 'Authorization' : 'Bearer ' + CHANNEL_ACCESS_TOKEN, }, }) return JSON.parse(userProfile).displayName; }
draq

2020/04/26 11:23

コメントに書かれたコード var url = '... の行、文字列の終端の「'」が無いので実行時エラーになりますがコピペミスでしょうか。 それはともかく、 function doPost(e) { return; } だけにしてみても200 OKになりませんか? ウェブアプリケーションとして導入時に、Project Versionを「New」にして更新してからしばらく待って接続確認しても結果はかわりませんでしょうか。 私の環境では更新直後はNGでも10数秒待つと200 OKが返るようになりました。 GAS側でデプロイに時間がかかっているだけかもしれません。
pikari

2020/04/26 11:43

「'」は記載し、上記のコードのまま待ってみましたが200の方は上手くいきません。 Deploy as web appの画面の中の Test web app for your latest codeを押すとエラーになっています。 これは問題ではないですかね?
draq

2020/04/26 11:51

エラーというのが、「スクリプト関数が見つかりません: doGet」ならLINEからはPOSTアクセスしか来ないので問題ないです。 curlとか、「HTTP POST テスト」等でググって見つかるPOSTアクセス可能なツールでアクセスしてステータスコードに何が返るか確認してみてください。
draq

2020/04/26 12:20

どっちでもいいですが、curlがよくわからないなら下の方のURLが簡単なんじゃないでしょうか。 と、思ったらこのページだとステータスコード見れませんね。同じサイトの別ページの https://so-zou.jp/web-app/network/http-response/ で、MethodをPOSTに、Entity Bodyを空にして送信してみてください。 doPostはreturnするだけに変えておいてください。
draq

2020/04/26 12:26

と思ったら、このサイトなんか変ですね。他のツールだと200 OK返すのに、このサイトだと400 Bad Requestになる。
pikari

2020/04/26 12:31

このようなものが返ってきましたが、問題ありますでしょうか? レスポンス HTTP/1.1 400 Bad Request ヘッダ 値 Cache-Control キャッシュのコントロールに必要な指示や情報 no-cache, no-store, max-age=0, must-revalidate Pragma 関連するクライアント/プロキシ/サーバそれぞれに認識させるための特殊な追加情報 no-cache Expires リソース・コンテンツの有効期限。Date値 Mon, 01 Jan 1990 00:00:00 GMT Date 日付情報。RFC822形式、RFC850形式、ANSI C形式 Sun, 26 Apr 2020 12:27:45 GMT Content-Type リソース・コンテンツのアプリケーション・メディアタイプ。MIMEのメディアタイプと同様 text/html; charset=utf-8 X-Content-Type-Options nosniff X-XSS-Protection 1; mode=block Server HTTPサーバアプリケーション種類を示す固有テキスト値 GSE Accept-Ranges 返答したデータのレンジ。単位はバイト none Vary 指定されたフィールドがサーバによって受け入れ可能なオプションと判断された (Server Drivenネゴシエーション) ことを示す Accept-Encoding Transfer-Encoding 利用されている転送エンコーディング形式 (Transfer Coding:形式) chunked ※ヘッダの解説は、マウスポインタを重ねることで全体が表示されます。
pikari

2020/04/27 10:38

遅くなりました。 REST ClientでSendRequestしてみた所、「HTTP/1.1 200 OK」というのが返ってきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問