Как настроить работу Телеграм-бота с Google Sheets
Разные команды в REG.RU пользуются чат-ботами в Телеграме. SEO-команда оперативно отслеживает изменения на сайте, руководители клиентских служб мониторят работу своего отдела, а сотрудники техподдержки могут посмотреть график работы на день/неделю без авторизации во внутренних сервисах, что очень удобно, если сотрудник, например, за городом.
Часто подобные боты имеют несложное устройство. Например, они могут загружать для работы из Google-таблиц список товаров с ценами и количеством, имена работников отдела с указанием времени работы/отпуска. Сегодня разберемся, как сделать такого чат-бота.
В продолжение статьи о создании Телеграм-бота расскажем, как настроить совместную работу бота и Google Sheets API v4 вместе со специалистами команды вёрстки REG.RU Анной К. и Виктором Ш.
Попробуем научиться получать данные из нашей Google-таблицы, в которой, например, указаны дни рождения наших друзей. Мы хотим, чтобы бот в ответ на имя друга подсказывал его день рождения. Начнем!
Настройка Google API
Создание проекта
Настройка проекта
В меню «Учетные данные» нажимаем «Создать учетные данные».
Создание учётных данных
Через сервисный аккаунт мы будем соединять бота и таблицу. Указываем название аккаунта, роли, предоставляем пользователям доступ к сервисному аккаунту, если это необходимо.
Пользователи в сервисном аккаунте
Заходим на сервисный аккаунт
Интерфейс сервисного аккаунта
и выбираем «Создать ключ».
Создание ключа
Выбираем нужный нам формат. Мы оставим рекомендуемый json.
Выбор формата файла
После загрузки разместим json-файл в корне проекта по Телеграм-бота и переименуем, например, в credentials.json. Не забудьте указать этот файл в перечне.gitignore!
В настройках доступа Google-таблицы предоставим сервисному аккаунту права на редактирование. Для этого нужно добавить в список пользователей почту сервисного аккаунта.
Теперь напишем код для аутентификации.
Запускаем код
Для запуска используем библиотеку для работы с ботом Telegraf и сделаем так, чтобы при получении текста бот выполнял функцию saysBirthday из файла saysBirthday.js.
В файле saysBirthday.js напишем наш код и проверим:
Диалог с ботом прошёл успешно
Отлично, бот отзывается. Теперь научим его получать из таблицы дни рождения.
Получаем данные из таблицы
Исправим файл saysBirthday.js. Добавим в код библиотеку googleapis и функцию аутентификации Google.
Используя функцию getAuthClient, создадим клиента для работы с API Google Sheets.
Теперь получим лист нашей таблицы с днями рождения друзей.
Таблица с именами друзей
Используем метод API spreadsheets.get — укажем spreadsheetId (берем из URL таблицы с данными) и остальные необходимые параметры.
Теперь получим эти данные из функции saysBirthday, которую бот выполняет при вводе любого текста. В качестве второго аргумента «range» передаем название листа Google-таблицы «Дни рождения».
Запустим и проверим, какие данные появились в консоли:
Можно проверить, что за массив в rowData. Выведем в консоль значения sheet.data[0].rowData:
Посмотрим, что лежит, например, во втором элементе массива — выведем в консоль sheet.data[0].rowData[1].
Результаты запроса
Отлично, мы выяснили, что в каждом элементе из массива sheet.data[0].rowData в values лежит информация об имени друга и его дне рождения. Давайте научим бота правильно отвечать на основе этой информации.
Напишем функцию, которая ищет соответствие введенного имени друга строке в таблице.
И используем эту функцию в saysBirthday. Найдем день рождения друга в массиве данных sheet.data[0].rowData, исходя из найденного индекса в функции findRowIndex.
Поправим текст, который бот выдает на старте.
Проверяем работу функции.
Всё работает так, как мы задумали
Еще немного модернизируем код на случай, если имя друга в таблице не будет найдено.
Отлично! Бот работает так, как мы задумали.
Это простейший пример для начала работы с Google Sheets API v4. Разобравшись, какой формат данных возвращает метод spreadsheets.get, попробуйте получить данные с помощью метода spreadsheets.values.get. Он возвращает данные меньшего объема и меньшей вложенности, но вполне подойдёт, если не нужно считывать и записывать данные о форматировании ячеек. Советуем изучить документацию, с помощью которой можно будет реализовывать более сложную логику, переписывать значения ячеек и форматировать их.
Пройдите курс «JavaScript. Профессиональная разработка веб-интерфейсов», чтобы работать фронтендером и программировать не только ботов.
Telegram-бот с помощью таблицы Google
Перед началом статьи хочу сказать, что еще больше полезной и нужной информации вы найдете в нашем Telegram-канале. Канал уже очень близок к отметке в 1000 подписчиков, сможем устроить новогодний подарок? Подпишитесь, мне будет очень приятно.
Для создания собственного Telegram-бота потребуется минимум программирования. На самом деле вам даже не нужно иметь редактор кода, чтобы начать. К концу этого поста вы узнаете, как создать свой личный интерактивный Telegram-бот всего лишь с помощью электронной таблицы Google. Конечным продуктом будет бот, отвечающий на ваши сообщения. Что-то вроде этого:
Прежде всего я хочу, чтобы у вас сложилось понимание принципов работы бота. Мы коснёмся концепции веб-хуков и будем регулярно обращаться к документации API Telegram-бота.
Приложения общаются двумя способами: через polling и webhooks. Когда вы совершаете онлайн-покупку и получаете сообщение от приложения вашей кредитной карты, это — интеграция в действии.
Когда вы переводите деньги из приложения и получаете SMS для вашего провайдера — это интеграция в действии. Разработчики создают в приложениях способ получать данные друг от друга, потому что это довольно круто и это то, что хотят пользователи.
По этой причине разработчики пишут инструкции о том, как их приложение может отправлять и получать данные из других приложений. Но, конечно, они не открывают доступ ко всем данным; они указывают, какой тип данных можно отправить и что может сделать их приложение, если и когда оно получает данные от другого приложения. Такие инструкции для Telegram лежат здесь.
Подумайте об интеграции приложений как о рыбалке. Это похоже на попытку поймать рыбу, только на этот раз ваше приложение ловит данные. Сейчас вы можете рыбачить двумя способами: первый — вы бросаете сеть над водой и проверяете её в установленные периоды, чтобы увидеть, не поймали ли вы рыбу. Второй: вы нанизываете червя на крючок и ждете, пока не почувствуете, что движущаяся рыба тянет вас на себя.
Именно так работают API polling и webhooks. С помощью опроса API приложение проверяет другое приложение в каждый установленный период времени, чтобы увидеть, есть ли данные для извлечения, в то время как с помощью веб-хуков приложение просто ждёт передачи данных, которая начинается событием.
События — это действия, инициируемые человеком. Нажатие кнопки добавления товара в корзину, отправка сообщений кому-то или переход на определенную веб-страницу — всё это события, вызванные человеком. К этим событиям прилагаются данные.
Когда вы кладёте товар в свою корзину, то метка времени, товар и цена, скорее всего, являются частью данных, генерируемых из события. Когда вы отправляете сообщение боту в Telegram, метка времени, ваш идентификатор пользователя, идентификатор сообщения и само сообщение — части данных, генерируемых отправкой сообщения.
Есть две вещи, которые нам нужны, чтобы создать бота с веб-хуками:
- Пропуск — мы не можем просто так получить доступ к данным из другого приложения. Разработчикам нужен способ отследить, кто получает доступ к их приложениям с черного хода. Для этого они выдают уникальные ключи всем, кто хочет войти в их приложения вне основного пользовательского интерфейса. Я покажу вам, как быстро получить ключ Telegram — буквально за минуту.
- Загрузочный док — как только у нас появится доступ к другому приложению, мы сможем начать извлекать из него данные. Но для этого нам нужен загрузочный док — место для приема этих данных. Наш док — URL веб-приложения. Приложение не может выгрузить данные, если у нас нет загрузочной платформы. С платформы же мы можем делать с данными все, что захотим: проверять их, манипулировать ими, отправить в другое приложение или даже обратно в наше приложение.
Вот изображение морского порта, иллюстрирующее, как работают веб-хуки. Во-первых, кран поднимает контейнер с судна и ставит его на погрузочную площадку. Оттуда тот, кто контролирует морской порт, может снова поднять контейнер и поставить его на другое судно.
Теперь представьте, что кран — это веб-хук, а корабли — два разных приложения; загрузочный док — это адрес приложения. Хук извлекает данные из App 1 (корабля внизу слева) и отправляет их на URL-адрес веб-приложения. Оттуда можно отправить эти данные в App 2 (корабль вверху справа) или сделать с ними всё, что захотите. Этот контейнер теперь ваш. Открывайте, проверяйте и отправляйте!
Теперь, когда у вас есть понимание, как работают веб-хуки, мы можем создать бота!
Во-первых, нам нужен пропуск. В некоммерческих приложениях может потребоваться запросить у разработчика напрямую, но, к счастью, есть очень простой способ получить ключи входа (или токены) авторизации в Telegram. Ключи нам даст BotFather!
- Кликните по ссылке.
- Поздоровайтесь с ним (надо отдать должное).
- Отправьте придуманное вами имя бота.
- БАМ! Токен у вас в руках! ?
Как только у нас будет токен, создайте электронную таблицу Google и перейдите в меню Инструменты → Редактор сценариев. Именно здесь мы будем писать код.
Нам нужен URL приложения, чтобы получать данные из Telegram. К счастью, у Google очень простая публикация веб-приложений через редактор сценариев. Когда мы опубликуем скрипт, то получим уникальный адрес веб-приложения. Нажимайте Publish в редакторе скриптов Google Spreadsheet.
Пожалуйста, обратите внимание на варианты на изображении ниже. Каждый раз, когда вы публикуете свою работу, выбран должен быть вариант новое, ваша личная электронная почта и любой, даже аноним должен иметь доступ к приложению.
И теперь у нас есть адрес веб-приложения! ?
Теперь, когда у нас есть пропуск и загрузочный док, давайте создадим веб-хук — наш крючок. Согласно документации Telegram API, все запросы к API (App Programming Interface) должны быть такими: https://api.telegram.org/bot<token>/METHOD_NAME. Похоже, нам будет очень часто нужна эта ссылка. Давайте сохраним все нужные ссылки в переменных, чтобы мы могли легко писать их позже:
Чтобы настроить хук, давайте напишем функцию, которая позволит нам извлекать данные из Telegram с помощью токена от Botfather. Эти данные должны быть отправлены непосредственно на адрес нашего веб-приложения. Вы можете скопировать и вставить код ниже и нажать кнопку «Опубликовать», когда закончите.
Когда вы публикуете (или развёртываете) свой код, вам могут предложить авторизовать свое собственное приложение для доступа к вашим данным в Google:
Авторизуйте приложение: жизнь слишком коротка, чтобы прожить её в безопасности:
Есть две вещи, которые наш бот должен знать, прежде чем сможет отправить кому-то сообщение:
- Кому сообщение? Идентификатор чата.
- Что напишем? Текст сообщения.
Запишем эти требования как параметры функции. Не стесняйтесь копировать и вставлять код:
По словам разработчиков Telegram, все запросы к API должны идти по HTTPS. Они также упомянули, что поддерживают только запросы GET и POST. GET означает, что кто-то пытается получить данные. POST означает, что кто-то пытается их отправить. Это единственная концепция в учебнике, которую я ещё не освоила, поэтому я перестану притворяться, что знаю, о чем говорю, и просто покажу вам эту статью, которая помогла мне лучше понять принцип.
В любом случае, важно знать, что вы должны написать функцию, которая может отправлять POST-запрос в Telegram, чтобы вы могли отправлять сообщение каждый раз, когда человек общается с вашим ботом. Не стесняйтесь копировать и вставлять этот код. Я объясню, что он делает, в ближайшее время:
Нам нужна эта функция, потому что она — наш способ отправки данных в Telegram и сам Google требует, чтобы его пользователи сценариев приложений — то есть мы — включали либо функцию doGet, либо doPost, когда публикуем веб-приложение. Вот документация об этом. В этом документе Google объясняет, что означает аргумент (e) в функции. Он представляет собой данные из события, созданного человеком внутри приложения, к которому подключен наш веб-хук. В нашем случае аргумент e содержит все данные, генерируемые всякий раз, когда человек отправляет сообщение Telegram-боту. И именно в аргументе мы получим идентификатор чата пользователя. В конце концов, все предыдущие бредни оправдались ? (может быть).
Подключение телеграм бота к гугл табличкам (GS3)
Всем ку
Комбинация из ТЛГ и ГТ, простота подключения КМК делает из ГТ офигенный инструмент автоматизации.
Тайм-менеджмент, таск-менеджмент, учёт финансов, объявления, пересылка событий — всё это создается и довольно быстро настраивается. Главное — это становится полезным не только в бизнесе, но и для обычных чатлан.
Пост ориентирован прежде всего на людей, которые только познают ГТ и на первых порах не требует знания гугл скриптов. В этом посте будет только первичная настройка и подключение. В следующих постах рассмотрю всё что описал выше (как трекать время, задачи, финансы и т.д. и как это настроить под себя).
Итак, первое что нам нужно — создать себе ТЛГ бота. Обращаемся к @BotFather
Нам потребуется АПИ токен, он в середине этого сообщения: 1240599492:AAEOpj-G4C0hO3DFGuQ7RkMyX65RxsGFCqo
Дальше нам нужна пустая ГТ. Создаем, заходим в Инструменты / Редактор скриптов.
Скрин для английской версии.
Вставляем туда следующий код:
function doPost(e)
<
var update = JSON.parse(e.postData.contents);
var DOC = SpreadsheetApp.openById("1WvGYnynJkX2srI1G1DD-7b8Qrm2WiWR6QOxzDJRKxXM");
//нам нужен только тип "сообщение"
if (update.hasOwnProperty('message'))
<
var msg = update.message;
var chat_id = msg.chat.id ;
var text = msg.text;
var msg_array = msg.text.split(" ");
var date = ( msg.date/86400)+25569.125 ;
var user = msg.from.username;
if (msg_array[0] == "/hello")
<
send("Hello World", chat_id)
>
>
>
function send (msg, chat_id)
<
//Отправляет сообщения в тлг. На вход функции дать сообщение и ID чата, в который нужно провести отправку
var payload = <
'method': 'sendMessage',
'chat_id': String(chat_id),
'text': msg,
'parse_mode': 'HTML'
>
var data = <
"method": "post",
"payload": payload
>
var API_TOKEN = '1240599492:AAEOpj-G4C0hO3DFGuQ7RkMyX65RxsGFCqo'
UrlFetchApp.fetch('https://api.telegram.org/bot' + API_TOKEN + '/', data);
>
Выделенное жирным:
1 — ID гугл таблицы, находится после /d/ :
2 — АПИ токен гугл бота, который мы доставали выше.
По коду — в нем две функции — первая принимает сообщение от бота и работает с единственной командой "/hello". Вторая — отправляет сообщения в чат. В данном случае — в чат из которого пришло сообщение.
Осталась последняя часть — зарегистрировать вебхук. Тут нам поможет эта ссылка:
https://api.telegram.org/bot
Вместо первых фигурных скобок вставляем всё тот же токен бота, а вместо вторых фигурных скобок нам нужно вставить ссылку на приложение, которые мы только что сделали, но еще не опубликовали.
Важно — поставить доступ для анонимов и для каждой новой версии выставлять Project version новый или new.
При деплое оно запросит разрешение — даём, после чего получаем заветную ссылку:
Передача данных из «Google Таблиц» в Telegram – это просто!
Вы думаете, что настроить передачу данных из Google Sheets в Telegram – это сложно? На самом деле, всё гораздо проще, чем можно себе представить!
Настройка передачи информации из «Гугл Таблиц» в «Телеграмм» открывает бизнесу, фрилансерам и обычным пользователям массу возможностей и может избавить их от необходимости выполнят рутинные задачи. Зачем тратить время на ручную отправку сообщения о добавлении новых строк в таблицу, когда можно сделать так, чтобы соответствующие уведомления отправлялись автоматически.
Кому могут понадобиться такие возможности и как их реализовать — об этом и пойдет речь ниже.
Кому и зачем нужна интеграция «Телеграмма» с «Гугл Таблицами»?
Рассмотрим только две ситуации, хотя на самом деле их огромное множество. Допустим, у вас есть интернет-магазин, вы пока не используете CRM и фиксируете информацию о заказах и клиентах в «Гугл Таблице». Вам может понадобиться распределить поступающие заказы между ответственными менеджерами. Часто при этом передача данных осуществляется вручную. Если заказов 10-20, то справиться можно, хотя это и потребует дополнительных временных затрат. Но как быть, если в день поступает 50, 100 и больше заказов и идут они из разных источников? Трудно ничего не пропустить и не допустить ошибку.
Другой пример, вы работаете на фрилансе и получаете задачи от клиента в «Гугл Таблицах», чтобы ничего не пропустить нужно постоянно заглядывать в файл или ждать, когда о новых задачах сообщит заказчик. Если оба замотались — пропущена задача и снова потеряно время.
Получается, в обоих случаях ручная рутинная работа и мониторинг отнимают время, которое могло быть потрачено на более важные задачи, и приводит к ошибкам, а это уже упущенная прибыль, репутационные риски.
После настройки автоматизации уведомления об изменениях в таблице будут сразу же приходить в мессенджер ответственному менеджеру или фрилансеру, как в примерах выше. К тому же можно сделать так, чтобы вы могли указать, какие именно данные будут передаваться в мессенджер и при каких условиях.
Но сначала давайте разберемся, как настроить связь таблицы с Telegram с помощью ApiX-Drive на примере упомянутого выше интернет-магазина.
Как связать работу «Google Таблиц» и Telegram с помощью ApiX-Drive?
Не будем останавливаться подробно на регистрации в сервисе, делается это очень просто и быстро, тут сможет разобраться каждый.
После того, как процедура регистрации успешно завершена, заходим в личный кабинет и нажимаем «Создать связь».
Настраиваем Google Sheets
Дальше нужно выбрать систему, из которой будут экспортироваться данные, в нашем случае «Гугл Таблицы».
Указываем, о каком действии будут отправляться уведомления в «Телеграмм». Нам нужно, чтобы приходила информация о новых заказах, поэтому выбираем «Загрузить строки (новые)».
Теперь подключаем аккаунт, в котором находится таблица с заказами. Если вы выполнили вход в профиль любого сервиса «Гугла» — система сама распознает, ваш аккаунт, вам останется только предоставить ей доступ к данным.
Выбираем файл, с которым будем связывать Telegram. ApiX-Drive подгрузит все таблицы с вашего «Гугл Диска», указываем нужную. Если в ней много листов — понадобится указать конкретный лист, с которого системе нужно брать данные.
После этого нужно прописать порядковый номер строки, начиная с которой будут передаваться заказы. Если информировать менеджеров о первых заказах, которые уже выполнены, не нужно, и вы хотите, чтобы приходила информация только о будущих заказах, то указываем номер первой пустой строки. В нашем примере это строка 7.
Затем ApiX-Drive предлагает настроить фильтры, если это необходимо. Допустим, нам не интересны заказы с суммой меньше 200 долларов. Их будут обрабатывать в обычном режиме, а менеджеры получат оповещения в «Телеграмм» только о тех, которые равны или больше этой цифры. Так они смогут проследить лично за исполнением крупных заказов.