Метод answerInlineQuery

Метод для отправки ответов на инлайн-запрос с ограничением в 50 результатов.

Описание

Используйте этот метод для отправки ответов на инлайн-запрос. При успешном выполнении возвращается True.
Разрешено не более 50 результатов на запрос.

Параметр Тип Обязательный Описание
inline_query_id String Да Уникальный идентификатор отвечаемого запроса
results Массив InlineQueryResult Да Массив результатов для инлайн-запроса в формате JSON
cache_time Integer Опционально Максимальное время в секундах, в течение которого результат инлайн-запроса может кэшироваться на сервере. По умолчанию 300.
is_personal Boolean Опционально Передайте True, если результаты могут кэшироваться на стороне сервера только для пользователя, отправившего запрос. По умолчанию результаты могут возвращаться любому пользователю, отправившему тот же запрос.
next_offset String Опционально Передайте смещение, которое клиент должен отправить в следующем запросе с тем же текстом для получения дополнительных результатов. Передайте пустую строку, если больше нет результатов или если вы не поддерживаете постраничную навигацию. Длина смещения не может превышать 64 байта.
button InlineQueryResultsButton Опционально Объект в формате JSON, описывающий кнопку, которая будет показана над результатами инлайн-запроса

Примеры

php

<?php

$botToken = 'YOUR_BOT_TOKEN';
$apiUrl = "https://api.telegram.org/bot{$botToken}/";

// Пример обработки inline-запроса
$update = json_decode(file_get_contents('php://input'), true);

if (isset($update['inline_query'])) {
    $inlineQueryId = $update['inline_query']['id'];
    $query = $update['inline_query']['query'];
    
    // Создаем массив результатов
    $results = [
        [
            'type' => 'article',
            'id' => '1',
            'title' => 'Результат 1',
            'input_message_content' => [
                'message_text' => 'Это результат 1 для запроса: ' . $query
            ],
            'description' => 'Описание результата 1'
        ],
        [
            'type' => 'article',
            'id' => '2',
            'title' => 'Результат 2',
            'input_message_content' => [
                'message_text' => 'Это результат 2 для запроса: ' . $query
            ],
            'description' => 'Описание результата 2'
        ]
    ];
    
    // Параметры для answerInlineQuery
    $params = [
        'inline_query_id' => $inlineQueryId,
        'results' => json_encode($results),
        'cache_time' => 300,
        'is_personal' => false,
        'next_offset' => '',
        'button' => json_encode([
            'text' => 'Больше результатов',
            'web_app' => ['url' => 'https://example.com']
        ])
    ];
    
    // Отправка запроса
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $apiUrl . 'answerInlineQuery');
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
    $response = curl_exec($ch);
    curl_close($ch);
    
    // Обработка ответа
    $responseData = json_decode($response, true);
    if ($responseData['ok']) {
        // Успешный ответ
        error_log('Inline query answered successfully');
    } else {
        error_log('Error: ' . $responseData['description']);
    }
}

// Альтернативный вариант с использованием готовой библиотеки (пример)
class TelegramBot {
    private $token;
    
    public function __construct($token) {
        $this->token = $token;
    }
    
    public function answerInlineQuery($inlineQueryId, $results, $options = []) {
        $defaultOptions = [
            'cache_time' => 300,
            'is_personal' => false,
            'next_offset' => '',
            'button' => null
        ];
        
        $options = array_merge($defaultOptions, $options);
        
        $data = [
            'inline_query_id' => $inlineQueryId,
            'results' => json_encode($results)
        ];
        
        if ($options['cache_time'] !== null) {
            $data['cache_time'] = $options['cache_time'];
        }
        
        if ($options['is_personal'] !== null) {
            $data['is_personal'] = $options['is_personal'];
        }
        
        if ($options['next_offset'] !== null) {
            $data['next_offset'] = $options['next_offset'];
        }
        
        if ($options['button'] !== null) {
            $data['button'] = json_encode($options['button']);
        }
        
        return $this->sendRequest('answerInlineQuery', $data);
    }
    
    private function sendRequest($method, $data) {
        $url = "https://api.telegram.org/bot{$this->token}/{$method}";
        
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: multipart/form-data']);
        
        $response = curl_exec($ch);
        curl_close($ch);
        
        return json_decode($response, true);
    }
}

// Пример использования класса
$bot = new TelegramBot('YOUR_BOT_TOKEN');

// Создание результатов разных типов
$inlineResults = [
    [
        'type' => 'photo',
        'id' => 'photo_1',
        'photo_url' => 'https://example.com/photo1.jpg',
        'thumb_url' => 'https://example.com/thumb1.jpg',
        'title' => 'Фото 1'
    ],
    [
        'type' => 'video',
        'id' => 'video_1',
        'video_url' => 'https://example.com/video1.mp4',
        'mime_type' => 'video/mp4',
        'thumb_url' => 'https://example.com/thumb_video1.jpg',
        'title' => 'Видео 1'
    ]
];

// Кнопка для результатов
$button = [
    'text' => 'Открыть веб-приложение',
    'web_app' => [
        'url' => 'https://example.com/webapp'
    ]
];

// Отправка ответа
$response = $bot->answerInlineQuery(
    '123456789', // inline_query_id
    $inlineResults,
    [
        'cache_time' => 600,
        'is_personal' => true,
        'next_offset' => '2',
        'button' => $button
    ]
);

if ($response['ok']) {
    echo "Ответ на inline-запрос успешно отправлен";
} else {
    echo "Ошибка: " . $response['description'];
}

?>

python

import json
from telegram import InlineQueryResultArticle, InputTextMessageContent
from telegram.ext import Application, InlineQueryHandler

async def inline_query_handler(update, context):
    query = update.inline_query.query
    
    # Создаем результаты для inline-запроса
    results = [
        InlineQueryResultArticle(
            id='1',
            title="Пример результата 1",
            input_message_content=InputTextMessageContent(
                message_text="Это результат 1 для запроса: " + query
            ),
            description="Описание результата 1"
        ),
        InlineQueryResultArticle(
            id='2',
            title="Пример результата 2",
            input_message_content=InputTextMessageContent(
                message_text="Это результат 2 для запроса: " + query
            ),
            description="Описание результата 2"
        )
    ]
    
    # Используем метод answerInlineQuery
    await update.inline_query.answer(
        results=results,
        cache_time=300,
        is_personal=False,
        next_offset='',
        button=None
    )

# Инициализация бота
application = Application.builder().token("YOUR_BOT_TOKEN").build()
application.add_handler(InlineQueryHandler(inline_query_handler))

История изменений

  • API 2.0. Обновлен метод answerInlineQuery: Добавлены параметры switch_pm_text и switch_pm_parameter
  • API 6.7. Обновлен метод answerInlineQuery: Параметры switch_pm_text и switch_pm_parameter заменены на параметр button типа InlineQueryResultsButton

Дополнительно

  • InlineQueryResult - Этот объект представляет один результат inline-запроса и может быть одного из 20 поддерживаемых типов, таких как аудио, фото, видео, документы и другие медиаформаты.
  • InlineQueryResultsButton - Объект, представляющий кнопку над результатами инлайн-запроса, которая может запускать веб-приложение или передавать стартовый параметр боту.
Комментарии