Читаем telegram-каналы в виде новостной ленты (+ бонусом rss)

    UPD: На текущий момент бот не работает, упёрся в лимит каналов на одного юзера (500 каналов).

    В конце статьи есть ссылка на инструкцию, как развернуть себе такого самостоятельно.

    Предпосылки и проблематика

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

    Одно время, когда ВК начал пихать в ленту свои рекомендации (неотключаемые вообще никак), я пользовался адблоком, альтернативными андроид-клиентами (kate mobile), но все эти полумеры напрягали.

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

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

    Идея и реализация

    Так появилась мысль сделать агрегатор телеграм-каналов с фильтрацией по ключевым словам (которые в рекламных постах достаточно часто попадаются).

    Я в курсе про функционал группировки каналов в некоторых клиентах, но по некоторым причинам он мне не подходит:

    • группировка работает только на уровне клиента. Т.е. сгруппированные в мобильном приложении каналы не будут сгруппированы в веб-версии или другом клиенте

    • нельзя (по крайней мере я не нашел) группировать чаты и каналы

    • фильтрация спама и рекламы недоступна

    • я собирался экспортировать агрегированный контент в rss (об этом во второй части статьи)

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

    Что еще капотом:
    • telethon как telegram-клиент

    • asyncio для асинхронности

    • peewee и sqlite3 для хранения инфы кто на что подписался.

    Сами посты из подписок не сохраняются, пересылаются на лету

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

    Нюансы агрегатора

    Процесс установки и использования самой библиотеки я не буду расписывать, в доках все достаточно подробно. Остановлюсь на нескольких технических нюансах, которые всплыли в процессе создания Телегрегатора:

    1. Поскольку меня напрягают висячие непрочитанные сообщения (а так же больше 5-7 вкладок в браузере), я хотел, чтобы агрегатор вместо меня подписывался на каналы и пересылал мне сообщения в специально заведенный для этого чат/канал (я это назвал поток, feed).

    2. Как следствие из п.1, агрегатор должен был самостоятельно подписываться на каналы (в т.ч. закрытые), вступать в группы и чаты. А это значило, что вариант с ботом не подходил, т.к. он пассивен и его может добавить только участник чата или владелец канала. Здесь и пригодилась возможность telethon'а эмулировать клиент. Т.е. telethon-клиент авторизуется с номером телефона и кодом из смс и эмулирует обычного юзера. Может реагировать на сообщения о наборе текста, заходить в каналы, группы, чаты, пересылать сообщения, и всё это в реалтайме. В общем, полноценный пользователь.

    3. Как следствие из п.2, возможности бота (кастомные клавиатуры и команды) оказались мне недоступны (или я не нашел, как клиентом это делать). Если знаете как - напишите в комментах. Так что пришлось велосипедить с обработкой пользовательских команд.

    4. Была идея, что пользователю надо общаться с ботом, а тот уже под капотом передает команды клиенту (подписаться на канал), но это показалось слишком сложным для mvp.

    Как попробовать?

    Сейчас процесс выглядит так:

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

    2. Создаёте новый канал (приватный или публичный), который будет выступать в роли потока (ленты)

    3. Находите через поиск и добавляете в поток пользователя Телегрегатор (@telegregator) и даёте права на публикацию сообщений (через меню администраторов).

    4. Телегрегатор поздоровается и покажет доступные команды.

    5. Отправляете команду /join @имя_канала (из. п.1), после чего Телегрегатор подписывается на нужный канал. Можно указать пачку каналов, через пробел (займет некоторое время, ограничение порядка 50 каналов в минуту).

    6. Можно просто переслать в поток сообщение из любого канала, Телегрегатор сам подпишется на канал.

    7. Все новые сообщения из подписанных каналов Телегрегатор будет прислать в этот поток.

    Потоков может быть несколько. Вы можете добавлять для каждого потока фильтры по стопсловам (это пока тестовая функция, так что если вдруг что-то перестало работать - сбросьте фильтры).

    Ограничения и планы

    Есть несколько ограничений: альбом из фоток, которые пришли в оригинальный канал в одном сообщении, Телегрегатор пересылает отдельными сообщениями. Или репост в поток иногда происходит не мгновенно, а спустя 5-10 секунд. Иногда Телегрегатор падает (рестарт автоматически), и может пропустить какое-то сообщение. Это редко, но случается.

    Видимо, это особенности протокола. Если заметите странное поведение - напишите мне.

    В планах добавить следующий функционал:

    • показать случайный пост из случайного канала

    • топ самых популярных каналов (самых редких, как вариант)

    • предлагает случайный канал

    Я люблю находить годноту в телеге. Порой, в канале всего человек 200, и о нём вообще не узнать, кроме как по рекомендациям друзей.

    Сам пользуюсь Телегрегатором где-то полгода, решил поделиться, вдруг кому-то зайдет. Из своего аккаунта я удалил все подписки, теперь ими рулю через потоки, полет нормальный.

    Исходный код пока грязный, так что публиковать не стал.

    все-так бот или клиент?

    Как я уже писал выше, есть альтернативный способ реализации задуманного мной функционала:
    Я должен взаимодействовать с ботом, отправляя ему команды о создании потока, после чего он сам создает нужный канал, добавляет туда меня, выставляет нужные права. Дальнейшее управление каналом тоже происходит через бота. Если такая схема выглядит удобнее - дайте знать.

    Часть вторая, про RSS

    В процессе работы над Телегрегатором появилась мысль экспортировать это все в RSS-ленту. Я многократно встречал статьи, в т.ч. на Хабре, как автор читает вообще всё через rss, собирая его из разных источников. Кто-то пошел дальше: из rss собирает подборку и формирует ежедневную рассылку на почту. Планирую прийти к такому варианту. Если вы имеете такой опыт - отпишитесь, пожалуйста, в комментах, очень интересна ваша реализация.

    Генераторов rss из соцсетей много, пару примеров:

    • http://feed.exileed.com/

    • https://rsshub.app/telegram/channel/temablog

    Но у них есть недостатки:

    • не умеют читать приватные каналы

    • редко обновляют кеш

    • не отображают вложения (фото, видео, музыку)

    • медленно или нестабильно работают (иногда падают)

    Поэтому, вторым очевидным шагом стало создание моста telegram->rss. По факту, это тот же клиент-Телегрегатор, который по имени канала получает последние сообщения из канала (без подписки) и возвращает в виде rss-ленты. В планах сделать подписку на запрашиваемый канал, тогда можно будет получать ленту и из приватных каналов, но пока так. Отпишитесь, если такой функционал востребован. Проверить можно здесь: http://tg2rss.prosto-tak.ru/.

    По вопросам или замечаниям можете писать сюда в личку, в телегу @parotikov или на nik.parotikov@gmail.com.

    P.S. В "Я пиарюсь" не хватает кармы. Для телеграма вообще нет хаба, странно.

    P.P.S. Вышло продолжение: https://habr.com/ru/post/545580/

    Средняя зарплата в IT

    120 000 ₽/мес.
    Средняя зарплата по всем IT-специализациям на основании 6 277 анкет, за 1-ое пол. 2021 года Узнать свою зарплату
    Реклама
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее

    Комментарии 16

      0

      А я наоборот пытаюсь перевести rss в телеграмм. Когда есть немного rss потоков, которые хочется читать оперативно, а не когда время найдется — это мне кажется лучшим вариантом.

        0

        Откройте для себя Feedly

          0
          Уже несколько лет, как открыл.
          Да, удобно.
          Но телеграмм всегда под рукой. Может просто привычка.
            0

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

              0

              ifttt — 3 года на нём, даже на подписку перешел

            0

            Эта задача тоже решается с помощью библиотеки telethon. Я это вижу так: висит в кроне скрипт, дергающий rss раз в минуту, и все что новее даты последней новости в цикле передает телетону для пересылки в канал. Строчек на 40 кода

            +1
            группировка работает только на уровне клиента.

            А точно ли?
            Не скажу за веб.версию, но у меня папки, созданные в оф. десктопном клиенте, отображаются на оф. мобильном (android).


            Нельзя группировать чаты и каналы

            Может мы о разных группировках говорим, но, опять таки на оф. клиентах, без проблем и личные чаты, и публичные группы, и каналы замечательно "упаковываются" в одну папку.

              +1

              Да, сохраняется на сервере: https://core.telegram.org/api/folders

                0

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

                  0

                  Да, без проблем. Последовательно добавляете в каждую нужную папку.

                0

                Одной из задач, на самом деле, было создание публичного канала с агрегированием в нем информации из других каналов по общей тематике, новостей по конкретной технологии.


                А для личных целей вполне годится штатная группировка в клиенте.

                0
                tg2rss.prosto-tak.ru/channel/techsparks пусто. Надо подождать, пока новый контент появится?
                  0

                  Подскажите лучше поисковик по чатам, а то вступать в 100500 чатов, чтобы искать по ним средствами самого телеграма — такое себе.

                    0

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

                      0
                      Вот у пользователя @telegregator это максимальное число уже достигнуто. На новый поток он уже не может подписаться.
                        +1

                        Да, уже упёрся в это. Так что сорян, и спасибо всем кто потестил, пока все работало. Буду думать, как это обойти. Пока наверное буду готовить код к публикации, чтобы самому можно было для себя развернуть. В таком кейсе 500 каналов вполне хватит

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое