Как стать автором
Обновить

Я сделал StackOverflow из IT-чатов Telegram

Время на прочтение 4 мин
Количество просмотров 18K

Столько данных, лежат и ждут чтобы их спарсили. Не удержался

Всем привет. Я бэкенд разработчик, и по роду деятельности активно использую разные чаты в Телеге – по Go, Кубернетес, базам данных. Задаю свои вопросы, иногда отвечаю на чужие.

В какой-то момент этих чатов стало так много, что личные сообщения искать было совсем трудно.

Как и многих бумеров, меня тоже FoMO не обходит стороной. Продуктивность падает, хочется читать чатики, участвовать в холиварах (кто не в курсе, в айтишных чатах баталии многочисленные, например в чате по Куберу 6к юзеров. Во фронтовых чатах по JS или фреймворкам еще больше). Каждый день обсуждают что-то действительно интересное.

Хочу все прочитать
Хочу все прочитать

Было бы здорово получить дайджест популярных обсуждений за день — какое-то время вынашивал эту идею, но по итогу трансформировал в форму базы знаний в формате вопрос-ответ (начальная идея перекочевала в виде дефолтной сортировки вопросов по дням+популярности).

Идея Q&A из Телеги показалась очень интересной, и социально полезной. Обидно что такая кладезь знаний пропадает в недрах неиндексируемых телеграм-чатов. Ведь когда я был начинающим разрабом, общение с комьюнити позволило мне быстро бустануть скиллы. Пришло время отдавать должок)

Первые проблемы

Очевидно что для реализации такого сайта потребуется как-то кодом читать сообщения из телеги. У телеграма есть API для ботов (не подходит, боты не могут самостоятельно вступать в чаты), а также клиентский API, который предоставляет все возможности пользователя Telegram — TDLib или кастомные реализации MTProto. Это называется юзер-бот, к слову спам в телеге рассылают именно так.

Я люблю Go, хорошие люди посоветовали этот Telegram клиент. Окей, почитав доку библиотеки, за пару часов сделал прототип, который выводит новые сообщения из чатов в лог.

«Ураа, видно несколько новых сообщений из телеграма в консоли! Думаю дальше дело пойдет быстрее»

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

Кликаю на «Помощь», пишу на почту поддержке Телеграм, рассказываю о своем проекте и причинах использования экзотического неофициального клиента. После недолгой переписки, аккаунт разблокировали.

Однако через несколько дней возникла другая проблема: после пары минут работы Телеграм разлогинивал все сессии аккаунта. Решилось так же через письмо в поддержку, в котором описал что использую API как и планировал и в readonly режиме. Сейчас работает стабильно.

Архитектура проекта

Отдельный Телеграм аккаунт

Вступил в ~250 чатов нужных тематик руками через мобильное приложение.

Scanner сервис

Сервис на Go, который держит коннект с телегой, получает новые сообщения, которые приходят в аккаунт, фильтрует только те что содержат «?» — значит это вопрос и нам это интересно. Далее сервис обогащает данные объектом юзера, доп. информацией по чату через Telegram API, сохраняет аватарки пользователя и чата в S3, и отправляет сообщение с метаданными в очередь NATS JetStream.

Также сервис листает вверх чаты по очереди, чтобы скачать исторические данные. Состояние синхронизации старых сообщений сохраняет в MongoDB, чтобы не ходить по кругу при перезапуске сервиса.

Telegram API имеет жесткие лимиты, поэтому приходится держать очень слабый поток запросов. Сейчас на сайте синхронизировано 100к вопросов за 1 месяц работы сканнера, но обработана совсем малая часть исторических данных. Когда будет обработано все — вопросов будет около 1.5млн.

Stateless сервис, но всегда в единственном экземпляре так как в телеге открыта так же 1 сессия клиента.

Scanner сканирует)
Scanner сканирует)

Backend сервис

Сервис на Go, который читает очередь с сообщениями и сохраняет в MongoDB. Также выполняет роль фронтенда с помощью Go template (шаблонизация).

Я не стал использовать фронтенд фреймворки, хотя Vue мне нравится. Главная причина — очень ресурсоемкий SSR (чтобы страничка генерировалась на сервере, и роботы поисковых систем без проблем ее проиндексировали). Go шаблоны очень быстрые и легковесные, плюс как любая шаблонизация они не требуют JS на клиенте. UI библиотеку взял Bootstrap — да, многим надоел он уже, но мне нравится + позволяет быстро сделать приличный интерфейс.

Stateless сервис, масштабируется без проблем (но пока нагрузки нет, и это не требуется).

Архитектура проекта
Архитектура проекта

Качество данных

Спасибо функциональности «ответов» на сообщения в телеге. Так можно легко разобрать какой ответ относится в конкретному вопросу. В целом, меня устраивает качество данных, которые собираются. Нерелевантных обсуждений не более 15%, что для автонаполняемого сайта думаю неплохой показатель.

Конечно, встречаются приколы и странные вопросы:

Или случаи когда кто-то один ответил вне треда, и кто-то ответил уже ему — получили новый тред, который по факту «хвост» другого обсуждения:

Монетизация

Сейчас проект не монетизируется никак. Когда посещаемость будет хотя-бы 10к визитов в день, имеет смысл поставить рекламный баннер. Но сейчас посещалка около нуля. Судя из панели вебмастера Яндекс и Google пока проиндексировано очень мало страниц сайта, возможно причина в этом.

Если проект вырастет до 50-100к посещалки в день имеет смысл добавить платное размещение вакансий (один из векторов монетизации StackOverflow).

UPD: Проект поддержало агентство idaproject за что им большое спасибо, я разместил баннер с вакансиями.

Планы по развитию

  • Бот для возможности скрыть свое «имя» и «фамилию» и аватарку с сайта, заменив на «аноним»;

  • Теги вопросов и чатов;

  • Логин, добавление вопросов в «избранное»;

  • Возможность ставить + и - на вопросы и ответы;

  • Сборка и выгрузка карты сайта раз в неделю, для поисковых систем;

  • Добавить больше статистических данных. Например, самые активные юзеры среди всех чатов;

  • Улучшить поисковое окно. Сейчас поиск идет только по вопросам, думаю имеет смысл добавить и ответы и имена пользователей, названия чатов;

  • Полировка UI: кнопки шаринга, статические ссылки на конкретный ответ, придумать какой полезный блок поставить в правой колонке — сейчас там пустовато;

  • Микроразметка;

  • Для мгновенной загрузки с мобилок возможно имеет смысл добавить Google AMP, Яндекс Turbo;

  • API. Чтобы те кто захотел спарсить мой сайт для своих нужд, не страдали разбирая HTML;


Спасибо что дочитали до конца. Как считаете, полезный проект я запилил? Покликать можно тут: https://telq.org

Теги:
Хабы:
+40
Комментарии 35
Комментарии Комментарии 35

Публикации

Истории

Работа

Go разработчик
124 вакансии

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн