@Alexxosipov
Fullstack (php + js) developer

Как правильно передать callback в telegram-bot?

Учусь делать Telegram-ботов. Использую библиотеку Telegram-bot-sdk - https://github.com/irazasyed/telegram-bot-sdk

Есть следующий код:
$telegram = new Api('mytoken'); 
    $result = $telegram -> getWebhookUpdates(); 
    $contact = $result['message']['contact'];
    $text = $result["message"]["text"]; 
    $chat_id = $result["message"]["chat"]["id"];    
    $name = $result["message"]["from"]["username"]; 
    $keyboard = Keyboard::make()
    ->inline()
    ->row(
        Keyboard::inlineButton(['text' => 'Show menu', 'callback_data' => '/show_menu']),
        Keyboard::inlineButton(['text' => 'Request price', 'callback_data' => '/requiestprice'])        
    );
    
    $telegram->sendMessage([
        'chat_id' => $chat_id,
        'text' => 'hello9',
        'reply_markup' => $keyboard
    ]);
    
    if ($result->isType('callback_query')) {
        $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => 'Callback found here']);
    }
    else {
        $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => 'Callback is not found here']);
    }

Проблема заключается в том, что при нажатии на inline кнопки "Show menu" и "Request price" ничего не происходит. Конструкция с проверкой на тип $result ($result->isType) ничего не выдает, т.е. попросту нет отправки данных при нажатии на кнопку.
Сейчас все находится в таком состоянии, @kandsflowersbot - этот бот в телеграм.
Скажите, пожалуйста, почему ничего не происходит при нажатии на inlinebuttons?
  • Вопрос задан
  • 10921 просмотр
Пригласить эксперта
Ответы на вопрос 2
@Pechenki
Веб хук установили?
Ответ написан
Комментировать
@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']),


мне так удобнее отличать команду от нажатия на кнопку ) хотя по сути это тоже команда )
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы