Callbackquery telegram php пример

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How to run another command from Callbackquery #1241

How to run another command from Callbackquery #1241

Comments

I want, when the user presses the «kembali» button, it will automatically be directed to the Start command. My CallbackqueryCommand.php like this:

getCallbackQuery(); $user_id = $getCallbackQuery->getFrom()->getId(); $getData = $getCallbackQuery->getData(); $mess_id = $getCallbackQuery->getMessage()->getMessageId(); if ($getData == 'kembali') < return $this->getTelegram()->executeCommand('Start'); > //code. > > 

But it doesn’t work, is there any other alternative?

The text was updated successfully, but these errors were encountered:

where should i add the code? in the start command or Callbackquery?

where should i add the code? in the start command or Callbackquery?

Depends which approach you take, the first code would go to StartCommand and if you choose the alternative method it would replace $this->getTelegram()->executeCommand(‘Start’); call.
Edit: fixed the code for from and chat fields.

How does your start command code look like? It has to take into consideration that update object passed to it will be either Message or CallbackQuery so at the top of your StartCommand you need something like this:

if ($message = $this->getMessage()) < $user_id = $message->getFrom()->getId(); > elseif ($callback_query = $this->getCallbackQuery()) < $user_id = $callback_query ->getFrom()->getId(); > 

if you’re using any other variables you have to adjust this code

An alternative approach would be instantiating StartCommand with fake Update object:

(new StartCommand( $this->getTelegram(), new Update([ 'update_id' => -1, 'message' => [ 'message_id' => -1, 'date' => time(), 'from' => $callback_query->getFrom()->getRawData(), 'chat' => $callback_query->getFrom()->getRawData(), 'text' => '/start', ], ]) ))->preExecute(); 

untested code, replaces executeCommand call

I’ve added the code in the start command but it still doesn’t work:

class StartCommand extends SystemCommand < protected $name = 'start'; protected $description = 'Start Command'; protected $usage = '/start'; protected $version = '1.1'; protected $private_only = true; public function execute() < require 'config.php'; $message = $this->getMessage(); $message_id = $message->getMessageId(); $getFirstName = $message->getFrom()->getFirstName(); $getLastName = $message->getFrom()->getLastName(); if ($message = $this->getMessage()) < $user_id = $message->getFrom()->getId(); > elseif ($this->getCallbackQuery()) < $user_id = $this->getCallbackQuery()->getFrom()->getId(); > $data['chat_id'] = $user_id; $data['parse_mode'] = 'markdown'; $data['text'] = 'Hello *' . $getFirstName . ' ' . $getLastName . '*' ; return Request::sendMessage($data); 

Источник

Простой роутер для бота на PHP

Роутер необходим для обработки запроса пользователя в бот. Он позволяет направить данные от Телеграм в нужный метод сценария. Этот пример для приема объектов типа message и callback_query.

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

Для начала посмотрим какие данные приходят от Телеграм

Update от Телеграм не может сразу иметь более одного типа объекта.

Вот пример update при старте бота:

< update_id: 123456789000, message: < message_id: 1, from: < id: 123456, is_bot: false, first_name: '—', last_name: '—', language_code: 'ru' >, chat: < id: 123456, first_name: '—', last_name: '—', type: 'private' >, date: 1666004497, text: '/start', entities: [] > >

Если отправлена команда Start или любое другое текстовое сообщение в том числе и команда от клавиатуры — то это объект Message со свойством text (пример выше).

Если это медиа сообщение, то это также объект Message с соответствующими свойствами:

document — файл любого формата, в том числе и photo, video или audio, но направленные в виде файла без визуализации

В этих объектах нам будет интересны свойства:

message->[text | photo | video | audio | document | video_note | voice | location | sticker | animation]

Если мы работаем с приватным типом chat, то message->chat не всегда пригодиться, только если для проверки типа чата.

message->from — в этом объекте лежат данные пользователя, в частности его Телеграм id, можно еще использовать другие данные объекта, например для приветствия пользователя по его имени.

message->[text | photo | video | audio | document | video_note | voice | location | sticker | animation] — направленные пользователем данные

message->[entities | caption_entities] — форматирование текстового содержания сообщения

При нажатии на inline-кнопку приходит уже другой тип объекта: CallBack_Query

< update_id: 123456789001, callback_query: < id: '00001222', from: < id: 123456, is_bot: false, first_name: '—', last_name: '—', language_code: 'ru' >, message: < message_id: 11, from: < id: 123456, is_bot: false, first_name: '—', last_name: '—', language_code: 'ru' >, chat: < id: 123456, first_name: '—', last_name: '—', type: 'private' >, date: 1665488669, text: 'Текст сообщения', reply_markup: <"inline_keyboard":[[<"text":"Test Button","callback_data":"inline_click">]]> >, chat_instance: '040495084748393', data: 'inline_click' > >

Из этого объекта нам практически всегда потребуются несколько свойств:

ПРИМЕЧАНИЕ. После того, как пользователь нажмет кнопку обратного вызова, клиенты Telegram будут отображать индикатор выполнения, пока вы не вызовете answerCallbackQuery . Следовательно, необходимо отреагировать, вызвав answerCallbackQuery , даже если уведомление пользователю не требуется (например, без указания каких-либо необязательных параметров).

