@IIIIIIIIIIIIIIII

Почему не работает inline_keyboard в telegram bot'е?

Ультра много времени уже убил, и так его и так и этак, но бот ни в какую не хочет реагировать на нажатие inline_keyboard, точнее на команды callback_data от инлайн клавиатуры. Нашёл даже уже в интернетах очень короткий скрипт от другого человека, как я понял у человека он был полностью рабочий, загружаю себе - всё равно не работает..
Что я уже делал? Много что проверял/перепроверял, правильно ли указывается chat_id и т.д и т.п - всё чётко и правильно указано! Логировал все ответы от telegram в файлик, по моему в telegram отправляется всё правильно, телеграмм даже даёт ответ, что была нажата inline_keyboard, в ответ присылает команду которая была указана в callback_data, но скрипт её тупо не обрабатывает и в итоге команда не срабатывает =(
Чего я только не переделал уже.. Не понимаю в чём дело. Копался в гугле, где то прочитал что в botfather нужно включать обработку inline_keyboard (что вроде как глупость какая то, сколько раз я использовал другого готового tg бота там было много inline клавиатур и к BotFather я ни разу не обращался чтобы там что то переключать), хотя всё равно попробовал по-переключал - 0 толку.

Я думаю проблема возможно как обычно на поверхности, в какой то мелочи но я не могу увидеть/понять в чём конкретно.
Возможно по правильному было бы какую то программулину установить, чтобы более удобнее/точнее мониторить какие запросы уходят/приходят в telegram, чтобы не в слепую всё прощупывать, но пока что в таких программах не разбирался, не знаю как ими пользоваться, в ближайшем будущем наверное придётся разобраться в них..
Думал ботика простецкого сделать, для простой задачи, там буквально весь код пишется за пол часика/часик.... но хочу сделать на инлайн кнопочках, а они ни в какую не хотят работать, в итоге 2 день уже мучаюсь... =(

Бот привязан хуком к домену, и файлы лежат на хостинге. Сейчас прикреплю скрипт который нашёл в интернете, и парень писал что у него он точно работал, у меня же даже он не работает.
Пока дальше роюсь в интернете и пробую разные варианты, решил оставить тут вопрос, чтобы зря время не тратить, возможно кто то уже сталкивался с подобным и сможет помочь сэкономить время.. Заранее спасибо кто поможет, хотя бы просто подскажет какие варианты ещё можно попробовать.

Код для примера который не работает ->
bot.php

<?php
    $access_token = 'xxx';
    $api = 'https://api.telegram.org/bot' . $access_token;
    $output = json_decode(file_get_contents('php://input'), TRUE);

    #логирование ответа от telegram
    file_put_contents('log.txt', '$output: '.print_r($output, 1)."\n", FILE_APPEND);

    $chat_id = $output['message']['chat']['id'];
    $message = $output['message']['text'];
    $callback_query = $output['callback_query'];
    $data = $callback_query['data'];
    $message_id = ['callback_query']['message']['message_id'];
    $chat_id_in = $callback_query['message']['chat']['id'];

    switch($message) {
        case '/test':
        $inline_button1 = ["text" => "Google url", "url" => "http://google.com"];
        $inline_button2 = ["text" => "work plz", "callback_data" => '/plz'];
        $inline_keyboard = [[$inline_button1, $inline_button2]];
        $keyboard = ["inline_keyboard" => $inline_keyboard];
        $replyMarkup = json_encode($keyboard); 
        sendMessage($chat_id, "ok", $replyMarkup);
        break;
    }

    switch($data){
        case '/plz':
        sendMessage($chat_id_in, "plz");
        break;
    }

    function sendMessage($chat_id, $message, $replyMarkup) {
        file_get_contents($GLOBALS['api'] . '/sendMessage?chat_id=' . $chat_id . '&text=' . urlencode($message) . '&reply_markup=' . $replyMarkup);
    }


Лог ответа от telegram ->
log.txt

//Когда пишу команду /test

$output: Array
(
    [update_id] => 801037387
    [message] => Array
        (
            [message_id] => 698
            [from] => Array
                (
                    [id] => 1358111111
                    [is_bot] => 
                    [first_name] => first_name
                    [username] => username
                    [language_code] => ru
                )

            [chat] => Array
                (
                    [id] => 1358111111
                    [first_name] => first_name
                    [username] => username
                    [type] => private
                )

            [date] => 1631124344
            [text] => /test
            [entities] => Array
                (
                    [0] => Array
                        (
                            [offset] => 0
                            [length] => 5
                            [type] => bot_command
                        )

                )

        )

)

//Когда нажимаю inline кнопку

$output: Array
(
    [update_id] => 801037387
    [callback_query] => Array
        (
            [id] => 5831111111111111111
            [from] => Array
                (
                    [id] => 1358111111
                    [is_bot] => 
                    [first_name] => first_name
                    [username] => username
                    [language_code] => ru
                )

            [message] => Array
                (
                    [message_id] => 699
                    [from] => Array
                        (
                            [id] => 1981111111
                            [is_bot] => 1
                            [first_name] => BOT_NAME
                            [username] => bot_username_bot
                        )

                    [chat] => Array
                        (
                            [id] => 1358111111
                            [first_name] => first_name
                            [username] => username
                            [type] => private
                        )

                    [date] => 1631124344
                    [text] => ok
                    [reply_markup] => Array
                        (
                            [inline_keyboard] => Array
                                (
                                    [0] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [text] => Google url
                                                    [url] => http://google.com/
                                                )

                                            [1] => Array
                                                (
                                                    [text] => work plz
                                                    [callback_data] => /plz
                                                )

                                        )

                                )

                        )

                )

            [chat_instance] => 3145335060324141256
            [data] => /plz
        )

)



