Я сделал StackOverflow из IT-чатов Telegram
Столько данных, лежат и ждут чтобы их спарсили. Не удержался
Всем привет. Я бэкенд разработчик, и по роду деятельности активно использую разные чаты в Телеге — по 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 сканирует)
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