Я сделал 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 сессия клиента.
Backend сервис
Сервис на Go, который читает очередь с сообщениями и сохраняет в MongoDB. Также выполняет роль фронтенда с помощью Go template (шаблонизация).
Я не стал использовать фронтенд фреймворки, хотя Vue мне нравится. Главная причина — очень ресурсоемкий SSR (чтобы страничка генерировалась на сервере, и роботы поисковых систем без проблем ее проиндексировали). Go шаблоны очень быстрые и легковесные, плюс как любая шаблонизация они не требуют JS на клиенте. UI библиотеку взял Bootstrap — да, многим надоел он уже, но мне нравится + позволяет быстро сделать приличный интерфейс.
Stateless сервис, масштабируется без проблем (но пока нагрузки нет, и это не требуется).
Качество данных
Спасибо функциональности «ответов» на сообщения в телеге. Так можно легко разобрать какой ответ относится в конкретному вопросу. В целом, меня устраивает качество данных которые собираются. Нерелевантных обсуждений не более 15%, что для автонаполняемого сайта думаю неплохой показатель.
Конечно, встречаются приколы и странные вопросы:
Или случаи когда кто-то один ответил вне треда, и кто-то ответил уже ему — получили новый тред, который по факту «хвост» другого обсуждения:
Монетизация
Сейчас проект не монетизируется никак. Когда посещаемость будет хотя-бы 10к визитов в день, имеет смысл поставить рекламный баннер. Но сейчас посещалка около нуля. Судя из панели вебмастера Яндекс и Google пока проиндексировано очень мало страниц сайта, возможно причина в этом.
Если проект вырастет до 50-100к посещалки в день имеет смысл добавить платное размещение вакансий (один из векторов монетизации StackOverflow, да и VC тоже).
UPD 21.09.21 19:06: Проект поддержало агентство idaproject за что им большое спасибо, я разместил баннер с вакансиями.
Планы по развитию
- Сборка и выгрузка карты сайта раз в неделю, для поисковых систем;
- Добавить больше статистических данных. Например, самые активные юзеры среди всех чатов;
- Улучшить поисковое окно. Сейчас поиск идет только по вопросом, думаю имеет смысл добавить и ответы и имена пользователей, названия чатов;
- Полировка UI: кнопки шаринга, статические ссылки на конкретный ответ, придумать какой полезный блок поставить в правой колонке — сейчас там пустовато;
- Микроразметка;
- Для мгновенной загрузки с мобилок возможно имеет смысл добавить Google AMP, Яндекс Turbo;
- API. Чтобы те кто захотел спарсить мой сайт для своих нужд, не страдали разбирая HTML;
Спасибо что дочитали до конца. Как считаете, полезный проект я запилил? Покликать можно тут:
Технически сделано круто!
P.S не удержался
Все так)) Видимо какой-то закон природы, так всегда(
Сообщение удалено
Технически красиво. Практически проект вызывает отторжение, потому что одно дело обсуждение в чате, другое дело эти же сообщения, но нагло распарщеные и выставленные на всеобщее обозрение. Не хотелось бы например мне увидеть свою переписку за пределами чата.
Согласен, но @username пользователей на сайте нет (специально не стал добавлять). Но "имя" и "фамилия" и аватарка есть.
Думаю имеет смысл сделать бота через которого можно скрыть имя-фамилия-аватар с сайта. Но удалять сообщения пользователя по запросу наверное не оч корректно, ведь другие не смогут найти твой ответ на вопрос например "как сделать N". А так ответ твой увидят, но он будет от имени анонима
Так все публичные чаты и так выставлены не всеобщее обозрение
Комментарий недоступен