Почему не работает Location в связке с Inline button?
Написал две страницы. На первой код, отвечающий за создание клавиатуры, на второй обработчик. Проблема в том, что при нажатии inline кнопки выполняется любой указанный функционал, но кроме редиректа через Location
Первая страница:
<?php session_start(); include("bot.php"); if (!isset($_GET['r'])) { $messageText = 'Нажмите на кнопку'; $chat_id = '-чат айди'; $botToken = 'Токен бота'; $keyboard = [ 'inline_keyboard' => [ [ ['text' => 'Нажми', 'callback_data' => 'button_clicked'] ] ] ]; $encodedKeyboard = json_encode($keyboard); $url = "https://api.telegram.org/bot$botToken/sendMessage"; $data = [ 'chat_id' => $chat_id, 'text' => $messageText, 'reply_markup' => $encodedKeyboard ]; $ch = curl_init($url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); } ?> <script> setTimeout( 'location="load.php?r";', 5000 ); </script> |
<?php session_start(); include("bot.php"); if (!isset($_GET['r'])) { $messageText = 'Нажмите на кнопку'; $chat_id = '-чат айди'; $botToken = 'Токен бота'; $keyboard = [ 'inline_keyboard' => [ [ ['text' => 'Нажми', 'callback_data' => 'button_clicked'] ] ] ]; $encodedKeyboard = json_encode($keyboard); $url = "https://api.telegram.org/bot$botToken/sendMessage"; $data = [ 'chat_id' => $chat_id, 'text' => $messageText, 'reply_markup' => $encodedKeyboard ]; $ch = curl_init($url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); } ?> <script> setTimeout( 'location="load.php?r";', 5000 ); </script>
Код второй страницы:
<?php $botToken = 'Токен бота'; $update = json_decode(file_get_contents("php://input"), true); if (isset($update['callback_query'])) { $callback_query = $update['callback_query']; $chat_id = $callback_query['message']['chat']['id']; $message_id = $callback_query['message']['message_id']; $data = $callback_query['data']; if ($data == 'button_clicked') { header("Location: tp.php"); exit; } } |
<?php $botToken = 'Токен бота'; $update = json_decode(file_get_contents("php://input"), true); if (isset($update['callback_query'])) { $callback_query = $update['callback_query']; $chat_id = $callback_query['message']['chat']['id']; $message_id = $callback_query['message']['message_id']; $data = $callback_query['data']; if ($data == 'button_clicked') { header("Location: tp.php"); exit; } }
Дополнительно:
Вы поняли, наконец, свою проблему?
Ответы:
А теперь контрольный вопрос: эти PHP файлы исполняются где? В браузере? На сервере? А в браузере тогда что исполняется, при нажатии клавиши на клавиатуре? Аааа, JavaScript исполняется? А как этот JavaScript обращается ко второму файлу? И почему JavaScript должен выполнять переход "Location: tp.php", если он не обязан его выполнять?
- и контрольный вопрос: где тег code, билять?
- Так переход через Location выполняет PHP, причем тут JS?..
- JS есть в скрипте, но он почему-то не отображается в вопросе, хотя в интерфейсе редактирования у меня он есть
- coder_hueder, неправильно!
Подсказка: как именно PHP может ВЫПОЛНИТЬ переход на адрес tp.php? Перечислите используемые для этого механизмы, алгоритмы, действия...
- AUser0, Ну всегда для таких редиректов использовал header("Location: ");. Всегда исправно работало, пока не понадобилось с inline button подружить..
- AUser0, чатгпт ответил, что Header Location не выполняет переход напрямую, а лишь сообщает об этом браузеру.. То есть что-то не так с клиентской частью кода?..
- coder_hueder, чатгптдрайвиндевелопмент детектед.
напиздел тебе твой друг: header location говорит перейти клиенту, а это, внезапно, не всегда браузер. - DevMan, да гпт с ума сходит от таких запросов, поэтому сюда и пришел
- coder_hueder, тебе уже устали объяснять: боты - это вообще не браузерная тема.
она - серверная. - coder_hueder,
То есть что-то не так с клиентской частью кода?
Ну вот, наконец-то начало доходить...
Теперь сталось осознать, что JavaScript (при неизвестно каком обращении ко второму скрипту) не обязан исполнять инструкции из HTTP-заголовка полученного ответа.
https://phpfaq.ru/newbie/na_tanke
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Проблема, с которой вы столкнулись, связана с тем, что при использовании Inline кнопки в Telegram API необходимо учитывать особенности работы с перенаправлением (redirect) через заголовок Location.
Когда вы пытаетесь использовать Location в связке с Inline кнопкой, скорее всего, вы хотите перенаправить пользователя на определенную страницу после нажатия кнопки. Однако, в Telegram API не поддерживается перенаправление с помощью заголовка Location.
Для решения этой проблемы вам необходимо изменить подход к перенаправлению пользователя после нажатия Inline кнопки. Вместо использования заголовка Location, вы можете отправить пользователю сообщение с необходимой информацией или ссылкой на нужную страницу.
Пример использования Inline кнопки с отправкой сообщения:
$chat_id = 'ваш_chat_id'; $message_id = 'id_вашего_сообщения'; $reply_markup = array( 'inline_keyboard' => array( array( array( 'text' => 'Нажми меня', 'url' => 'https://example.com' ) ) ) ); $data = array( 'chat_id' => $chat_id, 'message_id' => $message_id, 'reply_markup' => json_encode($reply_markup) ); $response = file_get_contents("https://api.telegram.org/botваш_токен/editMessageReplyMarkup?" . http_build_query($data));
В этом примере мы используем метод editMessageReplyMarkup для изменения Inline кнопки в уже отправленном сообщении. При нажатии на кнопку пользователь будет перенаправлен на страницу https://example.com.
Таким образом, следуя этому примеру, вы сможете решить проблему с использованием Inline кнопки в связке с перенаправлением пользователя на определенную страницу.