Метод getGameHighScores

Метод возвращает результаты игроков для таблицы рекордов, включая счёт указанного пользователя и его соседей.

Описание

Используйте этот метод для получения данных для таблиц рекордов. Вернёт счёт указанного пользователя и нескольких его соседей в игре. Возвращает массив объектов GameHighScore.

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

Параметр Тип Обязательный Описание
user_id Integer Да Идентификатор целевого пользователя
chat_id Integer Опционально Требуется, если не указан inline_message_id. Уникальный идентификатор целевого чата
message_id Integer Опционально Требуется, если не указан inline_message_id. Идентификатор отправленного сообщения
inline_message_id String Опционально Требуется, если не указаны chat_id и message_id. Идентификатор inline-сообщения

Примеры

php

<?php

// Токен вашего бота
$botToken = 'YOUR_BOT_TOKEN';

// ID пользователя, для которого нужно получить результаты
$userId = 123456789;

// Вариант 1: Получение результатов для сообщения в чате
$chatId = -1001234567890; // ID чата (может быть отрицательным для групп/каналов)
$messageId = 123; // ID сообщения с игрой

// Вариант 2: Получение результатов для inline-сообщения
// $inlineMessageId = '123abc456def'; // ID inline-сообщения

// Формируем URL для API запроса
$apiUrl = "https://api.telegram.org/bot{$botToken}/getGameHighScores";

// Подготавливаем данные для запроса (вариант 1 - через chat_id и message_id)
$postData = [
    'user_id' => $userId,
    'chat_id' => $chatId,
    'message_id' => $messageId,
];

// Альтернативный вариант для inline-сообщений:
// $postData = [
//     'user_id' => $userId,
//     'inline_message_id' => $inlineMessageId,
// ];

// Инициализируем cURL
$ch = curl_init($apiUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: multipart/form-data']);

// Выполняем запрос
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

// Проверяем на ошибки cURL
if (curl_errno($ch)) {
    echo 'cURL Error: ' . curl_error($ch);
    curl_close($ch);
    exit;
}

curl_close($ch);

// Декодируем ответ
$result = json_decode($response, true);

// Проверяем успешность запроса
if ($result['ok'] === true) {
    // Обрабатываем массив объектов GameHighScore
    $highScores = $result['result'];
    
    echo "Таблица рекордов для пользователя {$userId}:\n\n";
    
    foreach ($highScores as $index => $score) {
        $position = $index + 1;
        $playerName = $score['user']['first_name'] . 
                     (isset($score['user']['last_name']) ? ' ' . $score['user']['last_name'] : '');
        $playerId = $score['user']['id'];
        $points = $score['score'];
        
        echo "{$position}. {$playerName} (ID: {$playerId}) - {$points} очков\n";
        
        // Отмечаем целевогопользователя
        if ($playerId == $userId) {
            echo "   ^ Это целевой пользователь\n";
        }
    }
    
    // Пример использования данных
    if (!empty($highScores)) {
        $topScore = $highScores[0]['score'];
        $userPosition = array_search($userId, array_column($highScores, 'user'));
        $userScore = $highScores[$userPosition]['score'];
        
        echo "\nЛучший результат: {$topScore} очков\n";
        echo "Результат пользователя: {$userScore} очков (место #" . ($userPosition + 1) . ")\n";
    }
} else {
    echo "Ошибка при получении результатов: " . $result['description'] . "\n";
    echo "Код ошибки: " . ($result['error_code'] ?? 'неизвестен') . "\n";
}

// Альтернативный вариант с использованием file_get_contents (требует allow_url_fopen)
/*
$context = stream_context_create([
    'http' => [
        'method' => 'POST',
        'header' => 'Content-Type: application/x-www-form-urlencoded',
        'content' => http_build_query($postData)
    ]
]);

$response = file_get_contents($apiUrl, false, $context);
$result = json_decode($response, true);
*/

// Функция для удобного использования в коде бота
function getGameHighScores($botToken, $userId, $chatId = null, $messageId = null, $inlineMessageId = null) {
    $apiUrl = "https://api.telegram.org/bot{$botToken}/getGameHighScores";
    
    $data = ['user_id' => $userId];
    
    if ($inlineMessageId !== null) {
        $data['inline_message_id'] = $inlineMessageId;
    } elseif ($chatId !== null && $messageId !== null) {
        $data['chat_id'] = $chatId;
        $data['message_id'] = $messageId;
    } else {
        throw new Exception('Необходимо указать либо inline_message_id, либо chat_id и message_id');
    }
    
    $ch = curl_init($apiUrl);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => $data,
        CURLOPT_HTTPHEADER => ['Content-Type: multipart/form-data']
    ]);
    
    $response = curl_exec($ch);
    curl_close($ch);
    
    return json_decode($response, true);
}

