Как создать Telegram бота на Google Apps Script?

Что такое Telegram бот и зачем он нужен?

Telegram боты – это сторонние приложения, работающие внутри Telegram. Они автоматизируют задачи, предоставляют информацию, развлекают или интегрируются с другими сервисами. Бот может рассылать уведомления, отвечать на вопросы, управлять задачами, собирать данные и многое другое. Например, бот может уведомлять о новых лидах в CRM системе, полученных из рекламной кампании, или отправлять ежедневный отчет по расходам в Google Ads.

Google Apps Script: краткий обзор и возможности

Google Apps Script (GAS) – это облачный язык сценариев, основанный на JavaScript, который позволяет автоматизировать задачи в Google Workspace (Sheets, Docs, Forms, Calendar, Gmail и т.д.). Он интегрируется с различными сервисами Google и сторонними API. GAS выполняется на серверах Google, что избавляет от необходимости развертывания собственных серверов. Это делает его удобным инструментом для создания небольших и средних приложений, включая Telegram ботов.

Преимущества использования Google Apps Script для создания Telegram ботов

Использование Google Apps Script для разработки Telegram ботов имеет ряд преимуществ:

Простота разработки: GAS использует JavaScript, знакомый многим разработчикам.

Бесплатный хостинг: Скрипты выполняются на серверах Google, не требуя затрат на инфраструктуру.

Интеграция с Google Workspace: Легко интегрировать бота с другими сервисами Google (Sheets, Docs, Calendar и т.д.).

Быстрая разработка и развертывание: Создание и запуск бота занимает минимум времени.

Подготовка к созданию бота

Создание нового скрипта в Google Apps Script

Откройте script.google.com.

Нажмите "Новый проект".

Дайте проекту осмысленное имя (например, "TelegramBot").

Получение токена Telegram бота у BotFather

В Telegram найдите пользователя @BotFather.

Начните с ним чат и отправьте команду /newbot.

Следуйте инструкциям BotFather, чтобы задать имя и имя пользователя для вашего бота.

BotFather предоставит вам токен бота. Сохраните его – он понадобится для связи с Telegram API.

Настройка доступа к Telegram API

В GAS не требуется дополнительная настройка доступа к Telegram API. Все запросы будут отправляться через функцию UrlFetchApp.fetch(). Необходимо лишь добавить токен бота в URL запроса.

Создание базового Telegram бота на Google Apps Script

Написание функции `doPost(e)` для обработки входящих сообщений

Функция doPost(e) обрабатывает входящие HTTP POST запросы, которые Telegram отправляет боту при получении нового сообщения. Аргумент e содержит информацию о запросе.

/**
 * Обрабатывает входящие POST запросы от Telegram.
 * @param {Object} e Объект события, содержащий данные запроса.
 */
function doPost(e: GoogleAppsScript.Events.DoPost) {
  // Ваш код обработки сообщений будет здесь
}

Получение текста сообщения от пользователя

Данные о сообщении находятся в параметре e.postData.contents. Необходимо распарсить JSON, чтобы получить текст сообщения.

function doPost(e: GoogleAppsScript.Events.DoPost) {
  const contents = JSON.parse(e.postData.contents);
  const text = contents.message.text;
  Logger.log(text);
}

Отправка ответного сообщения пользователю

Для отправки сообщения используйте метод sendMessage Telegram Bot API. Необходимо указать chat_id пользователя и текст сообщения.

/**
 * Отправляет сообщение в Telegram.
 * @param {string} text Текст сообщения.
 * @param {string} chatId ID чата, куда нужно отправить сообщение.
 */
function sendMessage(text: string, chatId: string) {
  const telegramUrl = 'https://api.telegram.org/bot' + YOUR_TELEGRAM_BOT_TOKEN + '/sendMessage';
  const payload = {
    'method': 'post',
    'chat_id': chatId,
    'text': text,
  };
  const options: GoogleAppsScript.URL_Fetch.URLFetchRequestOptions = {
    'method': 'post',
    'payload': payload,
  };
  UrlFetchApp.fetch(telegramUrl, options);
}

function doPost(e: GoogleAppsScript.Events.DoPost) {
  const contents = JSON.parse(e.postData.contents);
  const text = contents.message.text;
  const chatId = contents.message.chat.id;
  sendMessage('Вы написали: ' + text, chatId);
}
Реклама

Замените YOUR_TELEGRAM_BOT_TOKEN на ваш токен бота.

Развертывание скрипта как веб-приложения

В редакторе GAS выберите "Развернуть" -> "Новое развертывание".

Выберите тип "Веб-приложение".

В поле "Кто имеет доступ" выберите "Все пользователи".

Нажмите "Развернуть".

Скопируйте URL веб-приложения. Этот URL нужно указать в Telegram, чтобы бот получал сообщения.

В Telegram отправьте запрос к API, чтобы установить webhook для бота: https://api.telegram.org/bot<YOUR_TELEGRAM_BOT_TOKEN>/setWebhook?url=<YOUR_WEB_APP_URL>. Замените <YOUR_TELEGRAM_BOT_TOKEN> на токен вашего бота и <YOUR_WEB_APP_URL> на URL вашего веб-приложения. Убедитесь, что URL веб-приложения начинается с https://.

Развитие функциональности бота

Обработка команд (/start, /help и т.д.)

Чтобы обрабатывать команды, необходимо проверить, начинается ли текст сообщения с символа /. Если да, то выделить команду и выполнить соответствующие действия.

function doPost(e: GoogleAppsScript.Events.DoPost) {
  const contents = JSON.parse(e.postData.contents);
  const text = contents.message.text;
  const chatId = contents.message.chat.id;

  if (text.startsWith('/start')) {
    sendMessage('Привет! Я ваш бот.', chatId);
  } else if (text.startsWith('/help')) {
    sendMessage('Я могу отвечать на ваши вопросы.', chatId);
  } else {
    sendMessage('Вы написали: ' + text, chatId);
  }
}

Использование клавиатуры (InlineKeyboardMarkup и ReplyKeyboardMarkup)

InlineKeyboardMarkup позволяет добавлять кнопки непосредственно под сообщением. ReplyKeyboardMarkup заменяет стандартную клавиатуру пользователя.

Пример InlineKeyboardMarkup:

function sendMessageWithKeyboard(text: string, chatId: string) {
  const telegramUrl = 'https://api.telegram.org/bot' + YOUR_TELEGRAM_BOT_TOKEN + '/sendMessage';
  const payload = {
    'method': 'post',
    'chat_id': chatId,
    'text': text,
    'reply_markup': JSON.stringify({
      'inline_keyboard': [
        [{
          'text': 'Кнопка 1',
          'callback_data': 'button1'
        }],
        [{
          'text': 'Кнопка 2',
          'callback_data': 'button2'
        }]
      ]
    })
  };
  const options: GoogleAppsScript.URL_Fetch.URLFetchRequestOptions = {
    'method': 'post',
    'payload': payload,
  };
  UrlFetchApp.fetch(telegramUrl, options);
}

Отправка различных типов контента (фото, видео, документы)

Telegram Bot API предоставляет методы для отправки различных типов контента: sendPhoto, sendVideo, sendDocument и т.д. Необходимо указать URL файла или загрузить файл непосредственно в запросе.

Интеграция с Google Sheets и другими сервисами Google

GAS позволяет легко интегрировать бота с другими сервисами Google. Например, можно записывать данные из сообщений в Google Sheets или получать информацию из Google Calendar.

Пример записи данных в Google Sheets:

/**
 * Записывает данные в Google Sheets.
 * @param {string} data Данные для записи.
 */
function writeToSheet(data: string) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Лист1');
  sheet.appendRow([data, new Date()]);
}

function doPost(e: GoogleAppsScript.Events.DoPost) {
  const contents = JSON.parse(e.postData.contents);
  const text = contents.message.text;
  const chatId = contents.message.chat.id;
  writeToSheet(text);
  sendMessage('Данные записаны в Google Sheets.', chatId);
}

Практические примеры и советы

Пример бота для уведомлений о событиях в Google Calendar

Бот может получать информацию о предстоящих событиях из Google Calendar и отправлять уведомления пользователю.

Пример бота для сбора обратной связи через Google Forms

Бот может отправлять ссылку на Google Form и собирать ответы пользователей.

Советы по отладке и оптимизации кода

Используйте Logger.log() для вывода информации в журнал выполнения скрипта.

Используйте отладчик GAS для пошагового выполнения кода.

Оптимизируйте код для уменьшения времени выполнения.

Безопасность и обработка ошибок

Не храните токен бота в открытом виде в коде. Используйте PropertiesService для хранения конфиденциальных данных.

Обрабатывайте возможные ошибки при выполнении запросов к Telegram API. Используйте try...catch блоки.

Валидируйте данные, полученные от пользователя, чтобы предотвратить нежелательные действия.


Добавить комментарий