Описание
Используйте этот метод для получения входящих обновлений с помощью длинного опроса (wiki). Возвращает массив объектов Update.
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
| offset | Integer | Необязательный | Идентификатор первого возвращаемого обновления. Должен быть на единицу больше наибольшего идентификатора среди ранее полученных обновлений. По умолчанию возвращаются обновления, начиная с самого раннего неподтверждённого. Обновление считается подтверждённым, как только вызывается getUpdates с offset, превышающим его update_id. Можно указать отрицательный offset для получения обновлений, начиная с -offset обновления с конца очереди. Все предыдущие обновления будут забыты. |
| limit | Integer | Необязательный | Ограничивает количество получаемых обновлений. Допустимы значения от 1 до 100. По умолчанию 100. |
| timeout | Integer | Необязательный | Таймаут в секундах для длинного опроса. По умолчанию 0, то есть обычный короткий опрос. Должен быть положительным, короткий опрос следует использовать только в тестовых целях. |
| allowed_updates | Array of String | Необязательный | JSON-сериализованный список типов обновлений, которые должен получать ваш бот. Например, укажите ["message", "edited_channel_post", "callback_query"] для получения только этих типов обновлений. Полный список доступных типов смотрите в Update. Укажите пустой список, чтобы получать все типы обновлений, кроме chat_member, message_reaction и message_reaction_count (по умолчанию). Если не указано, будет использована предыдущая настройка.Обратите внимание, что этот параметр не влияет на обновления, созданные до вызова getUpdates, поэтому в течение короткого времени могут приходить нежелательные обновления. |
Примечания
1. Этот метод не будет работать, если настроен исходящий вебхук.
2. Чтобы избежать получения дублирующих обновлений, пересчитывайте offset после каждого ответа сервера.
Примеры
php
<?php
$botToken = 'YOUR_BOT_TOKEN';
$apiUrl = "https://api.telegram.org/bot{$botToken}/";
// Параметры для getUpdates
$params = [
'offset' => 0, // Идентификатор первого обновления
'limit' => 10, // Максимум 10 обновлений за раз
'timeout' => 30, // Долгий опрос на 30 секунд
'allowed_updates' => json_encode(['message', 'callback_query']) // Только сообщения и callback-запросы
];
// Функция для отправки запроса к API Telegram
function sendRequest($method, $params = []) {
global $apiUrl;
$url = $apiUrl . $method;
if (!empty($params)) {
$url .= '?' . http_build_query($params);
}
$response = file_get_contents($url);
if ($response === false) {
return ['ok' => false, 'error' => 'Failed to get response'];
}
return json_decode($response, true);
}
// Пример 1: Получение обновлений с базовыми параметрами
function getUpdatesBasic() {
$result = sendRequest('getUpdates');
if ($result['ok']) {
$updates = $result['result'];
if (empty($updates)) {
echo "Нет новых обновлений.\n";
return 0;
}
foreach ($updates as $update) {
echo "Update ID: " . $update['update_id'] . "\n";
if (isset($update['message'])) {
echo "Message from: " . $update['message']['from']['username'] . "\n";
echo "Text: " . ($update['message']['text'] ?? 'Нет текста') . "\n";
}
if (isset($update['callback_query'])) {
echo "Callback query from: " . $update['callback_query']['from']['username'] . "\n";
echo "Data: " . $update['callback_query']['data'] . "\n";
}
echo "---\n";
}
// Возвращаем ID последнего обновления + 1 для следующего запроса
return $updates[count($updates) - 1]['update_id'] + 1;
}
return 0;
}
// Пример 2: Долгий опрос с обработкой смещения
function longPollingWithOffset() {
$offset = 0;
while (true) {
$params = [
'offset' => $offset,
'timeout' => 60,
'allowed_updates' => json_encode(['message'])
];
$result = sendRequest('getUpdates', $params);
if ($result['ok'] && !empty($result['result'])) {
$updates = $result['result'];
foreach ($updates as $update) {
echo "[" . date('Y-m-d H:i:s') . "] ";
echo "Получено обновление #" . $update['update_id'];
if (isset($update['message']['text'])) {
echo " - Сообщение: " . $update['message']['text'];
}
echo "\n";
// Обновляем offset
$offset = $update['update_id'] + 1;
}
} elseif (!$result['ok']) {
echo "Ошибка: " . ($result['description'] ?? 'Неизвестная ошибка') . "\n";
sleep(5); // Пауза при ошибке
}
}
}
// Пример 3: Получение только определенных типов обновлений
function getSpecificUpdates() {
$params = [
'limit' => 5,
'allowed_updates' => json_encode([
'message',
'edited_message',
'channel_post',
'edited_channel_post'
])
];
$result = sendRequest('getUpdates', $params);
if ($result['ok']) {
$updates = $result['result'];
foreach ($updates as $update) {
echo "Тип обновления: ";
if (isset($update['message'])) {
echo "message";
} elseif (isset($update['edited_message'])) {
echo "edited_message";
} elseif (isset($update['channel_post'])) {
echo "channel_post";
} elseif (isset($update['edited_channel_post'])) {
echo "edited_channel_post";
}
echo " (ID: " . $update['update_id'] . ")\n";
}
}
}
// Пример 4: Использование cURL для getUpdates
function getUpdatesWithCurl() {
global $botToken;
$url = "https://api.telegram.org/bot{$botToken}/getUpdates";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 35); // Таймаут 35 секунд
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'offset' => 0,
'limit' => 100,
'timeout' => 30
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpCode === 200 && $response) {
$data = json_decode($response, true);
if ($data['ok']) {
return $data['result'];
}
}
curl_close($ch);
return [];
}
// Пример использования (раскомментировать нужный):
// $lastUpdateId = getUpdatesBasic();
// longPollingWithOffset();
// getSpecificUpdates();
// $updates = getUpdatesWithCurl();
// Простой рабочий пример для веб-хука альтернативы
function simplePollingExample() {
$lastUpdateId = 0;
while (true) {
$params = ['offset' => $lastUpdateId + 1, 'timeout' => 10];
$result = sendRequest('getUpdates', $params);
if ($result['ok']) {
foreach ($result['result'] as $update) {
echo "Обработка update_id: " . $update['update_id'] . "\n";
$lastUpdateId = $update['update_id'];
// Здесь можно добавить логику обработки разных типов обновлений
processUpdate($update);
}
}
sleep(1); // Небольшая пауза между запросами
}
}
function processUpdate($update) {
// Обработка различных типов обновлений
if (isset($update['message'])) {
$message = $update['message'];
$chatId = $message['chat']['id'];
$text = $message['text'] ?? '';
echo "Сообщение в чат {$chatId}: {$text}\n";
// Можно отправить ответ
if (!empty($text)) {
sendMessage($chatId, "Вы сказали: " . $text);
}
}
}
function sendMessage($chatId, $text) {
global $botToken;
$url = "https://api.telegram.org/bot{$botToken}/sendMessage";
$data = [
'chat_id' => $chatId,
'text' => $text
];
$options = [
'http' => [
'method' => 'POST',
'header' => 'Content-Type: application/x-www-form-urlencoded',
'content' => http_build_query($data)
]
];
$context = stream_context_create($options);
file_get_contents($url, false, $context);
}
// Запуск простого примера (раскомментировать для теста):
// simplePollingExample();
?>
python
import requests
import time
BOT_TOKEN = "YOUR_BOT_TOKEN_HERE"
BASE_URL = f"https://api.telegram.org/bot{BOT_TOKEN}"
def get_updates(offset=None, limit=100, timeout=0, allowed_updates=None):
"""
Получает обновления через long polling
Args:
offset (int): Идентификатор первого возвращаемого обновления
limit (int): Лимит обновлений (1-100)
timeout (int): Таймаут long polling в секундах
allowed_updates (list): Список разрешенных типов обновлений
Returns:
list: Список объектов Update или пустой список при ошибке
"""
url = f"{BASE_URL}/getUpdates"
params = {}
if offset is not None:
params['offset'] = offset
if limit is not None:
params['limit'] = limit
if timeout is not None:
params['timeout'] = timeout
if allowed_updates is not None:
params['allowed_updates'] = allowed_updates
try:
response = requests.get(url, params=params, timeout=timeout + 5)
response.raise_for_status()
data = response.json()
if data.get('ok'):
return data.get('result', [])
else:
print(f"Ошибка: {data.get('description')}")
return []
except requests.exceptions.RequestException as e:
print(f"Ошибка соединения: {e}")
return []
except ValueError as e:
print(f"Ошибка парсинга JSON: {e}")
return []
# Пример 1: Получение всех непрочитанных обновлений
updates = get_updates()
for update in updates:
print(f"Update ID: {update['update_id']}")
if 'message' in update:
print(f"Сообщение от: {update['message']['from']['first_name']}")
print(f"Текст: {update['message'].get('text', 'Нет текста')}")
# Пример 2: Long polling с таймаутом 30 секунд
print("\nОжидание обновлений (таймаут 30 секунд)...")
updates = get_updates(timeout=30)
print(f"Получено {len(updates)} обновлений")
# Пример 3: Получение только сообщений и callback_query
allowed = ["message", "callback_query"]
updates = get_updates(allowed_updates=allowed, limit=10)
# Пример 4: Реализация обработки с отслеживанием offset
last_update_id = 0
while True:
try:
# Получаем обновления, начиная со следующего после last_update_id
updates = get_updates(offset=last_update_id + 1, timeout=60)
for update in updates:
last_update_id = max(last_update_id, update['update_id'])
# Обработка разных типов обновлений
if 'message' in update:
msg = update['message']
print(f"Новое сообщение: {msg.get('text', '')}")
elif 'callback_query' in update:
callback = update['callback_query']
print(f"Callback от: {callback['from']['first_name']}")
elif 'edited_message' in update:
print("Сообщение было отредактировано")
# Небольшая пауза между запросами
time.sleep(0.5)
except KeyboardInterrupt:
print("\nБот остановлен")
break
except Exception as e:
print(f"Ошибка: {e}")
time.sleep(5)
История изменений
- API 2.3.1. Обновлен метод getUpdates: Добавлено поле allowed_updates
Дополнительно
- Update - Объект Update представляет входящее событие в Telegram Bot API, содержащее информацию о сообщениях, запросах, изменениях статуса участников и других действиях, связанных с ботом.