Pull to refresh

Comments 39

Здесь всё великолепно: от ликования про то, что можно работать с Telegram через PHP до инклудинга «очень быстрой» библиотеки phpQuery (особенно про память, которую она сжирает) в функцию.

Это было почти фиаско.


Согласен.
Спасибо за комментарий. Сарказм уважаю, но согласен не со всеми замечаниями :)

Ликование у меня уместно, потому что 3 месяца назад в сети я вообще не нашел никаких примеров, как же, все-таки, парсить каналы telegram. Ну и читать сухие посты без эмоций не так интересно :)

Да, код у меня не самый лучший , но он мой и я его люблю, но пока все работает очень быстро и нагрузка на php и mysql на сервере почти нулевая. На парсинг 100+ источников уходит около минуты, и большая часть этого времени — это ожидание ответов серверов.

Насчет скорости phpQuery тоже не пойму упрека. Сначала я попробовал Ganon, но он оказался в разы, а то и на порядки медленнее (да, в 10 раз). Кроме того phpQuery прекрасно работает не только с html, но и с xml, что очень удобно для парсинга RSS. По цифрам: парсинг крупных страниц, типа пикабу занимает доли секунды, точные цифры не вспомню, но ожидание ответа сервера длится намного дольше, чем сам парсинг. Так же я проверяю изменился ли hash html/xml строки перед тем, как ее парсить и искать дубликаты в базе. И подсчет md5 строки получается не намного быстрее, чем парсинг через phpQuery этой же строки.

Если вы знаете как парсить быстрее и так же удобно (привычный синтаксис селекторов это большой плюс), буду признателен за наводку.

Насчет include phpQuery внутри функции — да, решение не очень оптимальное, но функция находится внутри API, который вызывается часто, поэтому делать include в общем коде тоже не очень хорошо, а phpQuery требуется редко (раз в 5 минут). А если функция не запускается, то и include не срабатывает — это я проверил в документации php. Так что память будет расходоваться только при необходимости. Но все же, соглашусь, что надо этот момент еще раз подумать. Может быть вынести парсинг в отдельное API…
У меня вопрос: правила телеграмм не запрещают хранить сообщения на своём сервере? А удаленные сообщения?
Это же общедоступная информация, которую можно получить просто из браузера даже без аккаунта в телеграме (в статье есть пример ссылки на пост из mash). Это не личная переписка. Так что, думаю, что никакой конфиденциальности я не нарушаю. Да и пользователей пока человек 20-30 от силы, так что проект слишком маленький для разбирательств :)
Я ни в чем не обвиняю, просто я тоже хотел хранить сообщения, а вот тут в п. 1.4. написано:
preventing self-destructing content from disappearing

Вот и думаю, это относится ко всем удаленным сообщениям, либо это касается секретных чатов, которые могут самоуничтожаться?
Мне кажется, что эти правила вообще не касаются парсеров.

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).
Хм, интересно! Но что то по php примеров нет, и ответы на github не воодушевляют…

image

Вообще мне с телеграмом работать было очень сложно. Особенно если сравнивать с vk api… Надеюсь что, в будущем, с ростом популярности, они упростят жизнь сторонних разработчиков, но пока что-то все СЛОЖНА, на мой взгляд.

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

Я видел какой то сервис, где сами владельцы телеграм каналов должны их отправлять на модерацию и потом их канал автоматически конвертируется в блог.

У меня в агрегаторе вывода rss к сожалению нет, я сделал просто ленту новостей из всех выбранных источников, включая любые телеграм каналы. Тоесть по сути у меня онлайн rss читалка, но с большим выбором дополнительных источников данных.
У меня скоро будет можно и не только телеграм (тоже делаю свой аггрегатор)
Конкуренция это круто, может какие идеи свежие подчерпну :) У меня сейчас поддерживаются почти все популярные соц сети и экспорт в rss недавно сделал. Но в процессе эксплуатации выявились некоторые шероховатости, надо над архитектурой поработать.
А каким образом instagram подключили? Парсите веб-версию? Они вроде никому не дают апи для выгрузки постов
Совершенно верно, api дают только с боем. Парсю json из вэб версии :)
Сделал быстрый многопоточный парсер телеграма на swoole, который еще и ссылки на картинки из вэбпревью постов подтягивает.

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), но пока не получается время выкроить :(
К сожалению, тот же feedly не смог переварить такую ссылку на rss. А, зарегистрировавшись, не смог найти найти, как получить ленту в rss.
Спасибо за отклик!

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

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

Ссылка на персональный rss находится в самом низу страницы «Источники».
Есть код в открытом доступе?
К сожалению нет. Но всеравно потребуется настройка своих ключей. Просто скачать готовый файл и залить на сервер не выйдет.
Вы сделали классный инструмент, но в RSS не смог найти ссылку на картинки… Что очень на самом деле важно.
Ссылки раньше были включены по умолчанию, но с ними возникали проблемы: если t.me переставал отвечать на запросы (soft ban), то скрипт падал целиком.

Я нашел место, где у меня был необрабатываемый 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* метод.

UFO just landed and posted this here
Думал, что кто-то другой сможет ответить на ваш вопрос, но видимо никто не знает, что такое скриптинг, как и я. Можете пояснить?

@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 групп. Соответсвенно это и есть лимит.
Есть хаки, что бы подписываться на обновления без вступления, но это отдельная история.

спасибо тебе добрый человек. а то я здесь камнем искры высекаю...

Sign up to leave a comment.

Articles