// Пример использования функции
try {
    $scores = getGameHighScores($botToken, $userId, $chatId, $messageId);
    
    if ($scores['ok']) {
        // Обработка результатов
        foreach ($scores['result'] as $score) {
            // Ваша логика обработки
        }
    }
} catch (Exception $e) {
    echo 'Ошибка: ' . $e->getMessage();
}

?>

python

import requests

def get_game_high_scores(bot_token, user_id, chat_id=None, message_id=None, inline_message_id=None):
    """
    Получает результаты игры для таблицы рекордов.
    
    Args:
        bot_token (str): Токен вашего бота
        user_id (int): ID целевого пользователя
        chat_id (int, optional): ID чата (если не указан inline_message_id)
        message_id (int, optional): ID сообщения (если не указан inline_message_id)
        inline_message_id (str, optional): ID inline-сообщения
        
    Returns:
        list: Список объектов GameHighScore или None при ошибке
    """
    url = f"https://api.telegram.org/bot{bot_token}/getGameHighScores"
    
    # Проверка обязательных параметров
    if not inline_message_id and (chat_id is None or message_id is None):
        raise ValueError("Необходимо указать либо chat_id и message_id, либо inline_message_id")
    
    # Формирование параметров
    params = {"user_id": user_id}
    
    if inline_message_id:
        params["inline_message_id"] = inline_message_id
    else:
        params["chat_id"] = chat_id
        params["message_id"] = message_id
    
    try:
        response = requests.post(url, json=params)
        response.raise_for_status()
        result = response.json()
        
        if result.get("ok"):
            return result.get("result", [])
        else:
            print(f"Ошибка: {result.get('description')}")
            return None
            
    except requests.exceptions.RequestException as e:
        print(f"Ошибка запроса: {e}")
        return None
    except Exception as e:
        print(f"Неожиданная ошибка: {e}")
        return None

# Пример использования:
if __name__ == "__main__":
    # Пример 1: Для сообщения в чате
    BOT_TOKEN = "ВАШ_ТОКЕН_БОТА"
    USER_ID = 123456789
    CHAT_ID = -1001234567890
    MESSAGE_ID = 123
    
    scores = get_game_high_scores(
        bot_token=BOT_TOKEN,
        user_id=USER_ID,
        chat_id=CHAT_ID,
        message_id=MESSAGE_ID
    )
    
    if scores:
        print(f"Найдено {len(scores)} результатов:")
        for score in scores:
            print(f"Пользователь: {score.get('user', {}).get('first_name')}, "
                  f"Очки: {score.get('score')}, "
                  f"Позиция: {score.get('position')}")
    
    # Пример 2: Для inline-сообщения
    INLINE_MESSAGE_ID = "AQAAABCDEFGHIJKLMNOP"
    
    scores_inline = get_game_high_scores(
        bot_token=BOT_TOKEN,
        user_id=USER_ID,
        inline_message_id=INLINE_MESSAGE_ID
    )

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

  • API 2.2.. Добавлен метод getGameHighScores

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

  • GameHighScore - Объект представляет одну запись в таблице рекордов игры, содержащую позицию, пользователя и счёт.
Комментарии