Почему не работает Location в связке с Inline button?

Ссылка скопирована
PHP
8 марта 2026 1 ответ

Написал две страницы. На первой код, отвечающий за создание клавиатуры, на второй обработчик. Проблема в том, что при нажатии 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

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Стас DB Ответ

Проблема, с которой вы столкнулись, связана с тем, что при использовании 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));

$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 кнопки в связке с перенаправлением пользователя на определенную страницу.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно