{"id":14279,"url":"\/distributions\/14279\/click?bit=1&hash=4408d97a995353c62a7353088166cda4ded361bf29df096e086ea0bbb9c1b2fc","title":"\u0427\u0442\u043e \u0432\u044b\u0431\u0435\u0440\u0435\u0442\u0435: \u0432\u044b\u0435\u0445\u0430\u0442\u044c \u043f\u043e\u0437\u0436\u0435 \u0438\u043b\u0438 \u0437\u0430\u0435\u0445\u0430\u0442\u044c \u0440\u0430\u043d\u044c\u0448\u0435?","buttonText":"","imageUuid":""}

Я сделал 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
Автор

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

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

И по этому поводу было огромное количество судов в самых разных странах с самыми разными результатами. Поисковики показывают только небольшой сниппет именно чтобы попадать под fair use (и у них есть полный opt-out). Вы же тупо копируете себе все, ещё и рекламу планируете вешать. С тем же успехом можете просто сделать варезник, ведь в интернете много чего лежит, значит ничье.

Ответить
Развернуть ветку
Vladimir Vorobyev

Нет, не тупо, автором описаны принципы сбора информации. Раз поддержка телеграма разрешила сбор информации, значит, всё ок. Не нравится - подавайте в суд на телеграм за API. С варезниками некорректно сравнивать, трудозатраты на комментарий и на софт не соизмеримы. 

Ответить
Развернуть ветку
Masha Kovalyova
 Раз поддержка телеграма разрешила сбор информации, значит, всё ок

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

 С варезниками некорректно сравнивать, трудозатраты на комментарий и на софт не соизмеримы.

Авторское право не имеет никакой связи с трудозатратами. Если вы на телефон свотографируете прыщ на своём теле, с точки зрения авторского права эта фотография будет защищена точно так же, как какой-нибудь Фотошоп.

Ответить
Развернуть ветку
Vladimir Vorobyev

Вот кстати вы меня процитировали - зачем вы нарушили моё авторское право?

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

Если вы на телефон свотографируете прыщ на своём теле

Уважаю ваше авторское право!

Авторское право не имеет никакой связи с трудозатратами

Конкретные судьи это вполне могут учесть , как одну из метрик при принятии решения. Иначе работа судов будет парализована из-за каждого тега [quote][/quote] в интернете.

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

И тут вам нужно прочитать про концепт fair use в США или ст 1274 и соседние ГК РФ. Брать все целиком - не ок, цитировать в разумном объеме - ок (и этим занимаются, в том числе, поисковики)

Ответить
Развернуть ветку
Vladimir Vorobyev

Целиком и не берётся. Определите "целиком" сначала? Пример с Кинодансом напомнить?

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

Комментарий удален модератором

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

Статья 29.4 (Конституции РФ) Каждый имеет право свободно искать, получать, передавать, производить и распространять информацию любым законным способом. Перечень сведений, составляющих государственную тайну, определяется федеральным законом.

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

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

Конституцию вы хорошо процитировали, главным словом там является «распространять любым __законным__ способом». Дальше, увы, начался какой-то совершенный бред.

Ответить
Развернуть ветку
Dmitriy Zakharchenko

Обратитесь в суд, так чисто - посмеяться потом, что вам скажут. Я был в судах по защите чести и достоинства, деловой репутации. И как раз по теме комментов в соц. сетях. У судей иное мнение.

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