westacks / telebot

Easy way to create Telegram bots in PHP
https://westacks.github.io/telebot/
MIT License
282 stars 44 forks source link

$bot->answerInlineQuery #17

Closed kamuzon closed 3 years ago

kamuzon commented 3 years ago

Hi. I can't send answerInlineQuery I got from Telegram this error: Bad Request: can't parse inline query result: Can't find field "message_text"

Here is the code. What wrong I do? I cant understand.

if ($update->callback_query) {
    $callback_query_id = $update->callback_query->id;
    $results = [[
        'type' => 'article',
        'id' => '001',
        'title' => 'Test',
        'message_text' => 'Text of the first message'
    ]];
    $message = $bot->answerInlineQuery([
        'inline_query_id' => $callback_query_id,
        'results' => $results
    ]);
}

Please help. Thank you.

punyflash commented 3 years ago

Hello! Theare are a bunch of logic mistakes in your code. As I understand you are trying to use inline mode for your bot. Сorrect me if i'm wrong.

The first thing, in your case your update is callback_query which is not related to inline mode:

if ($update->callback_query) {
    // Your code here
}

If you working with inline mode, you should validate inline_query (also I recommend to use immediate return for cleaner syntax):

if (!$update->inline_query) return;

// Your code here

The second thing is answer for the query. Your inline result is article which don't have message_text field. In article type you should send input_message_content object. Your final code should look something like this:

// Validated that update is inline_query
if (!$query = $update->inline_query) return; 

// There may be should be some more validations if your query have some complex logic

$results = [];

$results[] = [
    'type' => 'article',
    'id' => '001',
    'title' => 'Test',
    'input_message_content' => [
        'message_text' => 'Text of the first message'
    ]
];

$message = $bot->answerInlineQuery([
    'inline_query_id' => $query->id,
    'results' => $results
]);

Please make sure that you are fully familiar with the bot api documentation for the functionality you need. This question does not concern the library's operation. I should not help you learning bot api documentation because its free and public to read.

kamuzon commented 3 years ago

I got from telegram json started like that: {"update_id":580720058,"callback_query":{"id":"882510546334388439","from":{"id": So I think this was callback_query.

With input_message_content in results[] I got this error: Forbidden: USER_BOT_INVALID

Thank you for your helping. I will read more about API and manual.

kamuzon commented 3 years ago

Вообще здесь какая-то путаница. Как я делаю. Пользователь мне присылает команду, например /stop. В обработке этого же $update->message я отправляю ему ответ, в котором есть Inline кнопка.

                        $message = $bot->sendMessage([
                            'chat_id' => $chat_id,
                           // 'reply_to_message_id' => $message_id,
                            'parse_mode' => 'HTML',
                            'text' => 'Ты <b>запретил</b> мне писать тебе. Теперь <b>только ты</b> сможешь снова возобновить наше общение. Напиши мне /start, чтобы снова начать.',
                            'reply_markup' => [
                                'inline_keyboard' => [[[
                                    'text' => '/start',
                                    'callback_data' => '/start',
                                ]]]
                            ]
                        ]);

Там имеено inline keyboard https://core.telegram.org/bots/api#inlinekeyboardbutton У кнопки есть параметр callback_data, который работает через CallbackQuery. При нажатии на кнопку, я получаю от телеграма входящий с этим callback_query, с id который int64 и начинается на 88. Но в этом же запросе у меня не получается тут же ему (юзеру) ответить на этот callback_query. В итоге на кнопке недолго крутится индикатор, что что-то происходит, телеграм в течении двух минут 8 раз пытается забрать у меня ответ на callback_query, но ему это не удаётся сделать. И он забивает на конкретно этот callback_query.

В итоге при нажатии пользователем на кнопку ничего не происходит. Хотя я могу не пытаться изменить то изначальное сообщение с inline кнопкой, а просто при получении callback_query запроса слать пользователю следующее сообщение. Можно и так.

Я просто видел других ботов в работе и они как-то иначе "сбрасывают" вращение этого индикатора загрузки. В мануале написано, что можно ответить пустой результат, чтобы у пользователя ничего нигде не высвечивалось, но я пока не догоняю, в чём там дело. Почему-то какой-то разжёванной документации днём с огнём не сыщешь, не понимаю, почему так происходит.

Спасибо тебе за помощь и за библиотеку.

kamuzon commented 3 years ago

Всё. Кажется я разобрался. ;) Ещё раз спасибо тебе огромное за твою помощь и за твою библиотеку.