P.S. Даже вот вручную пробую через браузер отправить запрос боту ->
https://api.telegram.org/bot*TOKEN*/sendMessage?chat_id=*CHAT_ID*&text=MY_MESSAGE&reply_markup={"resize_keyboard":true,"inline_keyboard":[[{"text":"test","callback_data":"\/test"}]]}

Запрос отправляется, бот отображает мне инлайн кнопку, я на неё нажимаю, мне на хостинг в log.txt файлик приходит лог того что телеграмм мне в ответ отправил (такой же как сверху), то-есть он видит что я нажал кнопку, присылает мне данные из callback_data, в моём случае это команда /test, и у меня стоит в скрипте обработчик на эту команду, но он почему то ни в какую не хочет срабатывать на inline клавиатурах. =(
  • Вопрос задан
  • 2796 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Ilya12345
Вот тебе кусок рабочего кода:
Дальше думай сам, обрати внимание на порядок приема входных значений.
<?php
set_time_limit (0);
define('TOKEN', '');
class TG {
    public $token = '';
    public function __construct($token) {
        $this->token = $token; 
    }
    public function send($id, $message, $kb) {
        $data = array(
            'chat_id' => $id,
            'text'  => $message,
            'parse_mode' => 'HTML',
            'disable_web_page_preview'=>true,
            'reply_markup' => json_encode(array('inline_keyboard' => $kb))
        );
        $this->request('sendMessage', $data);
    }  
    public function editMessageText($id, $m_id, $m_text, $kb=''){
        $data=array(
             'chat_id' => $id,
             'message_id' => $m_id,
             'parse_mode' => 'HTML',
             'text' => $m_text
        );
        if($kb)
            $data['reply_markup']=json_encode(array('inline_keyboard' => $kb));

        $this->request('editMessageText', $data); 
    }//редактировать сообщение по id
    public function editMessageReplyMarkup($id, $m_id, $kb){
        $data=array(
             'chat_id' => $id,
             'message_id' => $m_id,
            'reply_markup' => json_encode(array('inline_keyboard' => $kb))
        );
        $this->request('editMessageReplyMarkup', $data); 
    }
    public function answerCallbackQuery($cb_id, $message) {
        $data = array(
            'callback_query_id'      => $cb_id,
            'text'     => $message
        );
        $this->request('answerCallbackQuery', $data);
    } 
    public function sendChatAction($id,$action='typing') {
        $data = array(
            'chat_id' => $id,
            'action'     => $action
        );
        $this->request('sendChatAction', $data);
    }
    public  function request($method, $data = array()) {
        $curl = curl_init();
          
        curl_setopt($curl, CURLOPT_URL, 'https://api.telegram.org/bot' . $this->token .  '/' . $method);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST'); 
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
          
        $out = json_decode(curl_exec($curl), true);
          
        curl_close($curl);
        return $out;
    }
}
$body = file_get_contents('php://input');
$arr = json_decode($body, true); 
$tg = new tg(TOKEN);
$tg_id = $arr['message']['chat']['id'];
$callback_query = $arr['callback_query'];
$data = $callback_query["data"];
$message_text = $arr['message']['text'];
$chatId = $callback_query["message"]["chat"]["id"]; if($chatId!==''){$tg_id = $arr['message']['chat']['id'];}
$rez_kb = array();
switch($data){ 
    case '/downyes':
    sendTelegram('sendMessage', array('chat_id' => $chatId ,'text' => 'получить треклист текстом'));
    exit('ok');
    case '/downno':
    sendTelegram('sendMessage', array('chat_id' => $chatId ,'text' => 'получить трек из поиска'));
    exit('ok');
}   
$tg->sendChatAction($tg_id);
$sms_rev='';
$tg->send($tg_id, $sms_rev, $rez_kb);
function sendTelegram($method, $response){
	$ch = curl_init('https://api.telegram.org/bot' . TOKEN . '/' . $method);  
	curl_setopt($ch, CURLOPT_POST, 1);  
	curl_setopt($ch, CURLOPT_POSTFIELDS, $response);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_HEADER, false);
	$res = curl_exec($ch);
	curl_close($ch);
 
	return $res;
}
if (!empty($data['message']['text'])) {
	$text = $data['message']['text'];

	if (mb_stripos($text, '/download') !== false) {
    $inline = array("text"=>"\xE2\x9C\x85 ДА","callback_data"=>"/downyes");
    $inline1 = array("text"=>"\xF0\x9F\x9A\xAB НЕТ","callback_data"=>"/downno");
    $inline_keyboard = [[$inline,$inline1]];
    $keyboard=array("inline_keyboard"=>$inline_keyboard);
   $replyMarkup = json_encode($keyboard); 
sendTelegram(
			'sendMessage', 
			array(
				'chat_id' => $data['message']['chat']['id'],
				'parse_mode' => 'html',
	       	'reply_markup' =>$replyMarkup,
				'text' => '&#129302; Вы уверены что хотите скачать плейлист?'
)
);
}
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы