Простой Telegram бот на Python, метод getUpdates

Простой Telegram бот на Python, метод getUpdates

Автор: Рамис | Статьи 28 мая 2020

Часть 1. Простой Telegram бот на Python, метод getUpdates

Часть 2. Telegram бот на Python, отправка файлов, встроенная клавиатура

Часть 3. Telegram бот на Python, работа с геолокацией пользователяа

Из этой статьи вы узнаете, как с помощью Python можно создать Telegram бота используя для этого библиотеку requests. Этот урок будет полезен для начинающих разработчиков, для тех кто только начал познавать работу протокола HTTP в Python.

Requests - это Python HTTP библиотека, цель которого сделать запросы HTTP проще и удобнее для человека. Requests поможет вам легко разобраться с любой API.

Создаем бота

Для начала нужно создать бота и получить токен, для этого выполним пару простых шагов.

Шаг 1. Заходим в Telegram (для удобства можно воспользоваться web-версией), и с помощью поисковой строки находим отца всех ботов @BotFather.

Шаг 2. В беседе с @BotFather выполняем команду /newbot и даем придуманное имя, и никнейм боту (я создал бота по имени «RamasTestBot»).

Создаем бота

Шаг 3. В ответ мы получили сообщение, где указан токен и ссылка на нашего бота, переходим по ссылке и пишем боту любое сообщение.

Создаем бота

Бот готов, сейчас можно переходить к самому интересному.

Telegram API входящие сообщения

Для того что бы получить входящие обновления бота, воспользуемся методом getUpdates. Откроем в новой вкладке браузере ссылку, используя свой полученный ранее токен.

https://api.telegram.org/bot<ваш_токен>/getUpdates 

В ответ мы должны получить массив объектов, где можно увидеть отправленные нами ранее сообщением боту, в моем случае это «/start» и «Hello» (если ответ пустой, отправьте своему боту еще одно сообщение, и обновите страницу с ссылкой).

Создаем бота

Теперь осталось повторить все на Python. Напишем код, где будем отправлять GET запрос, и с помощью полученных данных в ответ (массива данных) научим программу понимать, что боту написали новое сообщение.

Для проверки выведем в консоль уникальный идентификатор пользователя, и его сообщение

import requests
import time

TOKEN = 'токен'
URL = 'https://api.telegram.org/bot'

def get_updates(offset=0):
    result = requests.get(f'{URL}{TOKEN}/getUpdates?offset={offset}').json()
    return result['result']

def run():
    update_id = get_updates()[-1]['update_id'] # Присваиваем ID последнего отправленного сообщения боту
    while True:
        time.sleep(2)
        messages = get_updates(update_id) # Получаем обновления
        for message in messages:
            # Если в обновлении есть ID больше чем ID последнего сообщения, значит пришло новое сообщение
            if update_id < message['update_id']:
                update_id = message['update_id'] # Присваиваем ID последнего отправленного сообщения боту
                print(f"ID пользователя: {message['message']['chat']['id']}, Сообщение: {message['message']['text']}")

if __name__ == '__main__':
    run()

Создаем бота

Создаем бота

Telegram API отправить сообщение

Для того, что бы отправлять сообщение от имени бота, существует метод sendMessage.

Откроем в новой вкладке браузера ссылку используя свой токен, и в параметрах укажем:

  • chat_id: уникальный id пользователя, что бы бот понял кому именно ответить (в моем случае это 792035400).
  • text: Текст самого сообщения
https://api.telegram.org/bot<ваш_токен>/sendMessage?chat_id=792035400&text=Привет, хорошо, а ты как?

Создаем бота

Повторим все на Python.

import requests
import time

TOKEN = 'токен'
URL = 'https://api.telegram.org/bot'

def send_message(chat_id, text):
    requests.get(f'{URL}{TOKEN}/sendMessage?chat_id={chat_id}&text={text}')

if __name__ == '__main__':
    send_message(792035400, 'Привет, хорошо, а ты как?')

После каждого запуска программы мы увидим что наш бот отправляет сообщение Привет, хорошо, а ты как?.

Создаем простого телеграм бота

С методами getUpdates, и sendMessage API Telegram мы разобрались, используя свои знания напишем программу которая научит нашего бота отвечать на сообщение.

import requests
import time

TOKEN = 'токен'
URL = 'https://api.telegram.org/bot'

def get_updates(offset=0):
    result = requests.get(f'{URL}{TOKEN}/getUpdates?offset={offset}').json()
    return result['result']

def send_message(chat_id, text):
    requests.get(f'{URL}{TOKEN}/sendMessage?chat_id={chat_id}&text={text}')

def check_message(chat_id, message):
    for mes in message.lower().replace(',', '').split():
        if mes in ['привет', 'ку']:
            send_message(chat_id, 'Привет :)')
        if mes in ['дела?', 'успехи?']:
            send_message(chat_id, 'Спасибо, хорошо!')

def run():
    update_id = get_updates()[-1]['update_id'] # Присваиваем ID последнего отправленного сообщения боту
    while True:
        time.sleep(2)
        messages = get_updates(update_id) # Получаем обновления
        for message in messages:
            # Если в обновлении есть ID больше чем ID последнего сообщения, значит пришло новое сообщение
            if update_id < message['update_id']:
                update_id = message['update_id'] # Присваиваем ID последнего отправленного сообщения боту
                # Отвечаем тому кто прислал сообщение боту
                check_message(message['message']['chat']['id'], message['message']['text'])

if __name__ == '__main__':
    run()

Создаем бота

Теперь наш бот может поприветствовать, и ответить, как у него дела). Скоро я выпушу вторую часть, где покажу как отправлять файлы и выводить настраиваемую клавиатуру (вторая часть).

Дополнительную информацию о методах вы можете получить в документации.

Комментарии

Gedibedee
@Gedibedee
10 апреля 2022

в чем ошибка

update_id = int(get_updates()[-1]['update_id']) 
IndexError: list index out of range

Ответить
Рамис
@ramas
10 апреля 2022

@Gedibedee, замените на это

update_id = 0
if (_update:=get_updates()):
    update_id = _update[-1]['update_id']

Ответить
Gedibedee
@Gedibedee
10 апреля 2022

@ramas, спасибо, заработало

Ответить
Alexander
@Alexander
05 ноября 2023

а как при команде /start выводить приветствие и имя пользователя весь инет перерыл не нашел, помоги пожалуйста

Ответить
Markdown
Войти