How to get callback_data from Telegram in PHP
Asked Answered
T

1

6

I want to get callback data from response but array is empty.

I am trying to show in message callback_data array.

Here is my code:

$botToken = "token";
$botAPI = "https://api.telegram.org/bot" . $botToken;
$update = json_decode(file_get_contents('php://input'), TRUE);
$message = $update["message"]["text"]
$chatId = $update["message"]["chat"]["id"];
$callback_query = $update['callback_query'];
$callback_query_data = $callback_query['data'];
$url = $botAPI . '/sendMessage?chat_id=' . $chatId . '&text=';

if(isset($callback_query)){
    file_get_contents($url . $callback_query_data);
}

if($message == "/start"){
    $parameters = array('chat_id' => $chatId, "text" => "Здравствуйте. Выберите язык. \nАссалом. Забонро интихоб кунед.\nHi! Select your language.");
    $parameters["method"] = "sendMessage";
    $keyboard = ['inline_keyboard' => [[
        ['text' => "🇹🇯Точики", 'callback_data' => 'tajik'],
        ['text' =>  "🇷🇺Русский", 'callback_data' => 'russian'],
        ['text' => '🇺🇸English', 'callback_data' => 'english']
    ]]];
    $parameters["reply_markup"] = json_encode($keyboard, true);
    echo json_encode($parameters);
}

Trouper answered 24/3, 2020 at 13:21 Comment(5)
if(isset($callback_query)) makes zero sense the way you are using it. Of course that variable is always set at this point - you yourself did that four lines further up the code.Biafra
if($message == "/start") – what is $message, where is that supposed to magically come from?Biafra
@CBroe I forgot to write. $message = $update["message"]["text"]. So how to print callback_query?Trouper
What do you mean, how to “print it”? If you are not sure whether $update['callback_query'] will be set or not, in the data you receive from the outside - well then you need to check on that, and not something compeltely different.Biafra
@CBroe check on what? $update['callback_query], am I right?Trouper
A
7

There are some small mistakes in the code, I'll try to address them;


Using php://input is only possible with webhooks, did you tell Telegram the location of your script?
https://api.telegram.org/bot<MY-TOKEN>/setWebhook?url=https://example.com/telegram/script.php

$callback_query_data = $callback_query['data']

Is only set if a button is pressed, this should be called after the check if there is some callback data

if (isset($update['callback_query'])) {
    $callback_query_data = $update['callback_query']['data'];
}


Working example:
<?php

    $update = json_decode(file_get_contents('php://input'), TRUE);

    $botToken = "<MY-TOKEN>";
    $botAPI = "https://api.telegram.org/bot" . $botToken;

    // Check if callback is set
    if (isset($update['callback_query'])) {

        // Reply with callback_query data
        $data = http_build_query([
            'text' => 'Selected language: ' . $update['callback_query']['data'],
            'chat_id' => $update['callback_query']['from']['id']
        ]);
        file_get_contents($botAPI . "/sendMessage?{$data}");
    }

    // Check for normal command
    $msg = $update['message']['text'];
    if ($msg === "/start") {

        // Create keyboard
        $data = http_build_query([
            'text' => 'Please select language;',
            'chat_id' => $update['message']['from']['id']
        ]);
        $keyboard = json_encode([
            "inline_keyboard" => [
                [
                    [
                        "text" => "english",
                        "callback_data" => "english"
                    ],
                    [
                        "text" => "russian",
                        "callback_data" => "russian"
                    ]
                ]
            ]
        ]);

        // Send keyboard
        file_get_contents($botAPI . "/sendMessage?{$data}&reply_markup={$keyboard}");
    }

enter image description here

Please let me know if something is not clear!

Amabil answered 24/3, 2020 at 15:30 Comment(3)
Thanks man! It works. I set webhook, that's true. But I copied your code and it works. Thanks a lot.Trouper
Great! Do you also know why it works? You should learn something, not just copy paste haha. Glad it worked ;)Amabil
Yeah, understood. Thanks againTrouper

© 2022 - 2024 — McMap. All rights reserved.