Метод answerWebAppQuery

Метод устанавливает результат взаимодействия с веб-приложением и отправляет соответствующее сообщение от имени пользователя в исходный чат.

Описание

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

Параметр Тип Обязательный Описание
web_app_query_id String Да Уникальный идентификатор запроса, на который нужно ответить
result InlineQueryResult Да JSON-сериализованный объект, описывающий отправляемое сообщение

Примеры

php

<?php

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

// ID веб-приложения, полученный из callback query
$webAppQueryId = 'UNIQUE_QUERY_ID_FROM_WEB_APP';

// Создаем InlineQueryResultArticle как пример результата
$inlineQueryResult = [
    'type' => 'article',
    'id' => uniqid(),
    'title' => 'Результат из веб-приложения',
    'input_message_content' => [
        'message_text' => 'Это сообщение отправлено от имени пользователя через веб-приложение!',
        'parse_mode' => 'HTML'
    ],
    'description' => 'Пример результата взаимодействия с Web App'
];

// Подготавливаем данные для запроса
$postData = [
    'web_app_query_id' => $webAppQueryId,
    'result' => json_encode($inlineQueryResult)
];

// Отправляем запрос к API Telegram
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiUrl . 'answerWebAppQuery');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: multipart/form-data'
]);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if ($response === false) {
    $error = curl_error($ch);
    curl_close($ch);
    throw new Exception("cURL Error: {$error}");
}

curl_close($ch);

// Обрабатываем ответ
$responseData = json_decode($response, true);

if (!$responseData['ok']) {
    throw new Exception("API Error: {$responseData['description']}");
}

// Возвращаем объект SentWebAppMessage
$sentMessage = $responseData['result'];
echo "Сообщение отправлено. ID: " . $sentMessage['inline_message_id'] ?? 'N/A';

// Альтернативный вариант с использованием готовой библиотеки (например, TelegramBotPHP)
class TelegramBot {
    private $token;
    
    public function __construct($token) {
        $this->token = $token;
    }
    
    public function answerWebAppQuery($webAppQueryId, array $inlineQueryResult) {
        $data = [
            'web_app_query_id' => $webAppQueryId,
            'result' => json_encode($inlineQueryResult)
        ];
        
        return $this->apiRequest('answerWebAppQuery', $data);
    }
    
    private function apiRequest($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);
        
        $response = curl_exec($ch);
        curl_close($ch);
        
        return json_decode($response, true);
    }
}

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

// Создаем другой тип результата - фото
$photoResult = [
    'type' => 'photo',
    'id' => uniqid(),
    'photo_url' => 'https://example.com/photo.jpg',
    'thumb_url' => 'https://example.com/thumb.jpg',
    'caption' => 'Фото из веб-приложения',
    'parse_mode' => 'HTML'
];

try {
    $result = $bot->answerWebAppQuery($webAppQueryId, $photoResult);
    
    if ($result['ok']) {
        $sentWebAppMessage = $result['result'];
        // Работаем с результатом
        if (isset($sentWebAppMessage['inline_message_id'])) {
            echo "Inline message ID: " . $sentWebAppMessage['inline_message_id'];
        }
    } else {
        echo "Ошибка: " . $result['description'];
    }
} catch (Exception $e) {
    echo "Ошибка: " . $e->getMessage();
}

?>

python

import requests

def answer_web_app_query(bot_token, web_app_query_id, result):
    """
    Отправляет результат взаимодействия с Web App.
    
    :param bot_token: Токен вашего бота
    :param web_app_query_id: Уникальный идентификатор запроса
    :param result: Объект InlineQueryResult в виде словаря
    :return: Ответ от Telegram API
    """
    url = f"https://api.telegram.org/bot{bot_token}/answerWebAppQuery"
    
    payload = {
        "web_app_query_id": web_app_query_id,
        "result": result
    }
    
    response = requests.post(url, json=payload)
    return response.json()

# Пример использования
if __name__ == "__main__":
    BOT_TOKEN = "YOUR_BOT_TOKEN"
    WEB_APP_QUERY_ID = "unique_query_id_from_web_app"
    
    # Пример InlineQueryResultArticle
    result = {
        "type": "article",
        "id": "1",
        "title": "Пример результата",
        "input_message_content": {
            "message_text": "Это результат из Web App!"
        }
    }
    
    response = answer_web_app_query(BOT_TOKEN, WEB_APP_QUERY_ID, result)
    print(response)

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

  • API 6.0. Добавлен метод answerWebAppQuery

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

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