@13Magistr

Как получить ответ(contents.hasOwnProperty('callback_query')) от ТГ бота в Apps Script?

Добрый день!

Пытаюсь сделать ТГ бот для учета бюджета в группе. Логика: кто то отправляет сообщение с затратами(данные вносятся в таблицу) далее выбирает категорию(она также заносится в таблицу), далее хочу выгружать фото чеков и также прикреплять к ячейкам таблицы.

Не пойму почему не получаю ответ (contents.hasOwnProperty('callback_query')) на данный момент. Если кто может помочь разобраться, буду очень признателен!

626f28c89613f359076728.png

Полный код:
const API = "5396283725:AAFa3Y82EAPsuF7ro1PlmNkl0QUK_VzURis";

const App_link = "https://script.google.com/macros/s/AKfycbzhxXpAhE0WMYi_WQi5iygsVzeVCOA5X4lk7I9XEHBkm2BOPWYbpQD3CKWw8qPbPOg1/exec";

const table = SpreadsheetApp.openById("1FyXOYn2d8Lqoe5Jm8W8t8EUbdWQUiXWNQQ0QSkEp5FU");

const Krok53 = table.getSheetByName("Krok53");

function setWebhook() {
  let response = UrlFetchApp.fetch("https://api.telegram.org/bot" + API + "/setWebhook?url=" + App_link);
  console.log(response.getContentText());
}

function sendText(chat_id, text, keyBoard) {
  let data = {
    method: "post",
    payload: {
      method: "sendMessage",
      chat_id: String(chat_id),
      text: text,
      parse_mode: "HTML",
      reply_markup: JSON.stringify(keyBoard)
    }
  };
  UrlFetchApp.fetch('https://api.telegram.org/bot' + API + "/", data);
}

function doPost(e) {
  let contents = JSON.parse(e.postData.contents);
  let text = contents.message.text;
  let chat_id = contents.message.chat.id;

  
  if ((/^\//.exec(text))) {
    if (text === "/start") {
      sendText(chat_id, `Ну давай начнем считать!`);
    }
    if (text === "/help") {
      sendText(chat_id, `Лучше просто скажи Максу!`);
    }
    if (text === "/table") {
      sendText(chat_id, `Только ничего сам не правь, вот ссылка: https://docs.google.com/spreadsheets/d/1FyXOYn2d8Lqoe5Jm8W8t8EUbdWQUiXWNQQ0QSkEp5FU/edit#gid=0`);
    }

    return;
  }

  if (contents.hasOwnProperty('message')) {
    if (!isNaN(text)) {
      let user = contents.message.from.username;

      SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Debug").getRange(1, 1).setValue(JSON.stringify(contents, null, 5)); 

      Krok53.appendRow([user, text]);

      sendText(chat_id, "Какая категория?", categories);
    }

    return;
  }

  if (contents.hasOwnProperty('callback_query')) {
    let data = contents.callback_query.data;
    let lastRow = Krok53.getLastRow();

    SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Debug").getRange(1, 2).setValue(JSON.stringify(contents, null, 5)); 
    
    Krok53.getRange(lastRow, 3).setValue([data]);

    del_inline(chat_id, msg_id);

    return;
  }
  
  else {
    return false;
  }
}

function send() {
  let chat_id = "323257595";
  let text = "Привет!";
  sendText(chat_id, text, categories);
}

let categories = {
  "inline_keyboard": [
      [{ "text": "Еда", "callback_data": "Еда" }, { "text": "Разведка", "callback_data": "Разведка" }, { "text": "Бензин",    "callback_data": "Бензин" }],
      [{ "text": "Концерт", "callback_data": "Концерт" }, { "text": "Сувенирка", "callback_data": "Сувенирка" }, { "text": "Аренда", "callback_data": "Аренда" }],
      [{ "text": "Кнопка 6", "callback_data": "Кнопка 6" }, { "text": "Кнопка 7", "callback_data": "Кнопка 7" }]
    ],
  "resize_keyboard": true
};

function del_inline(chat_id, msg_id) {
  let payload = {
    'method': 'editMessageReplyMarkup',
    'chat_id': String(chat_id),
    'message_id': String(msg_id)
  }
  let Data = {
    "method": "post",
    "payload": payload
  }
  UrlFetchApp.fetch('https://api.telegram.org/bot' + API + '/', Data); 
}


Ссылка на таблицу:

https://docs.google.com/spreadsheets/d/1FyXOYn2d8L...

  • Вопрос задан
  • 465 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Pashen_94
У вас в doPost первой строкой идёт парсинг входящего события, а второй строкой вы уже обрабатываете сообщение (message).
Но входящее событие может и не иметь этого поля в себе!
Потому что если к вам приходит callbac_query, то поля message не будет, будет только callback_query - смотрите документацию телеграм по объекту Update.

Вам нужно второй строкой понять, что вам пришло: message или callback_query.
Вы это можете сделать через hasOwnProperty.

Будет что-то типа:
if (contents.hasOwnProperty('callback_query'))
{
Тут код на случай ответа из кнопки
}

if (contents.hasOwnProperty('message'))
{
Тут код на случай получения обычного сообщения
}

P.S. В ТГ есть группа по разработке ботов с гуглом, недавно там публиковали эфиры по разработке бота учёта финансов.
Админ: https://t.me/andreintys

P.P.S. Тоже сделал своего бота, но без прикрепления фото чеков.
Внесение суммы, выбор категории, еженедельные и ежемесечные отчёты по тратам. Могу выслать вам код и таблицу.
Мой тг @dolinin_pa
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы