Столько данных, лежат и ждут чтобы их спарсили. Не удержался
![](https://habrastorage.org/getpro/habr/upload_files/58a/f4b/e38/58af4be38c1d3e7e3e0a73ef8b628948.png)
Всем привет. Я бэкенд разработчик, и по роду деятельности активно использую разные чаты в Телеге – по Go, Кубернетес, базам данных. Задаю свои вопросы, иногда отвечаю на чужие.
В какой-то момент этих чатов стало так много, что личные сообщения искать было совсем трудно.
Как и многих бумеров, меня тоже FoMO не обходит стороной. Продуктивность падает, хочется читать чатики, участвовать в холиварах (кто не в курсе, в айтишных чатах баталии многочисленные, например в чате по Куберу 6к юзеров. Во фронтовых чатах по JS или фреймворкам еще больше). Каждый день обсуждают что-то действительно интересное.
![Хочу все прочитать Хочу все прочитать](https://habrastorage.org/getpro/habr/upload_files/95e/7d6/a29/95e7d6a29eb006bfd6f47e077f6e4399.png)
Было бы здорово получить дайджест популярных обсуждений за день — какое-то время вынашивал эту идею, но по итогу трансформировал в форму базы знаний в формате вопрос-ответ (начальная идея перекочевала в виде дефолтной сортировки вопросов по дням+популярности).
Идея Q&A из Телеги показалась очень интересной, и социально полезной. Обидно что такая кладезь знаний пропадает в недрах неиндексируемых телеграм-чатов. Ведь когда я был начинающим разрабом, общение с комьюнити позволило мне быстро бустануть скиллы. Пришло время отдавать должок)
Первые проблемы
Очевидно что для реализации такого сайта потребуется как-то кодом читать сообщения из телеги. У телеграма есть API для ботов (не подходит, боты не могут самостоятельно вступать в чаты), а также клиентский API, который предоставляет все возможности пользователя Telegram — TDLib или кастомные реализации MTProto. Это называется юзер-бот, к слову спам в телеге рассылают именно так.
Я люблю Go, хорошие люди посоветовали этот Telegram клиент. Окей, почитав доку библиотеки, за пару часов сделал прототип, который выводит новые сообщения из чатов в лог.
«Ураа, видно несколько новых сообщений из телеграма в консоли! Думаю дальше дело пойдет быстрее»
Но я рано обрадовался. Через несколько секунд вижу вывод ошибок. Пытаюсь проверить аккаунт через мобильное приложение, меня тут же разлогинивает. Ввожу номер, и вижу что мой аккаунт заблокирован.
![](https://habrastorage.org/getpro/habr/upload_files/d74/8b5/dd2/d748b5dd2b9872236e56530ec475e382.jpg)
Кликаю на «Помощь», пишу на почту поддержке Телеграм, рассказываю о своем проекте и причинах использования экзотического неофициального клиента. После недолгой переписки, аккаунт разблокировали.
Однако через несколько дней возникла другая проблема: после пары минут работы Телеграм разлогинивал все сессии аккаунта. Решилось так же через письмо в поддержку, в котором описал что использую API как и планировал и в readonly режиме. Сейчас работает стабильно.
Архитектура проекта
Отдельный Телеграм аккаунт
Вступил в ~250 чатов нужных тематик руками через мобильное приложение.
Scanner сервис
Сервис на Go, который держит коннект с телегой, получает новые сообщения, которые приходят в аккаунт, фильтрует только те что содержат «?» — значит это вопрос и нам это интересно. Далее сервис обогащает данные объектом юзера, доп. информацией по чату через Telegram API, сохраняет аватарки пользователя и чата в S3, и отправляет сообщение с метаданными в очередь NATS JetStream.
Также сервис листает вверх чаты по очереди, чтобы скачать исторические данные. Состояние синхронизации старых сообщений сохраняет в MongoDB, чтобы не ходить по кругу при перезапуске сервиса.
Telegram API имеет жесткие лимиты, поэтому приходится держать очень слабый поток запросов. Сейчас на сайте синхронизировано 100к вопросов за 1 месяц работы сканнера, но обработана совсем малая часть исторических данных. Когда будет обработано все — вопросов будет около 1.5млн.
Stateless сервис, но всегда в единственном экземпляре так как в телеге открыта так же 1 сессия клиента.
![Scanner сканирует) Scanner сканирует)](https://habrastorage.org/getpro/habr/upload_files/974/d9b/a1f/974d9ba1f88ab13969c3ffc4e47b4c47.png)
Backend сервис
Сервис на Go, который читает очередь с сообщениями и сохраняет в MongoDB. Также выполняет роль фронтенда с помощью Go template (шаблонизация).
Я не стал использовать фронтенд фреймворки, хотя Vue мне нравится. Главная причина — очень ресурсоемкий SSR (чтобы страничка генерировалась на сервере, и роботы поисковых систем без проблем ее проиндексировали). Go шаблоны очень быстрые и легковесные, плюс как любая шаблонизация они не требуют JS на клиенте. UI библиотеку взял Bootstrap — да, многим надоел он уже, но мне нравится + позволяет быстро сделать приличный интерфейс.
Stateless сервис, масштабируется без проблем (но пока нагрузки нет, и это не требуется).
![Архитектура проекта Архитектура проекта](https://habrastorage.org/getpro/habr/upload_files/f9f/bec/fbb/f9fbecfbb414fccad1663d861525e01d.png)
Качество данных
Спасибо функциональности «ответов» на сообщения в телеге. Так можно легко разобрать какой ответ относится в конкретному вопросу. В целом, меня устраивает качество данных, которые собираются. Нерелевантных обсуждений не более 15%, что для автонаполняемого сайта думаю неплохой показатель.
Конечно, встречаются приколы и странные вопросы:
![](https://habrastorage.org/getpro/habr/upload_files/afa/1b4/c04/afa1b4c0433f08b086e685fbf8af81a7.png)
Или случаи когда кто-то один ответил вне треда, и кто-то ответил уже ему — получили новый тред, который по факту «хвост» другого обсуждения:
![](https://habrastorage.org/getpro/habr/upload_files/a1d/a56/cd1/a1da56cd15703fbad979c4e620d83482.png)
Монетизация
Сейчас проект не монетизируется никак. Когда посещаемость будет хотя-бы 10к визитов в день, имеет смысл поставить рекламный баннер. Но сейчас посещалка около нуля. Судя из панели вебмастера Яндекс и Google пока проиндексировано очень мало страниц сайта, возможно причина в этом.
Если проект вырастет до 50-100к посещалки в день имеет смысл добавить платное размещение вакансий (один из векторов монетизации StackOverflow).
UPD: Проект поддержало агентство idaproject за что им большое спасибо, я разместил баннер с вакансиями.
Планы по развитию
-
Бот для возможности скрыть свое «имя» и «фамилию» и аватарку с сайта, заменив на «аноним»;
-
Теги вопросов и чатов;
-
Логин, добавление вопросов в «избранное»;
-
Возможность ставить + и — на вопросы и ответы;
-
Сборка и выгрузка карты сайта раз в неделю, для поисковых систем;
-
Добавить больше статистических данных. Например, самые активные юзеры среди всех чатов;
-
Улучшить поисковое окно. Сейчас поиск идет только по вопросам, думаю имеет смысл добавить и ответы и имена пользователей, названия чатов;
-
Полировка UI: кнопки шаринга, статические ссылки на конкретный ответ, придумать какой полезный блок поставить в правой колонке — сейчас там пустовато;
-
Микроразметка;
-
Для мгновенной загрузки с мобилок возможно имеет смысл добавить Google AMP, Яндекс Turbo;
-
API. Чтобы те кто захотел спарсить мой сайт для своих нужд, не страдали разбирая HTML;
Спасибо что дочитали до конца. Как считаете, полезный проект я запилил? Покликать можно тут: https://telq.org
ссылка на оригинал статьи https://habr.com/ru/articles/574666/
Добавить комментарий