Создание telegram-бота (python 3)

Часть первая - модуль получения обновлений.

Первый шаг -  зарегистрировать бота в Telegram, пользуясь специальным  ботом Botfather. Процедура несложная с интуитивным интерфейсом и подробно останавливаться на ней мы не будем. Главное - получить  от данного действия  токен - идентификатор, при помощи которого  новый бот будет взаимодействовать с API Телеграма.

Если токен получен, можно переходить  к созданию модуля   получения обновлений.  Это  функция, которая  получает на входе два параметра: вышеупомянутый токен и параметр  offset. С токеном уже разобрались, а offset - это  дословно  отступ, номер сообщения, до которого    сообщения  считаются полученными.  При запуске программы  этот параметр  назначается равным 0.

TOKEN = 'ваш_токен'
offset = 0 # начальный "отступ"
INTERVAL = 1 # Интервал проверки наличия новых сообщений (обновлений) на сервере в секундах
URL = 'https://api.telegram.org/bot' # Адрес HTTP Bot API

Далее - пишем функцию получения обновлений с сервера Telegram:

def  get_updates(TOKEN, URL, offset):
    
 
    # Формируем параметры запроса
    data = {'offset': offset+1, 'limit': 5, 'timeout': 0}
 
    # Отправка запроса обновлений
    try:
        request = requests.post(URL + TOKEN + '/getUpdates', data=data)
    except:
        print('Error getting updates') # сообщение об ошибке получения обновлений
        return False # Завершаем проверку
 
    if not request.status_code == 200: return False # Проверка ответа сервера
    if not request.json()['ok']: return False # Проверка успешности обращения к API
 
    # Проверка каждого элемента списка
    for update in request.json()['result']:
 
        offset = update['update_id'] # Извлечение ID сообщения
 
        #Проверка на наличие сообщения
        if not 'message' in update:
            continue #переход к следующему обновлению
 
        print ('\n\n',   datetime.datetime.now().strftime('%H:%M:%S'),'Сообщение получено:')
        print(update)
        return(update, offset)

Как видно из кода,  функция  возвращает None, если обновлений на сервере нет, и сериализированный объект, если обновление есть.  Пример  такого обновления:

{'update_id': 400390656,
'message': {'text': 'сообщение текстовое',
            'from': {'username': 'evillexus',
                     'id': 9111111111,
                     'last_name': 'А',
                     'first_name': 'Алексей'},
            'chat': {'id': -100110111111, 'title': 'test', 'type': 'supergroup'},
            'message_id': 266,
            'date': 1488625362}}

Доступ к каждой части  обновления осуществляется весьма просто:

# текст сообщения:
message_text = update['message']['text']# id отправителя:
# id отправителя: 
from_id = update['message']['from]['id']
# id чата в котором получено сообщение:
chat_id = update['message']['chat']['id']
# имя отправителя:
first_name = update['message']['from']['first_name']

и т.д.

Эти значения нам понадобятся для того, чтобы   обработать присланное сообщение и послать  адекватный ответ. Об этом в следующем материале, а пока остановимся на программе, которая будет каждую секунду запрашивать обновления на сервере:

if __name__ == '__main__':
    message = get_updates(TOKEN, URL, offset) # попытка получить обновление
        if message:
            print('Получено сообщение:\n')
            message_text = update['message']['text']
            print(message_text)