Из документации Телеграм [https://core.telegram.org/bots/api]

callback_query->id — это свойство нам необходимо для уведомления Телеграм через метод answerCallbackQuery.

Когда мы не уведомим Телеграм, что запрос пришел по месту назначения и обработан, то он будет засылать повторно один и тот же запрос (update) в соответсвии со своей политикой.

Также это происходит когда в момент обработки сервер ответил ошибкой.

По моему опыту повторы идут через: 1 сек, 5 сек, 20 сек, 1 мин, 2 мин, 5 мин . и т.д. в течении дня.

Повторные update от Телеграм чреваты! Например если у вас нажатие по кнопке должно быть пополнение баланса на определенную сумму, и если у вас в коде будет ошибка до выполнения уведомления или вообще отсутствие уведомления, то нажав один раз пользователь может не по своей вине пополнять свой баланс «за кадром» в течении дня, он будет рад, но для вас это будет проблемой.

callback_query->from — в этом объекте лежат данные пользователя, в частности его Телеграм id.

callback_query->message->message_id — нам может пригодиться, например для удаления сообщения, чтобы закрепленные inline-кнопки не были доступны для повторного нажатия.

callback_query->data — самое важное свойство, в нем лежат параметры для выполнения задуманной логики

Строим простой роутер на php

Телеграм направляет на установленный webHook POST запрос с update , нам необходимо получить эти данные, так как они в формате JSON, мы может спокойно их перевести или в объект stdClass() или в ассоциативный массив используя функцию json_decode.

Данные мы получим в сыром виде из потока php://input

// получаем данные от телеграм - преобразуем в объект stdClass $data = json_decode(file_get_contents("php://input")); 

Так как $data это объект, то обращаться к его свойствам мы можем используя конструкцию ->

// получим update_id $update_id = $data->update_id;

Проверить существование свойства у объекта можно используя функцию isset()

// проверим существует ли свойство update_id $isSetUpdateId = isset($data->update_id);
// проверим существует ли свойство update_id $isPropertyExists = property_exists($data, "update_id");

Оба варианта вернут bool значение, с разницей при значении у свойства null если оно существует — property_exists() вернет true

$data->update_id = null; return property_exists($data, "update_id"); // true return isset($data->update_id); // false

Теперь с умением проверять наличие свойств у объекта можно смело начинать строить роутер.

/** * Простой роутер бота */ if (isset($data->message)) < // получим id чата $chat_id = $data->message->from->id; // проверим что это текстовое сообщение if (isset($data->message->text)) < // проверим что это старт бота if ($data->message->text == "/start") < // направим запрос в метод старта бота startBot($chat_id); >> elseif(isset($data->message->photo)) < // направим на сохранение photo savePhoto($chat_id, $data->message->photo); > // если это нажатие по кнопке > elseif (isset($data->callback_query)) < // получим id чата $chat_id = $data->callback_query->from->id; // получим callBackQuery_id $cbq_id = $data->callback_query->id; // получим переданное значение в кнопке $c_data = $data->callback_query->data; // спарсим значения $params = explode("_", $c_data); /** В этом месте мы в зависимости от заложенных параметров по принципу param1_param2_param3_param4 и т.д. можем направлять запрос в нужный метод */ if($params[1] === "getPrice") < price($chat_id, $cbq_id, $params); >elseif($params[1] === "getDemo") < demo($chat_id, $cbq_id, $params); >>

Источник

alekssamos / telegram_callback_data_example.php

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

/* https://ru.stackoverflow.com/q/557656 */
/* Теперь понятно, как работает callback-data */
$ access_token = ‘xxx’ ;
$ api = ‘https://api.telegram.org/bot’ . $ access_token ;
$ output = json_decode(file_get_contents( ‘php://input’ ), TRUE );
$ chat_id = $ output [ ‘message’ ][ ‘chat’ ][ ‘id’ ];
$ message = $ output [ ‘message’ ][ ‘text’ ];
$ callback_query = $ output [ ‘callback_query’ ];
$ data = $ callback_query [ ‘data’ ];
$ message_id = [ ‘callback_query’ ][ ‘message’ ][ ‘message_id’ ];
$ chat_id_in = $ callback_query [ ‘message’ ][ ‘chat’ ][ ‘id’ ];
switch ( $ message )
case ‘/test’ :
$ inline_button1 = array (» text «=>» Google url «,» url «=>» http://google.com «);
$ inline_button2 = array (» text «=>» work plz «,» callback_data «=> ‘/plz’ );
$ inline_keyboard = [[ $ inline_button1 , $ inline_button2 ]];
$ keyboard = array (» inline_keyboard «=> $ inline_keyboard );
$ replyMarkup = json_encode( $ keyboard );
sendMessage( $ chat_id , » ok «, $ replyMarkup );
break ;
>
switch ( $ data )
case ‘/plz’ :
sendMessage( $ chat_id_in , » plz «);
break ;
>
function sendMessage ( $ chat_id , $ message , $ replyMarkup )
file_get_contents( $ GLOBALS [ ‘api’ ] . ‘/sendMessage?chat_id=’ . $ chat_id . ‘&text=’ . urlencode( $ message ) . ‘&reply_markup=’ . $ replyMarkup );
>

Долго не мог понять, как работает callback data,теперь благодаря этому ответу понял. Сохранил здесь, чтобы не потерять.

Telegram bot php. Inline keyboard. Подскажите, что делать дальше с callback_data. Что бы после нажатия на кнопку inline keyboard — бот ее обработал
Подскажите, пожалуйста как написать простой сценарий для бота, например:
написал команду «/test»,
бот спрашивает: «Вы уверены?»
пишешь в ответ: «Да»
бот отправляет следующее сообщение по сценарию, если пишешь «нет» — сценарий заканчивается.
Важно, что бы мой ответ «Да» не обрабатывался ботом, пока он не спросит «Вы уверены?»(после команды /test)

You can’t perform that action at this time.

Источник

Читайте также:  Форма обратной связи
Оцените статью