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

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

ただいまの
回答率

87.93%

Line Botの返答がない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,272

score 7

前提・実現したいこと

下記リンク先を参照しLine Botを作成しましたが、返事がありません。
コードはコピーして使用しました。
GAS、Line bot作成初心者のためご教示いただけると幸いです。

参考URL:https://qiita.com/nkjm/items/38808bbc97d6927837cd

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

botにメッセージを送っても既読になるだけで何も返答がありません。
またGASのソースコードはスクリプト関数が見つかりません: doGetと表示されます。

該当のソースコード

 * Postを実行する
 * @param {JSON} [e] - POSTされた情報
 * @return {JSON} Postが成功した情報をJSON形式で返す
 */
function doPost(e) {
  // LineBotからPostされたデータを取得
  // Webhookイベントオブジェクトの返す値について
  // →https://developers.line.biz/ja/reference/messaging-api/#webhook-event-objects 
  var replyToken  = JSON.parse(e.postData.contents).events[0].replyToken;   // WebHookで受信した応答用Token
  var userMessage = JSON.parse(e.postData.contents).events[0].message.text; // ユーザーのメッセージを取得

  // FormURLが含まれていた場合はクリックリプライメッセージなので何もせずに処理を終了する
  if (userMessage.indexOf(Config.FormUrl) != -1) return;


  // LineにPostする
  var message = convertUserMessageToLineMessage(userMessage);
  UrlFetchApp.fetch(Config.LineReplyUrl, createReplyRequest(replyToken, message));

  // 成功のステータスを返す
  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}

/**
 * LINE BOTにPostする
 * @param {Array} [messages] - POSTするメッセージ情報
 * @return {JSON} Postが成功した情報をJSON形式で返す
 */
function linePost(messages) {
  // LineにPostする
  UrlFetchApp.fetch(Config.LinePushUrl, createPushRequest(messages));

  // 成功のステータスを返す
  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}

/**
 * 今日の結果のsummaryをLINE BOTにPostする
 * @return {JSON} Postが成功した情報をJSON形式で返す
 */
function doSummaryPost() {
  var messages = buildMessage(summaryMessage());
  return linePost(messages);
}

/**
 * 今月の最終結果をLINE BOTにPostする
 * 月末以外の時は何もしない
 * @return {JSON} Postが成功した情報をJSON形式で返す
 */
function doIncomeAndExpenditureForThisMonthPost() {
  if (!isEndOfMonth()) return;

  var messages = buildMessages(incomeAndExpenditureForThisMonthMessage());
  return linePost(messages);    
}

/**
 * ユーザーの入力用メッセージからそれに対応したメッセージを返す
 * @param {String} [userMessage] - ユーザーの入力用メッセージ
 * @return {Object} LineにPostするようのメッセージObject
 */
function convertUserMessageToLineMessage(userMessage) {
  if (userMessage === '家計簿') {
    return buildMessage(householdAccountBookUrl());
  } else if (userMessage === '科目結果') {
    var quickReplyItems = buildQuickReplyItemsForArray(SubjectList.VariableCost);
    return buildQuickReplyMessages('科目を選んでね😍', quickReplyItems);
  } else if (userMessage === '今月の支出状況') {
    return buildMessage(summaryMessage());
  } else if (userMessage === '入力') {
    var quickReplyItems = buildQuickReplyItemsForTemplates(InputTemplateKeys.VariableCost, InputTemplates.VariableCost);
    return buildQuickReplyMessages('入力テンプレートを選んでね😍', quickReplyItems);
  } else if (userMessage === '固定費入力') {
    var quickReplyItems = buildQuickReplyItemsForTemplates(InputTemplateKeys.FixedCost, InputTemplates.FixedCost);
    return buildQuickReplyMessages('入力テンプレートを選んでね😍', quickReplyItems);
  } else if (isExistsSubject(userMessage)) {
    return buildMessages(paymentInfo(userMessage));
  } else if (userMessage === 'ヘルプ') {
    return buildMessage(helpMessage());
  } else {
    return buildMessage(notExistsMessage());
  }
}

