Как собрать статистику Telegram‑чатов с помощью Yandex Cloud Functions

С помощью сервиса Yandex Cloud Functions вы можете собрать статистику Telegram-чатов и визуализировать её в Yandex DataLens. Рассказываем, как за несколько шагов реализовать эту интеграцию.

В предыдущих статьях мы описали варианты загрузки имеющихся данных PostgreSQL и ClickHouse для обработки и визуализации в Yandex DataLens. А сейчас давайте рассмотрим вариант с извлечением и поставкой данных на serverless‑технологиях.

Для упрощения задачи воспользуемся скриптами, реализующими базовые функции в Yandex Cloud Functions. Эти скрипты заботливо подготовили специалисты Yandex Cloud. Но понадобится выполнить несколько команд в консоли.

Подготовка окружения

Для задачи потребуется создать кластер ClickHouse с публичным доступом. Настройки описаны в данной статье. Также нужно будет создать секрет с логином и паролем (ключи с именами user и pass) для базы данных с помощью Yandex Lockbox. Инструкция, как это сделать, есть в документации.

Для подготовки окружения сначала нужно создать целевые таблицы. Скрипт для них представлен в этом файле. Кроме этого, нужно установить на свое устройство Python 3.11 (или старше) и свежую версию Terraform — например, по этой инструкции.

Затем нужно создать своё приложение на основе Telegram. Для этого:

  1. Зарегистрируйтесь в приложении Telegram и перейдите по ссылке https://my.telegram.org. Введите свой номер телефона и код, полученный после этого в мессенджере.

  2. В следующем окне выберите API development tools и задайте параметры вашего приложения. Интерфейс не очень‑то дружелюбен: он может без пояснений выдать сообщение ERROR (например, если введенное имя не соответствует требованиям системы). При успехе из полученной конфигурации вам понадобятся значения полей App api_id и App api_hash.

В свою очередь из вашего облака понадобятся:

  • FQDN хоста ClickHouse с публичным доступом вида XXX–XX.XX.yandexcloud.net.
  • Имя вашей БД для переменной окружения TF_VAR_CH_DB_NAME.

С этими данными возвращаемся в консоль и копируем проект на свое устройство:

git clone https://github.com/handgunman/yc-sltg-stats

Переходим в директорию проекта и устанавливаем зависимости:

pip install -r ./src/requirements.txt

Сохраняем токен, идентификатор и хеш приложения Telegram в переменные окружения YC_TOKEN, TG_API_ID, TG_API_HASH и запускаем скрипт подключения, подставляя значения параметров вместо <…>:

python3 secrets/create_secrets.py --yc-folder-id <…> --ch-user <…> --ch-pass <…>

В некоторых случаях вместо Python в командах следует использовать Python3.

При выполнении нужно ввести дополнительные данные — номер телефона в международном формате и код подтверждения, который вы получите в Telegram. Взамен будут выданы идентификаторы созданных секретов, которые станут доступны среди прочих секретов в Lockbox, и идентификатор созданной сессии. Нужно создать переменные окружения TF_VAR_TG_SECRET_ID, TF_VAR_CH_CREDS_SECRET_ID, TF_VAR_CH_SECRET_ID, поместив в них соответствующие идентификаторы секретов.

Чтобы получить идентификаторы чатов, выполняем скрипт, используя в том числе полученный идентификатор секрета:

python3 src/list_groups.py --tg-secret-id <идентификатор секрета>

Из полученного в результате списка выбираем нужные ID чатов. Далее разделяем их запятыми и сохраняем в переменной окружения TF_VAR_DIALOG_IDS.

Переходим в директорию pull задаем дополнительные переменные окружения TF_VAR_CH_HOST, TF_VAR_CH_DB_NAME и инициализируем проект terraform-командой terraform init.

Применяем созданный план.
terraform apply -var folder_id=<идентификатор каталога>

Если всё выполнено правильно, то создастся новая версия функции. Можно выбрать её и перейти в редактор, чтобы посмотреть код.

Обратите внимание: на скриншоте есть ограничение по дате, начиная с которой будут выбираться исторические данные.

Пролистав вниз, можно увидеть переменные окружения, в том числе список идентификаторов каналов и чатов. Его в дальнейшем можно будет редактировать.

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

Для удобства визуализации в DataLens можно создать следующее представление:

CREATE OR REPLACE VIEW all_messages AS
SELECT
  g.name, --название группы
  p.username, --имя пользователя
  m.dt, --дата и время
  m.group_id, --идентификатор группы
  m.message_id, --идентификатор сообщения
  m.user_id, --идентификатор пользователя
  m.message_text, --сообщение
  m.is_forwarded, --пересланное
  m.reply_to, --идентификатор сообщения на которое ответ
  m.topic_id, --идентификатор темы
  t.title, --заголовок темы
  p.is_bot --это бот
FROM messages m 
JOIN groups g ON g.group_id = m.group_id 
JOIN participants p ON p.user_id = m.user_id
JOIN topics t ON t.group_id = m.group_id AND t.topic_id = m.topic_id

Можно приступать к визуализации статистики в DataLens аналогично тому, как это описано в статье. Вы можете сделать это сами или воспользоваться шаблоном дашборда. Его можно развернуть из маркетплейса DataLens.

После разворачивания дашборда нужно будет в Подключении заменить реквизиты базы данных на ваши.

Таким образом, за несколько шагов мы собрали статистику Telegram‑чатов с помощью Yandex Cloud Functions и визуализировали результаты в Yandex DataLens. Вы увидели, что это не так сложно, как кажется. Теперь у вас есть готовый дашборд, которым вы можете поделиться с командой или клиентом.

Остались вопросы? Комьюнити Yandex DataLens поможет!

Здесь вы можете найти ответы на популярные вопросы, спросить совета у других пользователей и наших экспертов, а также будете в курсе новостей сервиса.

author
Сергей Платонов

Напишите нам

Начать пользоваться Yandex Cloud

Тарифы

Узнать цены и рассчитать стоимость

Мероприятия

Календарь событий Yandex Cloud
Как собрать статистику Telegram‑чатов с помощью Yandex Cloud Functions
Войдите, чтобы сохранить пост