Комментарии 40
Это было почти фиаско.
Согласен.
Ликование у меня уместно, потому что 3 месяца назад в сети я вообще не нашел никаких примеров, как же, все-таки, парсить каналы telegram. Ну и читать сухие посты без эмоций не так интересно :)
Да, код у меня не самый лучший
Насчет скорости phpQuery тоже не пойму упрека. Сначала я попробовал Ganon, но он оказался в разы, а то и на порядки медленнее (да, в 10 раз). Кроме того phpQuery прекрасно работает не только с html, но и с xml, что очень удобно для парсинга RSS. По цифрам: парсинг крупных страниц, типа пикабу занимает доли секунды, точные цифры не вспомню, но ожидание ответа сервера длится намного дольше, чем сам парсинг. Так же я проверяю изменился ли hash html/xml строки перед тем, как ее парсить и искать дубликаты в базе. И подсчет md5 строки получается не намного быстрее, чем парсинг через phpQuery этой же строки.
Если вы знаете как парсить быстрее и так же удобно (привычный синтаксис селекторов это большой плюс), буду признателен за наводку.
Насчет include phpQuery внутри функции — да, решение не очень оптимальное, но функция находится внутри API, который вызывается часто, поэтому делать include в общем коде тоже не очень хорошо, а phpQuery требуется редко (раз в 5 минут). А если функция не запускается, то и include не срабатывает — это я проверил в документации php. Так что память будет расходоваться только при необходимости. Но все же, соглашусь, что надо этот момент еще раз подумать. Может быть вынести парсинг в отдельное API…
We welcome all developers to use our API and source code to create Telegram-like messaging applications on our platform free of charge. In order to ensure consistency and security across the Telegram ecosystem, all third-party client apps must comply with the following Terms of Service.
It is forbidden to interfere with the basic functionality of Telegram.
Т.е. смысл такой: если пользователь на моем сайте вводит свой логин и пароль от своего телеграма и начинает использовать мой сайт, как клиент телеграма: читать секретные чаты, и его чаты хранятся у меня в базе и не удаляются — то это запрещено. Но пользователь, то не использует мой сайт как клиент телеграма, я не создаю «third-party client apps». Я использую клиент телеграма и свой аккаунт, что бы получать нужные мне данные и делюсь этими общедоступными данными со своими пользователями. Мои пользователи при этом не являются пользователями телеграма.
Так что не вижу никакой разницы с тем же vk api c точки зрения закона. В vk я тоже иногда парсю какой нибудь пост, а его потом удаляют. Но я то у себя его храню (впрочем как и google cache).

