Телеграм бот, inline_keyboard — не отправляет запроса webhook на сервер?
Отправляю запрос, подобный этому, и на сервер ничего не уходит в качестве webhook.
Использую aki/yii2-bot-telegram, но думаю ошибка не в нем. Не могу понять, как правильно отправить inline_keyboard.
при этом keyboard отправляется нормально.
$telegram->sendMessage([ 'chat_id' => $telegram->input->message->chat->id, 'text' => 'Вы находитесь в главном меню', 'reply_markup' => json_encode([ 'inline_keyboard' => [ [ [ 'text' => 'refresh', 'callback_data' => 'LALALALA' ] ], [ [ 'text' => 'LALALALA', 'callback_data' => 'LALALALA' ] ] ], |
$telegram->sendMessage([ 'chat_id' => $telegram->input->message->chat->id, 'text' => 'Вы находитесь в главном меню', 'reply_markup' => json_encode([ 'inline_keyboard' => [ [ [ 'text' => 'refresh', 'callback_data' => 'LALALALA' ] ], [ [ 'text' => 'LALALALA', 'callback_data' => 'LALALALA' ] ] ],
Дополнительно:
На чистом РНР (если закрыть все скобки в этом огрызке кода), все прекрасно отображается и отправляется.
$resp = [ 'chat_id' => $chat_id, 'text' => 'Вы находитесь в главном меню', 'reply_markup' => json_encode([ 'inline_keyboard' => [ [ [ 'text' => 'refresh', 'callback_data' => 'LALALALA' ] ], [ [ 'text' => 'LALALALA', 'callback_data' => 'LALALALA' ] ] ]])]; $url = "https://api.telegram.org/bot$bot_token/sendMessage?".http_build_query($resp); file_get_contents($url); |
$resp = [ 'chat_id' => $chat_id, 'text' => 'Вы находитесь в главном меню', 'reply_markup' => json_encode([ 'inline_keyboard' => [ [ [ 'text' => 'refresh', 'callback_data' => 'LALALALA' ] ], [ [ 'text' => 'LALALALA', 'callback_data' => 'LALALALA' ] ] ]])]; $url = "https://api.telegram.org/bot$bot_token/sendMessage?".http_build_query($resp); file_get_contents($url);
При условии, разумеется, что передается корректный chat_id. Но если будет неправильный chat id, то тогда клавиатура вообще не отобразится, и тогда именно это было бы проблемой, а не вебхук.
Попробуйте сначала сформулировать, с чего вы взяли, что "не отправляет запроса вебхук на сервер".
Но в целом, я предполагаю что главная ваша проблема, конечно же - в отсутствии логирования.
Я не представляю, как вообще люди берутся писать ботов без базового логирования, которое включает
1. Сырой инпут, который пришел на вебхук.
2. Сырой запрос, отправленный в телегу
3. Разумеется, все ошибки РНР.
4. Разное другое отладочное логирование.
-
Попробуйте сначала сформулировать, с чего вы взяли, что "не отправляет запроса вебхук на сервер".
Я записываю в лог запрос каждый.
inline_keyboard - не пишется.
keyboard - пишется.Я не представляю, как вообще люди берутся писать ботов без базового логирования, которое включает
1. Сырой инпут, который пришел на вебхук.
- raw/post/get - записываю.
2. Сырой запрос, отправленный в телегу
Тут не понимаю, ловлю запрос.
3. Разумеется, все ошибки РНР.
Конечно.
4. Разное другое отладочное логирование.Блин, проблема в том, что ''keyboard' отправляет как надо а inline_keyboard - не отправляет. И не могу понять в чем проблема.
- вообще это очень странно.
мне кажется, вы неправильно логируете.
выкиньте этот йибот и сделайте на чистом РНР.$data = file_get_contents('php://input'); error_log($data); $data = json_decode($data, 1); $data = $data['callback_query'] ?? $data; $chat_id = $data['message']['chat']['id']; ... $url = "https://api.telegram.org/bot$bot_token/sendMessage?".http_build_query($resp); error_log($url); file_get_contents($url);
$data = file_get_contents('php://input'); error_log($data); $data = json_decode($data, 1); $data = $data['callback_query'] ?? $data; $chat_id = $data['message']['chat']['id']; ... $url = "https://api.telegram.org/bot$bot_token/sendMessage?".http_build_query($resp); error_log($url); file_get_contents($url);
- Ипатьев, возможно, есть какие то права для активации inline_keyboard?
Повторил ваше предложение - абсолютно подобная ситуация.
'keyboard' - работает и отправляет ссылки, которые делают запрос на сервер
'inline_keyboard' - рисует клавиатуру, но ни одна кнопка не работает, callback_data, разумеется добавлен.Я просто уверен, что на такой мелочи не должно возникать проблем.
- я, к сожалению, без понятия. У меня есть домашний бот для опытов, и насколько я помню, ничего специально для него не активировал
вообще конечно очень странно. было бы понятно если бы обычная клавиатура не работала тоже.понимаю что глупо, но давайте по шагам.
- если отправить заведомо кривой запрос в тг, то логируется ошибка с Bad Request от file_get_contents ?
- вы отвечаете в канал? как сказано здесь: https://stackoverflow.com/questions/72355548/teleg...
- заведите еще одного бота для теста, проверьте на нем
- если на нем все работает, то попробуйте сменить токен, как написано здесь https://stackoverflow.com/questions/62876048/teleg... - - если отправить заведомо кривой запрос в тг, то логируется ошибка с Bad Request от file_get_contents ?
Да, ловлю такие запросы
E Client error: `POST https://api.telegram.org/bo___:AAHLi8od-kdjq5CZpHW...` resulted in a `400 Bad Request` response:
{"ok":false,"error_code":400,"description":"Bad Request: can't parse inline keyboard button: Text buttons are unallowed (truncated...) kjdk.,j- вы отвечаете в канал? как сказано здесь: https://stackoverflow.com/questions/72355548/teleg...
чекну, спасибо.- заведите еще одного бота для теста, проверьте на нем
Полезно, спасибо.- если на нем все работает, то попробуйте сменить токен, как написано здесь
Отпишусь - Я не знаю что в официальном sdk телеги, и этой обертки для yii, но по факту, они где то теряли json_encode
и сервер не получал их.// Send keyboard $url = "https://api.telegram.org/bot$token/sendMessage?{$data}&reply_markup={$keyboard}"; $res = file_get_contents($url);// Send keyboard $url = "https://api.telegram.org/bot$token/sendMessage?{$data}&reply_markup={$keyboard}"; $res = file_get_contents($url);
Пересобрал код через чистый запрос - все работает.
- Собирать квери стринг руками не очень хорошая идея. У НТТР запросов строго определенный формат, и можно налететь потом на ошибки, даже если сейчас все работает.
Лучше делать так, как у показано у меня, с помощью http_build_query() - Ипатьев, да, конечно.
// Create data $data = http_build_query([ 'text' => 'Вы находитесь в главном меню', 'chat_id' => $chatId ]); // Create keyboard $keyboard = json_encode([ 'inline_keyboard' => [ [ ['text' => 'Зарегистрировать номер телефона', 'callback_data' => 'registerPhone'] ], ] ]);// Create data $data = http_build_query([ 'text' => 'Вы находитесь в главном меню', 'chat_id' => $chatId ]); // Create keyboard $keyboard = json_encode([ 'inline_keyboard' => [ [ ['text' => 'Зарегистрировать номер телефона', 'callback_data' => 'registerPhone'] ], ] ]);
- Dmitry Bay, ну так результат json_encode тоже нужно urlencode-ить :)
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для того чтобы телеграм бот с inline_keyboard отправлял запрос webhook на сервер, необходимо убедиться, что вы правильно настроили обработку inline запросов в вашем коде и указали корректный URL для вебхука.
Во-первых, убедитесь, что вы используете метод setWebhook для установки URL вашего сервера в качестве вебхука. Пример кода для этого может выглядеть следующим образом:
$url = 'https://yourdomain.com/telegram_webhook.php'; $response = file_get_contents("https://api.telegram.org/bot/setWebhook?url=$url");
Замените 'https://yourdomain.com/telegram_webhook.php' на реальный URL вашего сервера и на токен вашего бота.
Во-вторых, убедитесь, что ваш сервер правильно обрабатывает входящие запросы от телеграм бота. Пример кода для этого может выглядеть следующим образом:
$update = json_decode(file_get_contents('php://input'), true); if (isset($update['message']['text'])) { // Обработка текстовых сообщений } elseif (isset($update['callback_query'])) { // Обработка inline запросов }
Убедитесь, что ваш сервер может корректно обрабатывать inline запросы и отправлять ответы на них.
Если после всех этих действий ваш телеграм бот все еще не отправляет запрос вебхука на сервер, убедитесь, что ваш сервер доступен извне и не блокируется какими-либо брандмауэрами или настройками безопасности.
Надеюсь, эти советы помогут вам решить проблему с отправкой запросов webhook на сервер для вашего телеграм бота с inline_keyboard. Если у вас остались дополнительные вопросы, не стесняйтесь задавать их.