Телеграм бот, inline_keyboard — не отправляет запроса webhook на сервер?

Ссылка скопирована
1 ответ

Отправляю запрос, подобный этому, и на сервер ничего не уходит в качестве 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-ить :)
Нужно решить такую задачу?

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

Заказать помощь
Лучший ответ
1
Елена Вебер Ответ

Для того чтобы телеграм бот с 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");

$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 запросов
}

$update = json_decode(file_get_contents('php://input'), true); if (isset($update['message']['text'])) { // Обработка текстовых сообщений } elseif (isset($update['callback_query'])) { // Обработка inline запросов }

Убедитесь, что ваш сервер может корректно обрабатывать inline запросы и отправлять ответы на них.

Если после всех этих действий ваш телеграм бот все еще не отправляет запрос вебхука на сервер, убедитесь, что ваш сервер доступен извне и не блокируется какими-либо брандмауэрами или настройками безопасности.

Надеюсь, эти советы помогут вам решить проблему с отправкой запросов webhook на сервер для вашего телеграм бота с inline_keyboard. Если у вас остались дополнительные вопросы, не стесняйтесь задавать их.

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

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

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

комментарий

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

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