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

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

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

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

Google Apps Script

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1727閲覧

LINEbotが応答しない [初心者]

Qchan.8

総合スコア2

LINE Messaging API

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

Google Apps Script

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2022/12/23 04:55

LINEbot初心者です。
心理テストのような診断botを作るため、
初めにmessageとfollowイベントを受け取ったら挨拶文を送るという部分でアドバイスを頂きたいです。

LINEbotにメッセージを送っても、応答せず困っています。
原因となりそうなもの、また原因箇所の切り分けの仕方を教えて頂けるととても嬉しいです。

JavaScript

1 2 //固定値 3 const CHANNEL_ACCESS_TOKEN ='H****Du0zICfpe+o0dQ1imBlCBhEbE4Knj3eZnHQKkaO5fjIJEIkIiXeIxrXGv2c2o/rONZtsMf7QtsYw2YQ20H+G+pvX/nqdjma3dIhDuIeUWoAW8trfNjtTCiZv1tZCEpQMCq8oMgdB04t89/1O/w1cDnyilFU=';//チャンネルアクセストークン 4 const spreadsSheet = SpreadsheetApp.openById("1***5bS-MdoajiGF3YXrnTmheFoss6zqCXdgh2uLp4"); 5 const url = "https://api.line.me/v2/bot/message/reply"; 6 const push_url = "https://api.line.me/v2/bot/message/push"; 7 8 //dopostの関数定義 9 function doPost(e) { 10 var json = e.postData.contents 11 //返信するためのJSONの取得 12 var events = JSON.parse(json).events; 13 events.forEach(function(event) { 14 if(event.type == "follow") {//① 15 shokaibun_1(event);//①→2 16 }//相手が友達追加したら場合のみ起きる。 17 else if(event.type == "message"){ 18 var reply_message = event.message.text; 19 shokaibun_1(event); 20 } 21 if(typeof replyToken === 'undefined' ) { 22 return; 23 } 24 } 25 ); 26 } 27 function shokaibun_1(e) {//② 28 let Msg1 = {//メッセージ1:初めの挨拶 29 "replyToken" : e.replyToken, 30 "messages" : [ 31 {"type": "text", 32 "text" : "初めまして" 33 } 34 ] 35 }; 36 let pro_1 = { 37 "method" : "POST", 38 "Content-Type" : "application/json", 39 "headers" : { 40 "Authorization" : "Bearer " + CHANNEL_ACCESS_TOKEN 41 }, 42 "payload" : JSON.stringify(Msg1) 43 }; 44 var response = UrlFetchApp.fetch(url, pro_1); 45 return response.getResponseCode(); 46 47 }; 48

実現したいこと

・友達追加したユーザーとメッセージを送信したユーザーに、挨拶文「初めまして」を送りたい。

発生している問題・エラーメッセージ

エラーメッセージ ```TypeError: Cannot read properties of undefined (reading 'postData') doPost @ コード.gs:10 →LINE側にメッセージを送ったら、このエラーは消えたのですが、LINE botの応答がありませんでした。 ### 該当のソースコード var json = e.postData.contents

試したこと

・アクセストークンの確認
・WebhookのURLの確認
・Webhookの利用切り替えの繰り返し
https://yacoleblog.com/172/https://teratail.com/questions/309343を参考に、HTTPステータスコードの追記

補足情報(FW/ツールのバージョンなど)

コードを書き換える度、デプロイとWebhookのURLを新しく更新しています。
アクセスするユーザーは全員としました。
お手隙の方、解決方法等、ご教示頂きたいです。よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

LINE Messaging API 経由で「初めまして」のメッセージを表示させる部分ですが、ヘッダー(pro_1)の書き方がドキュメントと異なっているようです。
具体的には、"Content-Type" : "application/json" が headers の中にないため、
content typeが jsonではなく デフォルトの 'x-www-form-urlencoded' という別の形式での送信となってしまっており、LINE側がうまく受け取れていないのだと考えられます。

参考:
公式ドキュメントへのリンク の下にあるコードサンプル。

下記のように "Content-Type" : "application/json" を headersの中に移動して、コード保存後、デプロイし直し、もう一度LINEからメッセージを送ってみて下さい。

【現状】

js

1 let pro_1 = { 2 "method" : "POST", 3 "Content-Type" : "application/json", // headers の外側に書いてしまっています。 4 "headers" : { 5 "Authorization" : "Bearer " + CHANNEL_ACCESS_TOKEN 6 }, 7 "payload" : JSON.stringify(Msg1) 8 };

【修正後】

js

1 let pro_1 = { 2 "method" : "POST", 3 "headers" : { 4 "Content-Type" : "application/json", // headers の中に移動。 5 "Authorization" : "Bearer " + CHANNEL_ACCESS_TOKEN 6 }, 7 "payload" : JSON.stringify(Msg1) 8 };

追記

(コメントより)

早速、修正しデプロイし実行してみたのですが、LINE botからの応答がありませんでした。

何らかのエラーが発生している可能性があります。
エラー内容を把握するため、下記の手順を行ってください。

① まず、エラー記録用のログシートを追加します。
具体的には、現在使っているスプレッドシートに「log」という名前のシート(タブ)を追加してください。
追加後は下記のようなイメージです。
イメージ説明

② 次にコードを下記のように書き換えて、保存、デプロイし、LINEのwebhook URLを変更した上、LINEにメッセージを送ってください。
もし LINE 送信時に GAS 内部でエラーが発生していれば、さきほど作った log シートにエラーの内容が追記されるはずですので、エラー内容を教えてください。

js

1//固定値 2const CHANNEL_ACCESS_TOKEN ='H****Du0zICfpe+o0dQ1imBlCBhEbE4Knj3eZnHQKkaO5fjIJEIkIiXeIxrXGv2c2o/rONZtsMf7QtsYw2YQ20H+G+pvX/nqdjma3dIhDuIeUWoAW8trfNjtTCiZv1tZCEpQMCq8oMgdB04t89/1O/w1cDnyilFU=';//チャンネルアクセストークン 3const spreadsSheet = SpreadsheetApp.openById("1***5bS-MdoajiGF3YXrnTmheFoss6zqCXdgh2uLp4"); 4const url = "https://api.line.me/v2/bot/message/reply"; 5const push_url = "https://api.line.me/v2/bot/message/push"; 6 7function doPost(e) { 8 try { 9 doPostProxy(e); 10 } catch (err) { 11 debug(JSON.stringify(err.stack || err.message, undefined, 1)); 12 } 13} 14//dopostの関数定義 15function doPostProxy(e) { 16 var json = e.postData.contents 17 //返信するためのJSONの取得 18 var events = JSON.parse(json).events; 19 events.forEach(function (event) { 20 if (event.type == "follow") {//① 21 shokaibun_1(event);//①→2 22 }//相手が友達追加したら場合のみ起きる。 23 else if (event.type == "message") { 24 var reply_message = event.message.text; 25 shokaibun_1(event); 26 } 27 if (typeof replyToken === 'undefined') { 28 return; 29 } 30 } 31 ); 32} 33 34function shokaibun_1(e) {//② 35 let Msg1 = {//メッセージ1:初めの挨拶 36 "replyToken": e.replyToken, 37 "messages": [ 38 { 39 "type": "text", 40 "text": "初めまして" 41 } 42 ] 43 }; 44 let pro_1 = { 45 "method": "POST", 46 // "Content-Type": "application/json", 47 "headers": { 48 "Content-Type": "application/json", 49 "Authorization": "Bearer " + CHANNEL_ACCESS_TOKEN 50 }, 51 "payload": JSON.stringify(Msg1) 52 }; 53 var response = UrlFetchApp.fetch(url, pro_1); 54 // return response.getResponseCode(); 55 return ContentService.createTextOutput(JSON.stringify({ 56 'content': 'post ok' 57 })).setMimeType(ContentService.MimeType.JSON); 58 59}; 60 61function debug(message) { 62 spreadsSheet.getSheetByName('log').appendRow([message]); 63}

投稿2022/12/23 13:01

編集2022/12/23 15:52
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Qchan.8

2022/12/23 14:52

教えて頂きありがとうございます。 早速、修正しデプロイし実行してみたのですが、LINE botからの応答がありませんでした。 他に気になること等ありましたらまた教えて頂けると嬉しいです。よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2022/12/23 15:26

追記しました。
Qchan.8

2022/12/24 08:01

上記のコードに書き直したところ、エラーなくLINEbotが応答しました。 qnoirさん、ありがとうございました^ ^ また診断 botを作っている際につまづいたとき教えて頂けると嬉しいです。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問