Вообще мне с телеграмом работать было очень сложно. Особенно если сравнивать с vk api… Надеюсь что, в будущем, с ростом популярности, они упростят жизнь сторонних разработчиков, но пока что-то все СЛОЖНА, на мой взгляд.
Я видел какой то сервис, где сами владельцы телеграм каналов должны их отправлять на модерацию и потом их канал автоматически конвертируется в блог.
У меня в агрегаторе вывода rss к сожалению нет, я сделал просто ленту новостей из всех выбранных источников, включая любые телеграм каналы. Тоесть по сути у меня онлайн rss читалка, но с большим выбором дополнительных источников данных.
http://proxy.i-c-a.su:9503/?url=breakingmash
Еще можно получить фид в json:
http://proxy.i-c-a.su:9503/?url=breakingmash&format=json
В параметре url можно указывать любые адреса публичных каналов.
Так же сделал на основном сайте отдачу ленты в rss для зарегестрированных пользователей.
З.Ы. Хочу написать пост про то как пользоваться swoole (аналог nodejs на php), но пока не получается время выкроить :(
Я нашел место, где у меня был необрабатываемый exception, но по умолчанию изображения убрал.
Можете включить, добавив параметр `&images=1`:
http://proxy.i-c-a.su/?url=breakingmash&images=1
Я запустил вторую версию сервиса по конвертации телеграм в RSS. Стабильнее, с полностью валидным RSS и полной поддержкой медиафайлов!
Просьба перейти на использование нового парсера: tg.i-c-a.su
http://proxy.i-c-a.su:9503 будет отключен через 1-2 месяца.
Добрый день. А как через Ваш сервис получить userpic телеграм-канала?
Привет. В telegramRSS (это проект который выступает бэкэндом для публичной демки) нет такой возможности. Но идея хорошая. Добавлю в будущем.
Если используете свой инстанс TelegramApiServer или madelineProto, то надо вызвать getPropicInfo для канала/юзера и скачать полученный media через любой downloadTo* метод.
@xtrime Добрый день. Заинтересовало ваше уточнение к посту
[UPDATE 2023-10-08]Важное напоминание: Телеграмм не разрешает парсить аудиторию каналов. Используя серверный клиент можно получить только те данные, которые видны в обычном, оффициальном приложении.
откуда такая информация? не нашёл ничего подобного в интернете. У меня первый опыт парсинга ТГ, задачка заключается в том что бы с определённых групп спарсить текст сообщений и id их авторов. По какой-то причине столкнулся с блокировкой. Я думал что ограничения ТГ не касаются парсинга в принципе!
Под "не разрешает" подразумевается, что Telegram API просто не отдаст информацию об участниках каналов.
Эта проблема вас не касается, так как данные о постах и авторах общедоступны.
Из сообщения не понятно какого рода блокировка имеется ввиду. Могу предположить, что это либо временный FLOOD_WAIT из за большого числа запросов, либо перманентный бан за авторизацию свежезарегестрированного аккаунта в неофициальном клиенте.
В последнем случае нужно следовать инструкции https://docs.madelineproto.xyz/docs/LOGIN.html#getting-permission-to-use-the-telegram-api или использовать живой, старый аккаунт.
я использовал tdata. да и ещё без проксей.. видимо аккаунт бы заспамленный. а вы можете примерно мне сказать какие ограничения на парсинг. то есть насколько я щас понял, за один запрос я могу достать из группы разное кол-во сообщений (это регулируется limmit) - здесь есть какое-то ограничение от телеги? и соответственно есть ограниение по запросам.
я щас сделал так. Запускаю for по списку групп, внутри for использую while True собираю из каждойй группы за один запрос партию в 30 сообщений - пишу их в текстовый файлик. Использую offset_id для того что бы знать на каком сообщение остановилась предыдущая партия. выглядит как то так:
async for message in client.iter_messages(group, limit=30, offset_id=offset_id):
Так же я проверяю что бы у меня парсились сообщения написанные не старше часа:
if message.date < datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(hours=1):
Ну и эту функцию запускаю раз в час.
Другими словами каждый час парсю этот список групп
Ограничения по частоте вызова - персонализированы, т.е. могут отличатся для разных аккаунтов, ip адресов и других факторов. Так же они разные для разных функций.
Например получение информации о новом канале - "дорогая" операция. Можно улететь в бан на несколько часов (FLOOD_WAIT) после нескольких десятков запросов.
Получение постов из канала, который уже есть в кеше клиента - относительно дешевая. По опыту - все нормально работает вплоть до нескольких вызовов в секунду.
Кроме того со временем телеграмм вносит изменения в свою логику.
При превышении лимитов будет возвращаться ошибка FLOOD_WAIT. Нужно прогревать кеш пиров и/или сокращать частоту запросов до тех пор пока не будет работать стабильно.
Так же в madelineProto есть группировка запросов: https://docs.madelineproto.xyz/docs/ASYNC.html#multiple-async , в один сетевой запрос можно упаковать до 100(?) одиночных запросов. Нужно поэкспериментировать, возможно это может отодвинуть лимиты, но точно не могу сказать.
Спасибо! крутая инфа! в моём случае я не так много парсю, не думаю что будут проблемы. я щас взял нормальный акк и прокси, второй день всё ок.. а есть смысл вступить в те группы которые парсю?
для getHistory разницы нет.
Но если надо парсить часто из небольшого количества групп, то имеет смысл перейти на event driven. Подписаться на события через eventHandler: https://docs.madelineproto.xyz/docs/UPDATES.html#async-event-driven
В таком случае нет рисков схватить FLOOD_WAIT и новые сообщения прилетают без задержек. Лимит на количество подписок - 500 групп без премиума и 1000 с премиумом.
у меня нет задачи сделать парсинг интерактивным. я просто забираю раз в час сообщения сообщения из групп и после их обрабатываю. мне кажется реагировать на каждое сообщение это плохая идея.. ведь это отдельный запрос. а так я за один запрос забираю например 30 сообщений из группы.
В EventHandler 0 дополнительных запросов. Сервер телеграмм присылает update пачками.
Этот механизм в любом случае работает в фоне, он необходим для корректной работы клиента.
eventHandler ты имеешь ввиду в формате некой парадигмы? просто ты скинул пример на php а я на python пишу, соответственно ничего не понял. для питона есть библиотека telethon и у неё есть events. по идее работать должно так (ещё не пробовал):
Когда я регистрирую обработчики событий Telethon автоматически подписывается на обновления от Telegram. Эти обновления передаются через открытое соединение, и когда появляется новое сообщение, которое соответствует моим критериям фильтрации (например, сообщение из определенной группы), Telethon вызывает мойобработчик событий. то есть нет отдельных запросов.
Соответственно вопрос, какие в этом случае лимиты?
500 групп без премиума и 1000 с премиумом ? Просто уточняю
Да, в телетоне это называется updates/events: https://docs.telethon.dev/en/stable/concepts/updates.html
Да, без премиума можно вступить в 500 групп. Соответсвенно это и есть лимит.
Есть хаки, что бы подписываться на обновления без вступления, но это отдельная история.
Парсинг постов из telegram каналов на PHP