Столько данных, лежат и ждут чтобы их спарсили. Не удержался

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

Комментарии (31)


  1. Scinolim
    25.08.2021 21:07
    +3

    По факту, подтягивается кусок чата после вопроса? Там по делу если 10% ответов будут уже хорошо, до оригинала пока далеко.


    1. DenisOmg Автор
      25.08.2021 22:10

      Нет, именно телеграм-тред. Если между ответами будут другие сообщения, оно не перемешается. В приложении выглядит так (а я получаю то же по API):


  1. kirilldemidov
    25.08.2021 21:59
    +1

    Отличный ресурс!
    Если нужна помощь дата-инженера, то с радостью ее попробую оказать!


    1. DenisOmg Автор
      25.08.2021 22:10
      +1

      Кирилл, спасибо за поддержку )


      1. Serabas
        26.08.2021 06:46
        +1

        Присоединяюсь к возможности помочь) Начинающий DevOps


        1. DenisOmg Автор
          25.08.2021 22:57

          Я планирую прописать руками тэги для 250 чатов (не так много) – например если чат по Python — то 'python', 'backend', 'programming language'. Я точно знаю из какого чата вопрос и ставлю вопросу соответствующие тэги. Кликнув по тэгу ('backend' например) будет кросс-поиск по всем вопросам с этим тэгом (не только из чата Python)


  1. anonymous
    00.00.0000 00:00


    1. DenisOmg Автор
      25.08.2021 22:36
      +1

      Согласен, «спросить» и «ответить» можно прямой ссылкой на телегу, или только на сайте добавлять (надо обдумать).

      Про другие платформы — да, много векторов развития. И архитектура позволяет добавить второй «сканнер» без проблем.


  1. anonymous
    00.00.0000 00:00


  1. anonymous
    00.00.0000 00:00


  1. Tellamonid
    25.08.2021 22:30
    +14

    Лет 15 назад интернет ещё не был сломан. На любую тему были форумы, у них были подфорумы, и там можно было задавать вопросы, и получать ответы. Потом появился Stack Overflow, и, к счастью, здравствует по сей день. А ещё через какое-то время развились сообщества в мессенджерах. Мало того, что эти мессенджеры не совместимы между собой, и надо иметь несколько установленными, так они ещё и не индексируются. Эффективность поисковиков упала, ответы на многие вопросы сейчас просто не найти. И приходится находить соответствующий чат, например, в Телеграме, и задавать вопрос там. Получается, что людям сейчас сильно сложнее найти ответ, на который кто-то уже отвечал, и приходится заново спрашивать, и заново отвечать.

    Автору спасибо за проект, и успехов!


    1. DenisOmg Автор
      25.08.2021 22:43
      +2

      Спасибо за фидбек )


    1. Pavel1114
      26.08.2021 06:29
      +1

      Телеграм это как флудилка. Только хуже.
      Это из той же серии что и использование instagram в качестве витрины — модно, но очень неудобно.


    1. SignallerK
      26.08.2021 08:40
      +1

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

      В результате ответы медленно скатываются в простое how to без каких либо объяснений.

      Таки не могу не согласится, что с чатиками инет свернул куда-то не туда.


  1. victoriously
    26.08.2021 02:02

    А как обстоят дела с лицензией на проект и на данные? Будет ли хотя бы техническая часть в опен-сурсе, не говоря уж о вопросах-ответах?
    Кстати, в данный момент картинки в ответах принудительно скачивает, открыть в браузере их нереально.


  1. Eugeny1987
    26.08.2021 05:43
    +1

    Показывает этот же вопрос


  1. Oxyd
    26.08.2021 06:40
    +1

    Вопросы по systemd находятся, но вот профильный чатик походу не добавлен. ;-)


    1. DenisOmg Автор
      26.08.2021 14:35
      +1

      Добавил)


      1. Oxyd
        28.08.2021 21:13

        Спасибо!


  1. cucusenok
    26.08.2021 09:47
    +1

    Да, была такая мысль - у самого тьма чатов и хотя бы быстро но пролистываю их, чтобы что-то подчеркнуть для себя)

    Фичи.

    1. Как вариант можешь ещё фильтровать по "спасибо" и синонимам - чтобы забирать "закрытый" тред. Ещё можно искать самых активных и к ним добавить метрику "спасибо" - будет список хороших специалистов по идее. Тут надо думать в стиле NLP, метрик с живого чата можно собрать много.

    2. Самые популярные темы за день. Чтобы не пропустить что-то интересное. Можно визуализацию сделать в виде облака слов.

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


  1. Fen1kz
    26.08.2021 13:11

    А где вообще люди ищут годные профильные чаты?


    1. Reformat
      26.08.2021 14:22
      +2

      Участники большинства IT сообществ, как правило, сами стремятся оставить где-то ссылку на свой чат, например оставляют pull request здесь: https://github.com/goq/telegram-list или у себя на сайте (ClickHouse например). Так или иначе, все это попадает в поиск и индексируется. Второй раз индексацию проводят специальные боты рекламных бирж которые имеют интеграцию с большинством популярных ботов для администрирования. Полученные ботами сообщения выгружаются на сайт биржи вместе с названием, и вуаля, она cтановится доступна в поиске, ну а восстановить ссылку по названию чата дело техники)


  1. yar0
    26.08.2021 14:31

    Полезный ресурс. Подскажите, как вы составили такой большой список каналов? Точнее откуда узнали и узнаете о тематических IT группах?


    1. DenisOmg Автор
      26.08.2021 14:34

      Спасибо) Список составил в основном из https://github.com/goq/telegram-list как подметил Reformat выше. Англоязычные отсюда https://thedevs.network. Плюс каких-то нет и там и там, я просто в них был сам ранее, поэтому добавил


  1. STingerOid
    26.08.2021 17:03

    У телеграма появилась работающая техподдержка?

    В 2018 году мне до них достучаться не удалось)


    1. DenisOmg Автор
      26.08.2021 17:22

      По вопросам блокировки на recover@telegram.org отвечали быстро, в течении суток. "Волонтерская поддержка" по общим вопросам через бота — слышал часто что долго реагируют


      1. STingerOid
        26.08.2021 17:42
        +1

        У меня была проблема, что я завел аккаунт в телеграме, и его тут же забанили, я ничего даже сделать не успел. Пытался связаться разными способами, через форму на сайте, по мылу какому-то, даже твиттер завел, чтобы им написать в их спецтвиттер для решения проблем, ничего не помогало и никто не отвечал, пришлось заводить вторую симку только ради телеграма (я устроился на новую работу, а там корпоративная переписка шла в нём).

        Спустя какое-то время первый номер был разбанен (автоматически наверное), и я перенес свой акк на него, довольно вовремя, так как спецсимка уже протухла.


  1. qbtarzan
    27.08.2021 08:45
    +1

    Если я правильно понял, то у вас контент постоянно плавает между страницами, то есть первая страница все время содержит самые свежие сообщения, потом "?page=2" более старые и так далее.

    Таким образом поисковикам невозможно проиндексировать контент один раз и потом слать юзеров на эту страницу, на том же URL завтра будет другой контент.

    Я бы на вашем месте сделал что-то типа permalinks в вордпрессе, чтоб в URL была дата, например, и связки URL-контент оставались стабильными.


  1. shubinm
    21.10.2021 14:31

    добавлю, на всякий случай.

    в десктоп версии телеги есть экспорт чатов, каналов и групп.

    Настройки -> Продвинутые настройки -> Экспорт данных из Telegram

    может поможет не подгружать историю месяцами.


    1. DenisOmg Автор
      21.10.2021 14:35

      Верно, спасибо, это тоже тестировал) Но в экспорте нет самого важного — нет «ответов» чтобы распарсить треды. Тем временем на сайте уже 713к вопросов, против 113к на момент написания статьи))


      1. shubinm
        21.10.2021 14:38
        +1

        понял.

        ответы - в вашем проекте сама суть.

        рад за вашу движуху!