Метод getUpdates

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

Описание

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