@12d1212

Как достать нужные данные из UrlFetchApp или JSON.parse?

По логам данные выходят в таком формате, нужно достать
message_id=53204.0
{result={date=1.635769484E9, message_id=53204.0, from={first_name=IPhoшка [Инфобот], username=infoip4_bot, is_bot=true, id=2.09014609loE9}, , type=supergroup}}, ok=true}


идея была такая, но не сработало
var takeid = JSON.parse(UrlFetchApp.fetch('https://api.telegram.org/bot' + token + '/', data));
  var idString = takeid.toString();
  var start = 0;
  var searching = "message_id=" + start.toString() + ".0";
  while (idString.indexOf(searching!=-1)){
     start++
  }
  • Вопрос задан
  • 485 просмотров
Пригласить эксперта
Ответы на вопрос 1
stomaks
@stomaks
Expert Google Apps Script (stomaks.me)
Вы двигаетесь в верном напралвении, но есть несколько замечаний.

Первое, url запроса (в вашем случае: 'https://api.telegram.org/bot' + token + '/') не содержит функцию для запуска.
Должно быть так:
'https://api.telegram.org/bot' + token + '/getUpdates'

или
'https://api.telegram.org/bot' + token + '/getMe'
или
'https://api.telegram.org/bot' + token + '/sendMessage'

и тд.

Второе замечание, data - второй параметр для функции fetch(url, data) класса UrlFetchApp должен быть объектом.
И желательно чтобы в этом объекте метод запроса был post.
В идеале вод так:
{
  "method": `POST`,
  "contentType": `application/json`,
  "muteHttpExceptions": true,
  "payload": JSON.stringify(data)
}

При этом payload указываем если вы хотите что-то передать телеграму (зависит от выбранной функции в url запроса).

Третье, После того как метод fetch(url, data) вернул результат response, из него нужно вытащить данные методом response .getContentText(). И аш потом уже парсить через JSON.parse.

Полный код выглядит так:
/**
   * Простой метод проверки токена авторизации вашего бота. Не требует параметров. Возвращает основную информацию о боте в виде объекта User.
   * 
   * @return {Object.User}
   */
  function getMe() {
    const response = UrlFetchApp
      .fetch(
        `https://api.telegram.org/bot${TOKEN}/getMe`,
        {
          "method": `POST`,
          "contentType": `application/json`,
          "muteHttpExceptions": true
        }
      );

    let result = response
      .getContentText();

    result = JSON
      .parse(result);

    if (!result.ok)
      throw new Error(result.description);

    return result;
  }

Только не забудьте заменить слово TOKEN на имя переменной с вашим токеном.

Для отправки сообщения в бот используйте:
/**
   * Используйте этот метод для отправки текстовых сообщений. В случае успеха отправленное сообщение возвращается.
   * 
   * @param {String|Number} chatId Уникальный идентификатор целевого чата или имя пользователя целевого канала (в формате @channelusername)
   * @param {String} text Текст отправляемого сообщения, 1-4096 знаков после синтаксического анализа сущностей.
   * @param {Object} options
   * 
   * @return {Object.Message}
   */
  function sendMessage(chatId, text, options) {
    if (!arguments.length)
      throw new TypeError(`Параметры () не соответствуют сигнатуре метода TelegramBot.sendMessage.`);

    const data = {};

    if (!([`string`, `number`].includes(typeof chatId) && String(chatId).trim().length))
      throw new TypeError(`Параметры (${typeof chatId}) не соответствуют сигнатуре метода TelegramBot.sendMessage.`);

    data.chat_id = String(chatId).trim();

    if (!([`string`, `number`].includes(typeof text) && String(text).trim().length))
      throw new TypeError(`Параметры (${typeof chatId}, ${typeof text}) не соответствуют сигнатуре метода TelegramBot.sendMessage.`);

    data.text = String(text).trim();

    if (options) {
      if (typeof options !== `object`)
        throw new TypeError(`Параметры (${typeof chatId}, ${typeof text}, ${typeof options}) не соответствуют сигнатуре метода TelegramBot.sendMessage.`);

      if ((item => typeof item === `string` && item.trim().length)(options.parse_mode))
        data.parse_mode = options.parse_mode;

      if (typeof options.entities === `object`)
        data.entities = options.entities;

      if (typeof options.disable_web_page_preview === `boolean`)
        data.disable_web_page_preview = options.disable_web_page_preview;

      if (typeof options.disable_notification === `boolean`)
        data.disable_notification = options.disable_notification;

      if ((item => typeof item === `number` && Number.isInteger(item) && item > 0)(options.reply_to_message_id))
        data.reply_to_message_id = options.reply_to_message_id;

      if (typeof options.allow_sending_without_reply === `boolean`)
        data.allow_sending_without_reply = options.allow_sending_without_reply;

      if (typeof options.reply_markup === `object`)
        data.reply_markup = options.reply_markup;
    }

    const response = UrlFetchApp
      .fetch(
        `https://api.telegram.org/bot${TOKEN}/sendMessage`,
        {
          "method": `POST`,
          "contentType": `application/json`,
          "muteHttpExceptions": true,
          "payload": JSON.stringify(data)
        }
      );

    let result = response
      .getContentText();

    result = JSON
      .parse(result);

    if (!result.ok)
      throw new Error(result.description);

    return result;
  }


Ну и напоследок, если умеете пользоваться библиотеками gas вот моя для телеграм ботов:
TelegramApi (1d78ytTohb5IBskJadNg1hwu-LRyqYONmnQQWbkVUlmX3Ft2Q6AEOgW9m)
(она еще немного сырая, но юзать можно, документации пока нет, сори, открывайте код и читайте описание методов)

---
Максим Стоянов (stomaks), pазработчик Google Apps Script.
g-apps-script.com
stomaks.me
Ответ написан
Ваш ответ на вопрос

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

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