Решив заняться бессовестным копипастом (а точнее его автоматизацией) постов с чужого Telegram-канала в свой, я первым делом полез в документацию по телеграм-ботам. Но как выяснилось, боты не только не имеют методов для получения сообщений, их просто-напросто нельзя добавить в чужой канал.

Решение нужно было на 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)


  1. SmokeRus
    16.12.2018 00:44
    -2

    Есть возможность оперативно собирать посты с множества каналов? Каково время между постингом в канале и его переплатили к себе? Можно ли старые посты выкачивать как историю?


    1. In4in Автор
      16.12.2018 01:32

      Все в ваших руках — код выше можно натравить на несколько каналов сразу. Скорость операций зависит исключительно от Telegram и вашего соединения


  1. namikiri
    16.12.2018 01:47
    +1

    Делал похожий инструмент, тоже на PHP, назвал его Crawley. Он ловит вызовы от серверов Telegram с постами от каналов. Только он, в отличие от описанного в статье, собирает посты из канала в локальную базу данных и позволяет выводить содержимое каналов на сайтах, да ещё и RSS-фид генерирует. В итоге достаточно вести канал в Телеграме, а на сайте они уже автоматически будут отображены, вне зависимости от доступности канала.


  1. Singrana
    16.12.2018 11:32

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


    1. In4in Автор
      16.12.2018 12:52

      А что посоветуете на питоне? Помимо telebot (он только для ботов)


      1. Singrana
        16.12.2018 13:22

        Я использовал telethon. Очень понравилась: шустро работает, никаких сбоев, функциональна.


    1. mopkob
      16.12.2018 16:33

      У меня опыт был положительный с этой библиотекой. Хотя порог входа — высокий. Два дня потратил. Цель была разработать фреймворк для создания тестовых сценариев для ботов. Чтобы кнопки мог нажимать от имени другого пользователя, вывод ловить (реакцию бота) и т.п. Еще немного усилий и фреймворк был готов.

      Своеобразная логика устройства MadelineProto с лихвой компенсируется подробной документацией и каналом поддержки @pwrtelegramgroup. Там очень дружелюбное сообщество. Много русскоязычного населения.

      Меня приятно удивило стремление автора (Daniil Gentili — итальянец) пропагандировать свой продукт, помогая любому страждущему, появившемуся на канале. Но еще больше я поразился, когда узнал, что он знает русский язык. Задаешь ему вопрос по русски, он отвечает тебе… Правда по английски.

      Хороший, на мой взгляд, продукт. Автор — талантливый и дружелюбный человек.


      1. Singrana
        16.12.2018 16:51

        Я прекратил использование из-за проблем с восстановлением сессии. Делал по примерам -генерируем файл сессии, а другим скриптом используем его, и скажем отправляем себе сообщения. При восстановлении в логах писалось что его редиректит туда сюда, сбои подключения и т.д. Некоторые методы повреждали сессионный файл. По этому провоевав с этим некоторое время, и замучившись восстанавливать сессионные файлы и была опробована питон библиотека. С ней — ни разу не возникло подобных проблем. Посему, мой опыт использования библиотеки крайне печальный


        1. mopkob
          16.12.2018 17:25

          Абсолютно согласен с Вами в том, что устройство любой библиотеки отражает взгляд автора на программирование. Иногда взгляд автора отличается от твоего собственного и ты думаешь: «Что же им двигало, когда он это все выдумывал...».

          Здесь происходит одно из двух. Либо ты перестаешь пытаться и уходишь на другую технологию (и это Ваш случай) либо что-то тебе помогает… В моем случае это был канал @pwrtelegramgroup.

          Задав три вопроса на русском языке и получив три ответа (в течении 30 минут), я оценил что все мои трудности были вызваны тем, что мне были в новинку те подходы, которые применялись при проектировании пакета.

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

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

          Считаю себя больше обогатившимся, чем потерявшим время от использования библиотеки. Хотя была возможность попрактиковаться в Python, если бы не этот канал…


  1. ideological
    16.12.2018 18:07
    -1

    Библиотека ужасна, автор зазнайка 80 уровня, приличного контента в телеграмме нет, один копипаст или дублирование веба за очень редким исключением.


  1. TimsTims
    16.12.2018 20:53

    Юзал несколько раз Madeline, вся боль начинается, когда тебе нужен не только текст, но и картинки и другие аттачи. Самый правильный выход — делать форвард сообщения. И вот если ты форвардишь его в личку или в группу — то там одна команда, а если на канал (канал != группа), то другая. Очень долго ломал голову над этим.


  1. 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 найти


    1. Fesor
      17.12.2018 13:49

      Ну вот будет в php поддержка FFI — можно будет ее заюзать.


      1. Taraflex
        17.12.2018 14:26

        Уже существует php расширение github.com/yaroslavche/phptdlib
        Просто автор про другие языки спрашивал.


      1. Taraflex
        17.12.2018 14:30

        Существенный минус библиотеки — ей требуется 8+ ГБ оперативки для сборки через gcc и примерно 4 через clang и msvc.
        Не на каждом vps пересобрать получиться. А с учетом, что оно зависит от версий системных библиотек, то залить готовый бинарник не всегда выйдет.


        1. Fesor
          17.12.2018 14:50

          ей требуется 8+ ГБ оперативки для сборки

          Так это же сборка, причем тут сама библиотека. Собирайте на CI, дистрибьютте итоговый бинарник.


          А с учетом, что оно зависит от версий системных библиотек

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


  1. Assada
    17.12.2018 12:32

    Недавно тоже работал с этой библиотекой. Пришел к выводу что проще взять github.com/tdlib/td и попробовать прикрутить через FFI для PHP github.com/dstogov/php-ffi