Столько данных, лежат и ждут чтобы их спарсили. Не удержался
Всем привет. Я бэкенд разработчик, и по роду деятельности активно использую разные чаты в Телеге – по 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).
UPD: Проект поддержало агентство idaproject за что им большое спасибо, я разместил баннер с вакансиями.
Планы по развитию
Бот для возможности скрыть свое «имя» и «фамилию» и аватарку с сайта, заменив на «аноним»;
Теги вопросов и чатов;
Логин, добавление вопросов в «избранное»;
Возможность ставить + и - на вопросы и ответы;
Сборка и выгрузка карты сайта раз в неделю, для поисковых систем;
Добавить больше статистических данных. Например, самые активные юзеры среди всех чатов;
Улучшить поисковое окно. Сейчас поиск идет только по вопросам, думаю имеет смысл добавить и ответы и имена пользователей, названия чатов;
Полировка UI: кнопки шаринга, статические ссылки на конкретный ответ, придумать какой полезный блок поставить в правой колонке — сейчас там пустовато;
Микроразметка;
Для мгновенной загрузки с мобилок возможно имеет смысл добавить Google AMP, Яндекс Turbo;
API. Чтобы те кто захотел спарсить мой сайт для своих нужд, не страдали разбирая HTML;
Спасибо что дочитали до конца. Как считаете, полезный проект я запилил? Покликать можно тут: https://telq.org
Комментарии (31)
kirilldemidov
25.08.2021 21:59+1Отличный ресурс!
Если нужна помощь дата-инженера, то с радостью ее попробую оказать!DenisOmg Автор
25.08.2021 22:10+1Кирилл, спасибо за поддержку )
Serabas
26.08.2021 06:46+1Присоединяюсь к возможности помочь) Начинающий DevOps
DenisOmg Автор
25.08.2021 22:57Я планирую прописать руками тэги для 250 чатов (не так много) – например если чат по Python — то 'python', 'backend', 'programming language'. Я точно знаю из какого чата вопрос и ставлю вопросу соответствующие тэги. Кликнув по тэгу ('backend' например) будет кросс-поиск по всем вопросам с этим тэгом (не только из чата Python)
Tellamonid
25.08.2021 22:30+14Лет 15 назад интернет ещё не был сломан. На любую тему были форумы, у них были подфорумы, и там можно было задавать вопросы, и получать ответы. Потом появился Stack Overflow, и, к счастью, здравствует по сей день. А ещё через какое-то время развились сообщества в мессенджерах. Мало того, что эти мессенджеры не совместимы между собой, и надо иметь несколько установленными, так они ещё и не индексируются. Эффективность поисковиков упала, ответы на многие вопросы сейчас просто не найти. И приходится находить соответствующий чат, например, в Телеграме, и задавать вопрос там. Получается, что людям сейчас сильно сложнее найти ответ, на который кто-то уже отвечал, и приходится заново спрашивать, и заново отвечать.
Автору спасибо за проект, и успехов!
Pavel1114
26.08.2021 06:29+1Телеграм это как флудилка. Только хуже.
Это из той же серии что и использование instagram в качестве витрины — модно, но очень неудобно.
SignallerK
26.08.2021 08:40+1А ещё, со временем желание давать хорошие ответы пропадает. Не, потому что отвечающий плохой, а просто человек устает повторять одно и тоже в чатике.
В результате ответы медленно скатываются в простое how to без каких либо объяснений.
Таки не могу не согласится, что с чатиками инет свернул куда-то не туда.
victoriously
26.08.2021 02:02А как обстоят дела с лицензией на проект и на данные? Будет ли хотя бы техническая часть в опен-сурсе, не говоря уж о вопросах-ответах?
Кстати, в данный момент картинки в ответах принудительно скачивает, открыть в браузере их нереально.
cucusenok
26.08.2021 09:47+1Да, была такая мысль - у самого тьма чатов и хотя бы быстро но пролистываю их, чтобы что-то подчеркнуть для себя)
Фичи.Как вариант можешь ещё фильтровать по "спасибо" и синонимам - чтобы забирать "закрытый" тред. Ещё можно искать самых активных и к ним добавить метрику "спасибо" - будет список хороших специалистов по идее. Тут надо думать в стиле NLP, метрик с живого чата можно собрать много.
Самые популярные темы за день. Чтобы не пропустить что-то интересное. Можно визуализацию сделать в виде облака слов.
Можно группировать задаваемые вопросы, брать частоту из встречаемости - почти готовый план обучения. Т.е. ты увидишь в каких местах люди не смогли найти ответ самостоятельно и пошли за помощью к людям;
Fen1kz
26.08.2021 13:11А где вообще люди ищут годные профильные чаты?
Reformat
26.08.2021 14:22+2Участники большинства IT сообществ, как правило, сами стремятся оставить где-то ссылку на свой чат, например оставляют pull request здесь: https://github.com/goq/telegram-list или у себя на сайте (ClickHouse например). Так или иначе, все это попадает в поиск и индексируется. Второй раз индексацию проводят специальные боты рекламных бирж которые имеют интеграцию с большинством популярных ботов для администрирования. Полученные ботами сообщения выгружаются на сайт биржи вместе с названием, и вуаля, она cтановится доступна в поиске, ну а восстановить ссылку по названию чата дело техники)
yar0
26.08.2021 14:31Полезный ресурс. Подскажите, как вы составили такой большой список каналов? Точнее откуда узнали и узнаете о тематических IT группах?
DenisOmg Автор
26.08.2021 14:34Спасибо) Список составил в основном из https://github.com/goq/telegram-list как подметил Reformat выше. Англоязычные отсюда https://thedevs.network. Плюс каких-то нет и там и там, я просто в них был сам ранее, поэтому добавил
STingerOid
26.08.2021 17:03У телеграма появилась работающая техподдержка?
В 2018 году мне до них достучаться не удалось)
DenisOmg Автор
26.08.2021 17:22По вопросам блокировки на recover@telegram.org отвечали быстро, в течении суток. "Волонтерская поддержка" по общим вопросам через бота — слышал часто что долго реагируют
STingerOid
26.08.2021 17:42+1У меня была проблема, что я завел аккаунт в телеграме, и его тут же забанили, я ничего даже сделать не успел. Пытался связаться разными способами, через форму на сайте, по мылу какому-то, даже твиттер завел, чтобы им написать в их спецтвиттер для решения проблем, ничего не помогало и никто не отвечал, пришлось заводить вторую симку только ради телеграма (я устроился на новую работу, а там корпоративная переписка шла в нём).
Спустя какое-то время первый номер был разбанен (автоматически наверное), и я перенес свой акк на него, довольно вовремя, так как спецсимка уже протухла.
qbtarzan
27.08.2021 08:45+1Если я правильно понял, то у вас контент постоянно плавает между страницами, то есть первая страница все время содержит самые свежие сообщения, потом "?page=2" более старые и так далее.
Таким образом поисковикам невозможно проиндексировать контент один раз и потом слать юзеров на эту страницу, на том же URL завтра будет другой контент.
Я бы на вашем месте сделал что-то типа permalinks в вордпрессе, чтоб в URL была дата, например, и связки URL-контент оставались стабильными.
shubinm
21.10.2021 14:31добавлю, на всякий случай.
в десктоп версии телеги есть экспорт чатов, каналов и групп.
Настройки -> Продвинутые настройки -> Экспорт данных из Telegram
может поможет не подгружать историю месяцами.
DenisOmg Автор
21.10.2021 14:35Верно, спасибо, это тоже тестировал) Но в экспорте нет самого важного — нет «ответов» чтобы распарсить треды. Тем временем на сайте уже 713к вопросов, против 113к на момент написания статьи))
Scinolim
По факту, подтягивается кусок чата после вопроса? Там по делу если 10% ответов будут уже хорошо, до оригинала пока далеко.
DenisOmg Автор
Нет, именно телеграм-тред. Если между ответами будут другие сообщения, оно не перемешается. В приложении выглядит так (а я получаю то же по API):