/**
 * リクエストのヘッダーを作成
 * @return {Object} リクエスト情報のヘッダー
 */
function header() {
  return {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + Config.LineAccessToken,
      }
}

/**
 * 応答用のリクエスト情報(JSON)を作成する
 * @param {String} [replyToken] - WebHookで受信した応答用Token(LINE BOTより)
 * @param {Array} [Array] - message情報
 * @return {Object} リクエスト情報(JSON)
 */
function createReplyRequest(replyToken, message) {
  return {
    'headers': header(),
    'method': 'post',
    'payload': JSON.stringify({
      'replyToken': replyToken,
      'messages': message,
    }),
  }
}

/**
 * プッシュ用のリクエスト情報(JSON)を作成する
 * @param {Array} [Array] - message情報
 * @return {Object} リクエスト情報(JSON)
 */
function createPushRequest(message) {
  return {
    'headers': header(),
    'method': 'post',
    'payload': JSON.stringify({
      'to': Config.LinePushNotificationDestination,
      'messages': message
    }),
  }
}
var Config = {
  LineAccessToken                 : 'チャンネルアクセストークン入力',
  LineReplyUrl                    : 'https://api.line.me/v2/bot/message/reply',
  LinePushUrl                     : 'https://api.line.me/v2/bot/message/push',
  LinePushNotificationDestination : 'ユーザーID入力',
  HouseholdAccountBookUrl         : 'Google spreadsheet URL入力',
  FormUrl                         : 'Google Form URL入力'
};

試したこと

Webhook設定の検証では成功でした。
GASのソース公開はNewに更新しています。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

コードと結果だけを記載したデバッグ依頼は、具体的に発生している状況と原因を特定ために必要な内容が質問文から判断できないと回答がつきにくいと思います。


既読になるが返事が来ないということは、送信部分で失敗しています。

質問のソースコードでは、

  // LineにPostする
var message = convertUserMessageToLineMessage(userMessage);
UrlFetchApp.fetch(Config.LineReplyUrl, createReplyRequest(replyToken, message));

の部分がメッセージの送信なので、この部分で失敗している可能性が高いです。

外部のサーバーとやり取りする部分では、相手からのレスポンスを受け取って、正しく受け取れたことを確認するようなプログラムコードにしてください。

Class UrlFetchApp のドキュメントの例で

var response = UrlFetchApp.fetch("http://www.google.com/");
Logger.log(response.getContentText());

とあるように UrlFetchApp.fetch の返値を取得してチェックすることで、相手側サーバー(LINE API)のレスポンスコードやメッセージを確認できます。(返値の内容は、HTTPResponse参照)

まずは、UrlFetchApp.fetch の返値を確認して、LINE API側が正しく受け取っていることを確認してください。( レスポンスコードは、ドキュメントのサンプルを例にすると response.getResponseCode() で取得できます。 テキストメッセージは、response.getContentText() です。)

応答メッセージを送る  - LINE Messaging APIリファレンス によると 相手が受信成功するとレスポンスコードは、 200。メッセージは、空のJSONオブジェクト( {} )。 送信に失敗するとそれ以外のレスポンスコードが返ってきます。)

LINE API 側から、エラー(レスポンスコード 200 以外)が帰ってくる場合は、UrlFetchApp.fetch のパラメータで渡してる各変数に LINE API が要求しているフォーマットで正しい値が入っているか確認してください。( たとえば、message の内容が メッセージオブジェクトで指定されたフォーマットになっていない場合は、エラーになると思います。 )

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/02 17:07

    ありがとうございました。
    まだ初心者のため、構造理解できていないのでまずは勉強してからやり直そうと思います。

    キャンセル

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

  • ただいまの回答率 87.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る