Решение нужно было на PHP и следующий час был потрачен на его поиск. Удивительно, как об этом мало информации (хотя нет, не удивительно… кто вообще пишет такое на PHP...). В общем, дорога со StackOverflow привела к MadelineProto. На библиотеку довольно мало ссылок в сети.
Что такое Madeline? Это Telegram-клиент на PHP, предоставляющий методы для работы как от имени пользователя, так и от имени бота. Цель статьи — в первую очередь сократить путь поиска Madeline и привлечь к нему внимание. Также интересно узнать у хабравчан что есть подобное на других ЯП?
Ну и разумеется, опубликовать для примера кусочек кода, который решил мою задачу:
//Подключение Madeline с гитхаба
if (!file_exists(__DIR__ . '/madeline.php')) {
copy('https://phar.madelineproto.xyz/madeline.php', __DIR__ . '/madeline.php');
}
include __DIR__ . '/madeline.php';
$MadelineProto = new \danog\MadelineProto\API('session.madeline');
$MadelineProto->start();
$me = $MadelineProto->get_self();
\danog\MadelineProto\Logger::log($me);
/* Получим историю сообщений */
$messages = $MadelineProto->messages->getHistory([
/* Название канала, без @ */
'peer' => 'chatname',
'offset_id' => 0,
'offset_date' => 0,
'add_offset' => 0,
'limit' => 20,
'max_id' => 9999999,
/* ID сообщения, с которого начинаем поиск */
'min_id' => $lastid,
]);
/* Сообщения, сортировка по дате (новые сверху) */
$messages = $messages['messages'];
foreach(array_reverse($messages) as $i => $message){
/* Шлем сообщение на свой канал */
$MadelineProto->messages->sendMessage([
'peer' => 'mychatname',
'message' => $message['message']
]);
}
UPD от mopkob: У проекта есть активное комьюнити: рускоязычное @pwrtelegramgroupru и интернациональное @pwrtelegramgroup.
Комментарии (17)
namikiri
16.12.2018 01:47+1Делал похожий инструмент, тоже на PHP, назвал его Crawley. Он ловит вызовы от серверов Telegram с постами от каналов. Только он, в отличие от описанного в статье, собирает посты из канала в локальную базу данных и позволяет выводить содержимое каналов на сайтах, да ещё и RSS-фид генерирует. В итоге достаточно вести канал в Телеграме, а на сайте они уже автоматически будут отображены, вне зависимости от доступности канала.
Singrana
16.12.2018 11:32Пробовал данную библиотеку. И вот отказался от нее в пользу библиотек на питоне.Крайне нестабильная библиотек, имхо. Основная проблема — сессии переставали восстанавливаться из файла. И очень долгий и нестабильный коннект. Примеры по приему сообщений тоже не хотели работать. В общем, одно разочарование, имхо
mopkob
16.12.2018 16:33У меня опыт был положительный с этой библиотекой. Хотя порог входа — высокий. Два дня потратил. Цель была разработать фреймворк для создания тестовых сценариев для ботов. Чтобы кнопки мог нажимать от имени другого пользователя, вывод ловить (реакцию бота) и т.п. Еще немного усилий и фреймворк был готов.
Своеобразная логика устройства MadelineProto с лихвой компенсируется подробной документацией и каналом поддержки @pwrtelegramgroup. Там очень дружелюбное сообщество. Много русскоязычного населения.
Меня приятно удивило стремление автора (Daniil Gentili — итальянец) пропагандировать свой продукт, помогая любому страждущему, появившемуся на канале. Но еще больше я поразился, когда узнал, что он знает русский язык. Задаешь ему вопрос по русски, он отвечает тебе… Правда по английски.
Хороший, на мой взгляд, продукт. Автор — талантливый и дружелюбный человек.Singrana
16.12.2018 16:51Я прекратил использование из-за проблем с восстановлением сессии. Делал по примерам -генерируем файл сессии, а другим скриптом используем его, и скажем отправляем себе сообщения. При восстановлении в логах писалось что его редиректит туда сюда, сбои подключения и т.д. Некоторые методы повреждали сессионный файл. По этому провоевав с этим некоторое время, и замучившись восстанавливать сессионные файлы и была опробована питон библиотека. С ней — ни разу не возникло подобных проблем. Посему, мой опыт использования библиотеки крайне печальный
mopkob
16.12.2018 17:25Абсолютно согласен с Вами в том, что устройство любой библиотеки отражает взгляд автора на программирование. Иногда взгляд автора отличается от твоего собственного и ты думаешь: «Что же им двигало, когда он это все выдумывал...».
Здесь происходит одно из двух. Либо ты перестаешь пытаться и уходишь на другую технологию (и это Ваш случай) либо что-то тебе помогает… В моем случае это был канал @pwrtelegramgroup.
Задав три вопроса на русском языке и получив три ответа (в течении 30 минут), я оценил что все мои трудности были вызваны тем, что мне были в новинку те подходы, которые применялись при проектировании пакета.
Вопрос к сессиям у меня тоже был (если я все верно помню он был связан с необычным интерфейсом инициализации), но я как-то быстро преодолел конкретно эту невзгоду.
По итогу всего, задачу я свою решил на этой технологии сильно быстрее чем ожидал и даже был соблазн уйти с традиционного для меня пакета по производству ботов, но что-то меня удержало.
Считаю себя больше обогатившимся, чем потерявшим время от использования библиотеки. Хотя была возможность попрактиковаться в Python, если бы не этот канал…
ideological
16.12.2018 18:07-1Библиотека ужасна, автор зазнайка 80 уровня, приличного контента в телеграмме нет, один копипаст или дублирование веба за очень редким исключением.
TimsTims
16.12.2018 20:53Юзал несколько раз Madeline, вся боль начинается, когда тебе нужен не только текст, но и картинки и другие аттачи. Самый правильный выход — делать форвард сообщения. И вот если ты форвардишь его в личку или в группу — то там одна команда, а если на канал (канал != группа), то другая. Очень долго ломал голову над этим.
Taraflex
17.12.2018 08:41Также интересно узнать у хабравчан что есть подобное на других ЯП?
Оффициальный github.com/tdlib/td из коробки может в с/c++/java/c# и любой другой язык где можно подцепить динамическую библиотеку
Рабочая обертка под node github.com/Bannerets/tdl
Несколько оберток под go
github.com/Arman92/go-tdlib
github.com/zelenin/go-tdlib
github.com/L11R/go-tdjson
Под rust
crates.io/search?q=%20tdlib
Еще кучу всего можно тут github.com/topics/tdlib найтиFesor
17.12.2018 13:49Ну вот будет в php поддержка FFI — можно будет ее заюзать.
Taraflex
17.12.2018 14:26Уже существует php расширение github.com/yaroslavche/phptdlib
Просто автор про другие языки спрашивал.
Taraflex
17.12.2018 14:30Существенный минус библиотеки — ей требуется 8+ ГБ оперативки для сборки через gcc и примерно 4 через clang и msvc.
Не на каждом vps пересобрать получиться. А с учетом, что оно зависит от версий системных библиотек, то залить готовый бинарник не всегда выйдет.Fesor
17.12.2018 14:50ей требуется 8+ ГБ оперативки для сборки
Так это же сборка, причем тут сама библиотека. Собирайте на CI, дистрибьютте итоговый бинарник.
А с учетом, что оно зависит от версий системных библиотек
докер, ансиблы и прочие штуки которые позволят вам иметь одинаковое окружение
Assada
17.12.2018 12:32Недавно тоже работал с этой библиотекой. Пришел к выводу что проще взять github.com/tdlib/td и попробовать прикрутить через FFI для PHP github.com/dstogov/php-ffi
SmokeRus
Есть возможность оперативно собирать посты с множества каналов? Каково время между постингом в канале и его переплатили к себе? Можно ли старые посты выкачивать как историю?
In4in Автор
Все в ваших руках — код выше можно натравить на несколько каналов сразу. Скорость операций зависит исключительно от Telegram и вашего соединения