- Разбираемся с Tg ботом вместе. Python
- Ⅰ. Регистрация бота
- Ⅱ. Подготовка
- Ⅲ. Базовые элементы. Привет
- Ⅳ. Диалог
- Создаём Telegram-бота на Python с помощью pyTelegramBotAPI (telebot)
- Получение токена для Telegram-бота
- Установка библиотеки telebot и знакомство с pyTelegramBotAPI
- Работа с API Яндекс Погоды
- Настройка команд для telegram-бота
- Финальный код Telegram-бота на Python
Разбираемся с Tg ботом вместе. Python
Решил разобраться с написанием телеграмм бота и поделиться успехами с Вами.
Как уже было сказано ранее основная цель освоить телеграмм бота и создать некоторые шаблоны которые могут пригодиться в будущем для создания полноценного бота.
Всё начинается с малого
Ⅰ. Регистрация бота
Ⅱ. Подготовка
Пишем на Python’е с использованием библиотеки PyTelegramBotAPI. Я использую PyCharm, его можно скачать на официальном сайте https://www.jetbrains.com/ru-ru/pycharm/. Так же для установки библиотеки PyTelegramBotAPI вводим следующую команду в командной строке
pip install pytelegrambotapi
Ⅲ. Базовые элементы. Привет
Импортируем библиотеку и подключаем нашего бота
import telebot bot = telebot.TeleBot('%токен%')
Описываем метод получения текстовых сообщений:
@bot.message_handler(content_types=['text', 'document', 'audio']) #получает def get_text_messages(message): #обрабатывает
Опишем функцию обработки полученного сообщения. При получении слова «Паника» бот будет отвечать «заразна !». Для помощи пользователю будем выводить ещё текст о том что надо делать.
if message.text == "Паника": bot.send_message(message.from_user.id, "Заразна!") else: bot.send_message(message.from_user.id, "Напиши Паника")
Обратим внимание на переменную message.from_user.id она хранит уникальный для каждого пользователя id, именно с помощью него мы сможем отвечать нужному человеку и его я планирую в будущем хранить в базе данных пользователей
Наш бот будет у сервера Telegram постоянно спрашивать «Мне кто-нибудь написал?» Если это случится, наш бот получит переданное сообщение. Для этого допишем:
bot.polling(none_stop=True, interval=0)
Ⅳ. Диалог
Давайте научим нашего бота вести диалог с пользователем. В будущем я планирую это использовать как шаблон для регистрации. Бот будет задавать человеку ряд вопросов, получать на них ответы и сохранять
Заведем ряд переменных в которых будем хранить данные регистрации:
name = '' surname = '' city = '' age = 0
Аналогично как в предыдущем пункте опишем функцию начала регистрации start по команде /reg
@bot.message_handler(content_types=['text']) def start(message): if message.text == '/reg': bot.send_message(message.from_user.id, "Как тебя зовут?") bot.register_next_step_handler(message, get_name) #следующий шаг – функция get_name else: bot.send_message(message.from_user.id, 'Напиши /reg')
Далее опишем ряд последовательных функций — этапов нашей регистрации:
def get_name(message): #получаем имя global name name = message.text bot.send_message(message.from_user.id, 'Какая у тебя фамилия?') bot.register_next_step_handler(message, get_surname) #следующий шаг – функция get_surname def get_surname(message): #получаем фамилию global city name = message.text bot.send_message(message.from_user.id, 'Из какого ты города?') bot.register_next_step_handler(message, get_city) def get_city(message): #получаем город global city city = message.text bot.send_message(message.from_user.id,'Сколько тебе лет?') bot.register_next_step_handler(message, get_age) def get_age(message): #получаем возраст global age try: age = int(message.text) #проверяем, что возраст введен корректно except Exception: bot.send_message(message.from_user.id, 'Цифрами, пожалуйста') bot.register_next_step_handler(message, get_age)
В каждой из этих функций мы с помощью переменной message получаем интересующие нас данные, сохраняя их и с помощью bot.register_next_step_handler переходим к следующей функции. В функции get_age проверяем чтобы полученное значение действительно было числом.
В следующей части рассмотрим работу с кнопками и сохранение данных в базе данных.
Создаём Telegram-бота на Python с помощью pyTelegramBotAPI (telebot)
Сегодня будем учиться создавать ботов в Telegram с помощью Python.
Попробуем заставить бота присылать сводку погоды по нашему городу.
Нам потребуется:
- Компьютер или ноутбук (При должном усердии можно попробовать на телефоне).
- Python 3 (Мы будем работать на версии 3.10).
- Редактор кода (Я использую PyCharm).
- Соединение с интернетом.
У всех на слуху две библиотеки для разработки telegram-ботов, это:
— telebot (он же pyTelegramBotAPI),
— aiogram.
Мы будем использовать telebot как более простой инструмент для личного пользования. Посмотрим как запустить первого бота, что для этого нужно и на что он способен.
Как и aiogram, telebot является адаптацией API telegram для взаимодействия с ответами от сайта. Со справкой API telegram можно ознакомиться тут https://core.telegram.org/. Там же вы сможете узнать подробнее об ответах API.
Получение токена для Telegram-бота
Чтобы создать нашего первого бота на Python надо обратиться к официальному боту от Telegram — BotFather. Там можно создать бота и получить его токен. Токен – это аналог пароля, который позволит нам управлять ботом изнутри и программировать его ответы.
Переходим в BotFather — https://t.me/BotFather и нажимаем «Запустить»:
Дальше выбираем команду /newbot и следуем всем указанием, и в конце мы получаем токен нашего бота:
Установка библиотеки telebot и знакомство с pyTelegramBotAPI
После получения токена нужно скачать библиотеку telebot:
pip install pyTelegramBotAPI
pip3 install pyTelegramBotAPI
Мы не будем раскладывать проект по модулям, поэтому у нас будет один исполнимый файл main.py. После создания файла надо импортировать библиотеку и наш токен:
import telebot api_token = 'Ваш токен вставлять сюда'
Первым делом следует инициализировать бота, передав в него токен, полученный от BotFather:
bot = telebot.TeleBot(api_token)
Дальше убедимся, что все корректно работает и заставим отправлять полученное сообщение обратно:
@bot.message_handler(content_types=['text']) def echo(message): bot.send_message(message.chat.id, text=f"")
Бот работает за cчёт декораторов, которые указывают, что мы хотим от него. Message handler – это обработчик всех сообщений, которые отправляет пользователь. В списке content_types перечисляем типы сообщений, которые хотим принимать. Можно указать text, audio, image и document.
У объекта bot есть множество методов, частью которых мы будем пользоваться. Основной из них — send message.
Чтобы заставить бота принимать сообщение, в конце файла пропишем:
Параметр none_stop указывает, что мы хотим принимать сообщения постоянно.
В стандартном положении параметр равен False, но мы ставим True.
После всех манипуляций получаем свое же сообщение:
Работа с API Яндекс Погоды
Перейдем к добавлению нужных функций — получению данных о погоде.
Для погоды мы будем пользоваться услугами бесплатного API от Яндекс Погоды:
https://yandex.ru/dev/weather/. Следует отметить, что бесплатный API от Яндекса ограничен 50 запросам в сутки. Если вас такое количество не устраивает, можно воспользоваться OpenWeather.
Запрос будет выглядеть так:
https://api.weather.yandex.ru/v2/informers?lat=55.75222&lon=37.61556
Запрос состоит из местоположения — в данном случае указаны координаты Москвы. Далее можно просить у пользователя геолокацию и присылать ему погоду по его координатам.
Для отправки GET-запроса к API Яндекс.Погоды нам поможет библиотека requests, а для обработки ответа — библиотека json.
Библиотека requests предназначена для работы с GET и POST запросами, которые обычный пользователь делает через браузер. Теперь же мы можем общаться с сервером через python оставляя браузер за скобками. Часто используют requests вместе с BS4 (beautiful soup 4), чтобы удобно получать и анализировать информацию из html кода. Но в наш случае другая задача.
API Яндекс.Погоды отдаёт данные в формате JSON, поэтому библиотека json подойдёт лучше всего. JSON основан на JavaScript объекте и часто используется при обмене данными. Раньше он использовался только на сайтаx для работы с текстовыми данными. Сейчас его используют почти везде для удобного обмена данными. JSON принимают все языки программирования, что является его большим плюсом. В python библиотека json уже установлена и не требует отдельной команды.
Добавляем импорт нужных библиотек:
import requests import json
До этого мы не затрагивали тему, как именно обрабатывать команды через слеш. Для этого у декоратора есть метод message_handlers, внутрь которого мы передаем название команд:
@bot.message_handler(commands=['get_weather', 'weather', 'pogoda']): def get_weather(message): pass
Для удобства выносим токен Яндекс.Погоды и ссылку в отдельные переменные:
url = "https://api.weather.yandex.ru/v2/informers?lat=55.75222&lon=37.61556" headers =
Отправим себе в Telegram полный ответ от API Яндекс.Погоды и проверим что все работает:
@bot.message_handler(commands=['get_weather', 'weather', 'pogoda']) def get_weather(message): r = requests.get(url=url, headers=headers) bot.send_message(message.chat.id, r.text)
После получения ответа сформируем нормальный ответ для пользователя. Сразу сделаем проверку на status_code, чтобы оповестить пользователя, если проблемы на стороне API. После получения ответа от API в текстовом формате, надо перевести его в словарь. Для этого подключаем библиотеку json — в функцию loads мы передаем текст ответа, а на выходе получаем объект типа dict (словарь):
@bot.message_handler(commands=['get_weather', 'weather', 'pogoda']) def get_weather(message): r = requests.get(url=url, headers=headers) bot.send_message(message.chat.id, r.text) if r.status_code == 200: data = json.loads(r.text) fact = data["fact"] bot.send_message(message.chat.id, text=f'Now in Moscow °, feels like °. Now on the street ') else: bot.send_message(message.chat.id, 'Problems on weather API')
Теперь бот отправляет температуру, как она ощущается и какая сейчас погода:
Настройка команд для telegram-бота
Нам осталось сделать реакцию на команду /start. Она будет выводить команду для получения данных о погоде:
@bot.message_handler(commands=['start']) def get_weather(message): bot.send_message(message.chat.id, text=f'Hello, ! \n\nI can show you the weather with: \n/weather\n/pogoda\n/get_weather')
Мы обращаемся к информации, которая приходит нам в сообщении пользователя, чтобы получить из нее имя пользователя. Подробнее узнать о сообщениях пользователей можно тут https://core.telegram.org/constructor/message.
Теперь создадим подсказки для пользователей. Библиотека pyTElegramBotAPI не позволяет из кода редактировать подсказки для написания команды. Чтобы это сделать нам потребуется несколько операций в BotFather:
- кликаем на меню
- выбираем команду /mybots
- ищем нашего бота
- edit bot
- и выбираем edit commands
- дальше вводим нашу команду (Пример: команда – описание)
После всех манипуляций у нас появится всплывающая менюшка с командами:
Финальный код Telegram-бота на Python
Мы с вами затронули лишь малу часть того, что можно сделать с помощью python и Telegram. Telebot — не самая лучшая библиотека для создания ботов под большую аудитории. Если вы хотите писать бот для магазинов, вам потребуется более сильные инструменты разработки, которые есть в aiogram.
Если вам хочется потренироваться самостоятельно — попробуйте написать бота со следующими функциями: конвертор валюты, сводка по курсу валюты.
import telebot import requests import json api_token = '5347819163:********lZu1qWQc5f55DPk' url = "https://api.weather.yandex.ru/v2/informers?lat=55.75222&lon=37.61556" headers = bot = telebot.TeleBot(api_token) @bot.message_handler(commands=['start']) def get_weather(message): bot.send_message(message.chat.id, text=f'Hello, ! \n\nI can show you the weather with: \n/weather\n/pogoda\n/get_weather') @bot.message_handler(commands=['get_weather', 'weather', 'pogoda']) def get_weather(message): r = requests.get(url=url, headers=headers) bot.send_message(message.chat.id, r.text) if r.status_code == 200: data = json.loads(r.text) fact = data["fact"] bot.send_message(message.chat.id, text=f'Now in Moscow °, feels like °. Now on the street ') else: bot.send_message(message.chat.id, 'Problems on weather API') bot.polling(none_stop=True)