Описание
Используйте этот метод для получения данных для таблиц рекордов. Вернёт счёт указанного пользователя и нескольких его соседей в игре. Возвращает массив объектов 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 - Объект представляет одну запись в таблице рекордов игры, содержащую позицию, пользователя и счёт.