Telegram-клиент на PHP (и получение сообщений с помощью MadelineProto)

    Решив заняться бессовестным копипастом (а точнее его автоматизацией) постов с чужого 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.

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

      –4
      Есть возможность оперативно собирать посты с множества каналов? Каково время между постингом в канале и его переплатили к себе? Можно ли старые посты выкачивать как историю?
        0
        Все в ваших руках — код выше можно натравить на несколько каналов сразу. Скорость операций зависит исключительно от Telegram и вашего соединения
        +3
        Делал похожий инструмент, тоже на PHP, назвал его Crawley. Он ловит вызовы от серверов Telegram с постами от каналов. Только он, в отличие от описанного в статье, собирает посты из канала в локальную базу данных и позволяет выводить содержимое каналов на сайтах, да ещё и RSS-фид генерирует. В итоге достаточно вести канал в Телеграме, а на сайте они уже автоматически будут отображены, вне зависимости от доступности канала.
          0
          Пробовал данную библиотеку. И вот отказался от нее в пользу библиотек на питоне.Крайне нестабильная библиотек, имхо. Основная проблема — сессии переставали восстанавливаться из файла. И очень долгий и нестабильный коннект. Примеры по приему сообщений тоже не хотели работать. В общем, одно разочарование, имхо
            0

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

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

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

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

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

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

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

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

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

                  Считаю себя больше обогатившимся, чем потерявшим время от использования библиотеки. Хотя была возможность попрактиковаться в Python, если бы не этот канал…
              –6
              Библиотека ужасна, автор зазнайка 80 уровня, приличного контента в телеграмме нет, один копипаст или дублирование веба за очень редким исключением.
                0
                Юзал несколько раз Madeline, вся боль начинается, когда тебе нужен не только текст, но и картинки и другие аттачи. Самый правильный выход — делать форвард сообщения. И вот если ты форвардишь его в личку или в группу — то там одна команда, а если на канал (канал != группа), то другая. Очень долго ломал голову над этим.
                  0
                  Также интересно узнать у хабравчан что есть подобное на других ЯП?

                  Оффициальный 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 найти
                    0
                    Ну вот будет в php поддержка FFI — можно будет ее заюзать.
                      0
                      Уже существует php расширение github.com/yaroslavche/phptdlib
                      Просто автор про другие языки спрашивал.
                        0
                        Существенный минус библиотеки — ей требуется 8+ ГБ оперативки для сборки через gcc и примерно 4 через clang и msvc.
                        Не на каждом vps пересобрать получиться. А с учетом, что оно зависит от версий системных библиотек, то залить готовый бинарник не всегда выйдет.
                          –1
                          ей требуется 8+ ГБ оперативки для сборки

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


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

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

                      0
                      Недавно тоже работал с этой библиотекой. Пришел к выводу что проще взять github.com/tdlib/td и попробовать прикрутить через FFI для PHP github.com/dstogov/php-ffi
                        0
                        Спасибо за статью, автору респект. Может кому-то пригодится — мне почему-то не сразу удалось найти как получить последнее сообщение методом getHistory(). Оказалось, нужно просто передать 0 во всех аргументах, кроме 'peer' и 'limit'.

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

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