Ответы пользователя по тегу Telegram
  • Как транслировать посты из Telegram в Wordpress?

    @easycode
    не боюсь задавать глупые вопросы ))
    Комментировать
  • Вызов команд Телеграм-бота при сканировании QR-кодов?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Наверное единственный работающий вариант это https://core.telegram.org/bots#deep-linking
    Ответ написан
    Комментировать
  • Как после нажатия кнопок в сообщении от Telegram-Bot'а скрыть их?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Разобрался и вот небольшой примерчик (вырезка):

    $telegram = new Telegram\Bot\Api('XXXXXXXXXXXXXXXXXXXX');
    $update = $this->telegram->getWebhookUpdates();
    $update = json_decode($this->update, true);
    
    $keyboard = Keyboard::make()->inline()->row(Keyboard::inlineButton(['text' => 'One more?','callback_data' => '/random']));
    
    $telegram->editMessageText([
        'chat_id' => $update['callback_query']['message']['chat']['id'],
        'message_id' => $update['callback_query']['message']['message_id'],
        'text' => 'Ответочка',
        'reply_markup' => $keyboard,
        'parse_mode' => 'markdown',
    ]);
    Ответ написан
    Комментировать
  • Как правильно передать callback в telegram-bot?

    @easycode
    не боюсь задавать глупые вопросы ))
    Понимаю, что уже не актуально, но вот совсем недавно нужно было писать еще одного бота на этой же библиотеке. Я воспользовался своим старым "скелетом":

    require_once( dirname(__FILE__) . '/vendor/autoload.php');
    
    use Telegram\Bot\Commands\Command;
    use Telegram\Bot\Keyboard\Keyboard;
    
    class TelegaBot {
    
        public $chat = array();
    
        public $chat_id;
    
        public $message;
    
        public $telegram;
    
        public $lastCommand = '';
    
        public $text;
    
        public $reply;
        
        public $keyboard = array();
    
    function __construct()
        {
    $this->telegram = new Telegram\Bot\Api('XXXXXXXXXXXXXXXXXXXXX');
    
    $this->update = $this->telegram->getWebhookUpdates();
    
    if ( isset($this->update['callback_query'])) {
        $this->message = $this->update['callback_query'];
    } else {
        $this->message = $this->update;
    }
    
    $this->chat_id = $this->message['message']['chat']['id'];
    
    $this->text = $this->message["message"]["text"];
    
    if ($this->chat_id) {
    
        $this->chat['username'] = $this->message['message']['from']['username'];
        $this->chat['name'] = $this->message['message']['from']['first_name'];
    
        // если передается команда, то запоминаем её
        if ( preg_match('|/([a-z0-9_]{3,})|is', $this->text, $buff) and trim($buff[1]) != '') {
            $this->lastCommand = $buff[1];
        }
    
        // ловин нажатие по кнопке:
        if (isset($this->update['callback_query'])) {
            if ($this->message['data']) {
                $this->lastCommand = $this->message['data'];
            }
        }
    }
    
    if ($this->lastCommand) {
        $method = 'cmd_' . $this->lastCommand;
        if (method_exists('TGBot', $method)) {
            call_user_func(array($this, $method));       
        } else {
            $this->reply = "Что-то не припомню такой команды :=)\n\nПожалуйста, пользуйтесь кнопками в моих сообщениях или если вдруг чувствуете, что я начал подглюкивать сообщите об этом моему разработчику...";
        }
    }
    
    
    private function cmd_start()
    {
        $this->keyboard = [
            [
                Keyboard::inlineButton(['text' => 'Кнопка 1', 'callback_data' => 'button1']),
                Keyboard::inlineButton(['text' => 'Кнопка 2', 'callback_data' => 'button2'])
            ]
        ];
        return $this->sendMessage();
    
    }
    
    public function cmd_button1()
    {
        // функционал реакции бота на нажатия кнопки 1
    }
    
    
    public function sendMessage()
    {
        $data = array(
            'chat_id' => chat_id,
            'text' => $this->reply,
        );
        if (count($this->keyboard) and is_array($this->keyboard)) {
            $data['reply_markup'] = $this->telegram->replyKeyboardMarkup([ 
                'inline_keyboard' => $this->keyboard, 
                'resize_keyboard' => true, 
                'one_time_keyboard' => true, 
            ]);
        }
    
        $this->telegram->sendMessage($data);
    }


    весь код класса не привожу, но самое главное что в callback_query я не пишу слэши перед командами если заметили:
    Keyboard::inlineButton(['text' => 'Кнопка 1', 'callback_data' => 'button1']),


    мне так удобнее отличать команду от нажатия на кнопку ) хотя по сути это тоже команда )
    Ответ написан
    Комментировать
  • Как обработать нажатие на кнопку клавиатуры бота, созданном на Telegram Bot API - PHP SDK?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Как я понял в версии 2.2 этой библиотеки можно использовать только обычные текстовые кнопки без callback_data - для передачи которого нужно использовать inline кнопки.

    1) Нужно обновится до dev-версии, если через composer то вот так:
    composer require irazasyed/telegram-bot-sdk:dev-master

    2) Далее код несколько меняется:
    <?php
    
    use Telegram\Bot\Commands\Command;
    use Telegram\Bot\Keyboard\Keyboard;
    
    $telegram = new Telegram\Bot\Api('MY_KEY'); 
            
    $update = $telegram->getWebhookUpdates();
    
    // данные сообщения в зависимости от callback_query
    if ( isset($this->update['callback_query'])) {
        $message = $update['callback_query'];
    } else {
        $message = $update;
    }
    
    $chatId = $message['message']['chat']['id'];
    
    // правильно формируем клавиатуру:
    $keyboard = [
        [
            Keyboard::inlineButton(['callback_data'=>'/butt1','text'=>'Кнопка 1']),
            Keyboard::inlineButton(['callback_data'=>'/buut2','text'=>'Кнопка 2'])
        ]
    ];
    
    $reply_markup = $telegram->replyKeyboardMarkup([ 
        // 'keyboard' => $keyboard, // вместо этого используем:
        'inline_keyboard' => $keyboard,
        'resize_keyboard' => true, 
        'one_time_keyboard' => false 
    ]);
    
    
    // если нажали кнопку:
    if ( isset($this->update['callback_query'])) {
    	$telegram->sendMessage(array(
    	  'chat_id' => $chatId,
    	    'text' => "Вы нажали на кнопку с кодом: " . $message['data'], // именно в $message['data'] - будет то что прописано у нажатой кнопки в качестве callback_data
    	    'reply_markup' => $reply_markup,
    	));
    } else {
    	$telegram->sendMessage(array(
    	  'chat_id' => $chatId,
    	    'text' => 'Нажмите на одну из кнопок:',
    	    'reply_markup' => $reply_markup,
    	));
    }


    Может кому-нибудь еще пригодится )
    Ответ написан
    Комментировать