Я сделал 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, да и VC тоже).

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

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

  • Сборка и выгрузка карты сайта раз в неделю, для поисковых систем;
  • Добавить больше статистических данных. Например, самые активные юзеры среди всех чатов;
  • Улучшить поисковое окно. Сейчас поиск идет только по вопросом, думаю имеет смысл добавить и ответы и имена пользователей, названия чатов;
  • Полировка UI: кнопки шаринга, статические ссылки на конкретный ответ, придумать какой полезный блок поставить в правой колонке — сейчас там пустовато;
  • Микроразметка;
  • Для мгновенной загрузки с мобилок возможно имеет смысл добавить Google AMP, Яндекс Turbo;
  • API. Чтобы те кто захотел спарсить мой сайт для своих нужд, не страдали разбирая HTML;

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

0
256 комментариев
Написать комментарий...
Andrew Krew

Технически красиво. Практически проект вызывает отторжение, потому что одно дело обсуждение в чате, другое дело эти же сообщения, но нагло распарщеные и выставленные на всеобщее обозрение. Не хотелось бы например мне увидеть свою переписку за пределами чата. 

Ответить
Развернуть ветку
Denis
Автор

Согласен, но @username пользователей на сайте нет (специально не стал добавлять). Но "имя" и "фамилия" и аватарка есть.

Думаю имеет смысл сделать бота через которого можно скрыть имя-фамилия-аватар с сайта. Но удалять сообщения пользователя по запросу наверное не оч корректно, ведь другие не смогут найти твой ответ на вопрос например "как сделать N". А так ответ твой увидят, но он будет от имени анонима

Ответить
Развернуть ветку
Masha Kovalyova

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

Ответить
Развернуть ветку
Denis
Автор

По этой логике самый злостный нарушитель авторских прав - гугл и яндекс

Ответить
Развернуть ветку
Всвиторе

Твой сервис ничем не отличается от многих других сайтов, которые просто тупо крадут контент со stackoverflow переводят его и вывешивают его как свой. 

Ответить
Развернуть ветку
Дмитрий Перепёлкин

В статье всё явно объяснено в третьем абзаце. То что есть в этих чатах не всегда есть на SO.

Ответить
Развернуть ветку
Всвиторе

Чуваки спрашивающие в чатах не давали разрешения, тем более не давали разрешения сами организаторы чатов.  

Ответить
Развернуть ветку
Дмитрий Перепёлкин

Это уже другой вопрос. Тем не менее тут как своё никто ничего не выдаёт.

Ответить
Развернуть ветку
Всвиторе

Ну чел явно не из благих намерений делал. Вроде как да, но потом "рекламку прикрутить". Нормальный SO и ему подобные сайты этот продукт не перебьёт и уж тем более качество ответов.

Ответить
Развернуть ветку
253 комментария
Раскрывать всегда