Чат-бот в Telegram на python и aiogram. Создание первого Telegram бота на Python. Част. Выбираем библиотеку и пишем первого бота.
Разбираемся, как написать чат-бота с помощью библиотеки aiogram. Весь код — внутри статьи.
Компании используют чат-ботов в Telegram для разных задач: рассылают новости о новых акциях, принимают платежи или даже организуют службу технической поддержки. Обычные пользователи тоже используют их для своих бытовых нужд — ведут учёт личных финансов или оформляют посты в социальных сетях.
В этой статье мы научимся с нуля создавать чат-ботов с помощью Python: выберем лучшую библиотеку и напишем на ней эхо-бота, который отвечает на сообщения пользователя точно такими же сообщениями. Это первая часть урока по чат-ботам в Telegram — во второй части мы добавим новые фичи.
Библиотеки для создания бота
Для создания Telegram-ботов на Python существует несколько десятков библиотек. Они различаются популярностью, размером комьюнити и функциональностью. Рассмотрим самые популярные.
Пишем TELEGRAM бота на Python
Современная библиотека, набирающая популярность. Работает с асинхронным подходом к выполнению кода. Это позволяет не останавливать работу бота в ожидании ответа пользователя. У aiogram подробная документация и большое русскоязычное комьюнити. В этой и последующих статьях цикла мы будем работать как раз с этой библиотекой.
Одна из первых библиотек для создания ботов. Отличается от aiogram синхронным подходом к работе, то есть при ожидании ответа от пользователя выполнение кода останавливается.
Библиотека для создания простых ботов, позволяющая работать с асинхронным и синхронным подходом на выбор. Подходит для небольших проектов. Подробнее можно узнать в документации .
Переходим к созданию Telegram-бота. Потренируемся на простом примере — создадим эхо-бота, который отвечает на сообщения пользователя его же словами.
Для этого нам необходимо:
Устанавливаем Python и создаём виртуальное окружение
На macOS или Linux. Python установлен в эти операционные системы изначально. Чтобы проверить его наличие, откройте терминал и введите команду:
Если у вас не установлен Python:
Переходите на официальный сайт, скачиваете актуальную версию и устанавливаете её.
Не забудьте поставить галочку add PATH во время установки
После установки и проверки Python требуется установить виртуальное окружение с помощью virtualenv.
Это специальный инструмент, который позволяет изолировать друг от друга проекты в разработке, независимо устанавливая для них библиотеки и пакеты. Удобно, когда вы работаете над разными приложениями одновременно.
virtualenv устанавливается через терминал:
sudo pip3 install virtualenv
После этого необходимо создать директорию для проекта, внутри которой будет работать виртуальное окружение:
Команда mkdir создаст папку cd переведёт нас в неё. Теперь в этой директории будут храниться файлы проекта, связанные с нашим ботом.
Развернём виртуальное окружение внутри папки
virtualenv venv -p python3
Теперь его активируем. Если этого не сделать, то оно не будет работать.
Шаг 2
Создаём бота
Открываем его, жмём кнопку «Запустить» и вводим команду /newbot:
Теперь напишем название и юзернейм для нашего бота. Назовём его echo_skillbox_bot (теперь это имя занято, так что вам надо будет придумать своё). В ответ придёт наш токен, который мы будем использовать для подключения к API Telegram.
Этот токен мы сохраняем — он потребуется нам в будущем.
Python-telegram-bot примеры. Самый простой бот
Сперва глянем внашего базового пакета, чтобы понять, с чего начинается простенький бот. Следующий код
# -*- coding: utf-8 -*- from telegram.ext import Updater # пакет называется python-telegram-bot, но Python- from telegram.ext import CommandHandler # модуль почему-то просто telegram ¯_(ツ)_/¯ def start(bot, update): # подробнее об объекте update: https://core.telegram.org/bots/api#update bot.sendMessage(chat_id=update.message.chat_id, text=»Здравствуйте.») updater = Updater(token=’TOKEN’) # тут токен, который выдал вам Ботский Отец! start_handler = CommandHandler(‘start’, start) # этот обработчик реагирует # только на команду /start updater.dispatcher.add_handler(start_handler) # регистрируем в госреестре обработчиков updater.start_polling() # поехали!
создаёт бота, который сухо отвечает «Здравствуйте.» при нажатии на кнопку Start (или ручном вводе команды /start ) и многозначительно молчит при любых последующих действиях с вашей стороны.Соответственно, если мы захотим повесить обработчики любых текстовых сообщений или любых команд, нам нужно будет написать
from telegram.ext import Filters, MessageHandler def handle_text(bot, update): # … def handle_command(bot, update): # … # MessageHandler — более универсальный обработчик, который берёт на вход фильтр text_handler = MessageHandler(Filters.text, self.handle_text) command_handler = MessageHandler(Filters.command, self.handle_command) # регистрируем свеженькие обработчики в диспетчере updater.dispatcher.add_handler(text_handler) # без регистрации будет работать, updater.dispatcher.add_handler(command_handler) # но не больше трёх месяцев (шутка)
(За дальнейшими подробностями с чистой совестью отсылаю к.)Нагруженные этим теоретическим минимумом, мы можем наконец подумать, как нам писать своего нетривиального бота. Для начала давайте вернёмся к постановке задачи. Под диалоговым ботом я подразумеваю бота, который главным образом ведёт обычный текстовый диалог с пользователем — с вопросами, ответами, нелинейным сюжетом, разочаровывающими концовками и всем в таком духе (играли в «»?) Напротив, не попадают в сферу наших текущих интересов боты, разным образом расширяющие функционал Telegram (вроде); соответственно, мы опустим добавление всяких плюшек вроде,,и всего такого прочего.Проблема сложных диалоговых ботов в том, что нетривиальный диалог требует хранения состояния. Работа асинхронных диалогов требует постоянных прерываний на ожидание сообщения от пользователя; состояние нужно сохранять, потом восстанавливать, прыгать к коду, ответственному за обработку очередного сообщения, и так далее; в общем, организация кода становится проблемой довольно угнетающей. Прервать, продолжить… ничего не напоминает? Что ж, посмотрим, как обозначенную проблему можно изящнейше обойти с помощью магии yield .
Чат-боты в Telegram на python. част. Callback-кнопки и редактирование сообщений
Прежде, чем мы перейдем к другим кнопкам, давайте познакомимся с функциями редактирования сообщений, коих тоже три: editMessageText (редактирование текста), editMessageCaption (редактирование подписи к медиа) и editMessageReplyMarkup (редактирование инлайн-клавиатуры). В рамках этого урока рассмотрим только первую функцию, остальные работают аналогично и предлагаются для самостоятельного изучения.
Чтобы отредактировать сообщение, нам надо знать, про какое именно идёт речь. В случае, если оно было отправлено самим ботом, идентификаторами служит связка chat_id + message_id . Но если сообщение было отправлено в инлайн-режиме, то ориентироваться надо по параметру inline_message_id .
И вот теперь вернемся к нашим баранам кнопкам. На очереди – Callback . Это, на мой взгляд, самая крутая фича нового обновления. Колбэк-кнопки позволяют выполнять произвольные действия по их нажатию. Всё зависит от того, какие параметры каждая кнопка в себе несёт. Соответственно, все нажатия будут приводить к отправке боту объекта CallbackQuery , содержащему поле data , в котором написана некоторая строка, заложенная в кнопку, а также либо объект Message , если сообщение отправлено ботом в обычном режиме, либо поле inline_message_id , если сообщение отправлено в инлайн-режиме.
Приведу пример, после которого все вопросы должны отпасть: пусть, например, если сообщение отправлено ботом в обычном режиме, то нажатие на кнопку заменит текст сообщения на “Пыщь”, если в инлайн – то “Бдыщь”. При этом в обоих случаях значение callback_data будет равно test . Что для этого нужно сделать: во-первых, написать простейший хэндлер для всех входящих сообщений, во-вторых, написать простейший хэндлер для инлайн-сообщений, в-третьих, написать простейший хэндлер для колбэка, который определит, из какого режима пришло сообщение.
Aiogram python. Установка ¶
Для начала давайте создадим каталог для бота, организуем там virtual environment (далее venv) и установим библиотеку aiogram .
Проверим, что установлен Python версии 3.9 (если вы знаете, что установлен 3.9 и выше, можете пропустить этот раздел):
$ python3.9 Python 3.9.9 (main, Jan 11 2022, 16:35:07) on linux Type «help», «copyright», «credits» or «license» for more information. >>> exit() $
Теперь создадим файл requirements.txt , в котором укажем используемую нами версию aiogram. Также нам понадобится библиотека python-dotenv для файлов конфигурации.
О версиях aiogram
В этой главе используется aiogram 3.x , перед началом работы рекомендую заглянуть в канал релизов библиотеки и проверить наличие более новой версии. Подойдёт любая более новая, начинающаяся с цифры 3, поскольку aiogram 2.x более рассматриваться не будет и считается устаревшим.
$ python3.9 -m venv venv $ echo «aiogram==3.0.0b7» > requirements.txt $ echo «python-dotenv==0.21.1» >> requirements.txt $ source venv/bin/activate (venv) $ pip install -r requirements.txt # …здесь куча строк про установку… Successfully installed …тут длинный список… $
Обратите внимание на префикс «venv» в терминале. Он указывает, что мы находимся в виртуальном окружении с именем «venv». Проверим, что внутри venv вызов команды python указывает на всё тот же Python 3.9:
(venv) $ python Python 3.9.9 (main, Jan 11 2022, 16:35:07) on linux Type «help», «copyright», «credits» or «license» for more information. >>> exit() (venv) $ deactivate $
Последней командой deactivate мы вышли из venv, чтобы он нам не мешал.
Если для написания ботов вы используете PyCharm, рекомендую также установить сторонний плагин Pydantic для поддержки автодополнения кода в телеграмных объектах.
Самообучающийся чат-бот python. Что делают Chatbots?
Современные чат-боты не полагаются исключительно на текст, и часто показывают полезные карточки, изображения, ссылки и формы, предоставляя опыт, подобный приложению.
В зависимости от того, как запрограммированы боты, мы можем разделить их на два варианта: они основаны на правилах (немые боты) и самообучаются (умные боты).
- Чат-боты на основе правил Это множество ботов отвечают на вопросы, основываясь на некоторых простых правилах, по которым они обучаются.
- Самообучающиеся чат-боты : На это разнообразие ботов полагаются Искусственный интеллект (AI) https://lajfhak.ru-land.com/stati/chat-bot-v-telegram-na-python-i-aiogram-sozdanie-pervogo-telegram-bota-na-python-chast» target=»_blank»]lajfhak.ru-land.com[/mask_link]
Пишем Telegram Bot на Python
Python – язык программирования высокого уровня, который появился сравнительно недавно. Однако его простота и легкий синтаксис уже сделали язык лидером в программировании. Многие предпочитают Python для создания Telegram Bot.
Что требуется для создания бота
- Среда программирования Python.
- Если у вас установлена версия до 3.4, то следует скачать Gid и Pip. Первое – система управления версиями, второе – система управления пакетами Python. Pip позволяет устанавливать пакеты из командной строки.
- Регистрация на GitHub.com
- Регистрация на сервере Heroku.com.
Последние два позволят развернуть бот в сети.
Создаем бота
В результате вы получите токен – символьно-числовую последовательность, уникальную для каждого бота Telegram. Именно с помощью этого идентификатора отправляются запросы на сайт https://api.telegram.org.
Каждый запрос имеет вид:
Методы описаны в документации к Telegram Bot API и являются стандартными. Задача программиста при написании бота заключается в создании кода, который получает сообщения от пользователя и отправляет команду боту на выполнение действий. Запрос может выглядеть следующим образом:
Это пример отправки сообщения для клиента Telegram. Обязательно необходимо знать параметр id_chat – это идентификатор чата. Узнать его можно из ответа, который присылает сервер, который имеет вид JSON-строки:
По сути программа отправляет запросы, считывает ответы и выполняет парсинг полученной строки. В зависимости от сообщений пользователя выполняются те или иные действия.
Пишем бота для Telegram на Python
Сначала создадим программный код. Необходимо установить Python и среду разработки.
- Скачайте Python с официального сайта https://www.python.org/downloads/
- Установите, обязательно указав «Add Python to Path».
- Проверьте установку, открыв командную строку и набрав pip. Должен появится справочный материал по pip.
Откройте среду программирования IDLE. Это делается через пуск, в главном меню ищите раздел с установленным Python и выбирайте нужную команду. Отроется окно. Создайте в нем новый файл и вставьте программный код бота Telegram на Python.
import requests
import datetime
#Установка адреса бота
url = https://api.telegram.org/bot507226896:AAGT_fsEO1milOkqbNp-VolQDJ0tGjaPvD7/
#Поиск последнего сообщения из массива чата с пользователем Telegram.
def lastUpdate(dataEnd):
res = dataEnd[‘result’]
totalUpdates = len(res) — 1
return res[totalUpdates]
#Получение идентификатора чата Telegram
def getChatID(update):
chatID = update[‘message’][‘chat’][‘id’]
return chatID
#отправка запроса sendMessage боту
def sendResp(chat, value):
settings =
resp = requests.post(url + ‘sendMessage’, data=settings)
return resp
#Get-запрос на обновление информации к боту. Результат – строка json. Метод .json позволяет развернуть ее в массив
def getUpdatesJson(request):
settings =
response = requests.get(request + ‘getUpdates’, data=settings)
return response.json()
#Главная функция
def main():
chatID = getChatID(lastUpdate(getUpdatesJson(url)))
sendResp(chatID, ‘Ваше сообщение’)
updateID = lastUpdate(getUpdatesJson(url))[‘update_id’]
#Бесконечный цикл, который отправляет запросы боту на получение обновлений
while True:
#Если обновление есть, отправляем сообщение
if updateID == lastUpdate(getUpdatesJson(url))[‘update_id’]:
sendResp(getChatID(lastUpdate(getUpdatesJson(url))), ‘проба’)
updateID += 1
sleep(1)
#Запуск главной функции
if __name__ == ‘__main__’:
main()Python чувствителен к пробелам и табуляции, поэтому выполните Format-Untabify Region.
Запустите здесь же в среде разработки. В созданном боте Telegram должно появиться сообщение «Ваше сообщение Проба».
Разворачиваем проект на сервере
Самое сложное – заставить наш проект для Telegram работать на сервере. Мы воспользуемся бесплатным сервисом Heroku.
- Устанавливаем окружение, набирая pip install pipenv – ее надо набрать в командной строке.
- Регистрируемся на Heroku.com
- Устанавливаем интерфейс командной строки Heroku (CLI)
https://devcenter.heroku.com/articles/getting-started-with-python#set-up - В командной строке набираем Heroku и Enter
- Вводим адрес электронной почты, с которым регистрировались на сервере, и пароль, придуманный при регистрации
- Создаем папку. Ее лучше создать в папке с Python. Для примера создадим папку run
- Набираем virtualenv run , чтобы инициализировать в ней virtualenv.
- Регистрируемся на github.com и создаем свой репозиторий
- Переходим в папку run с помощью cd run
- Клонируем репозиторий git командой git clone https:/github.com/ВАШЕ_ИМЯ/ВАШ РЕПОЗИТОРИЙ . ВАШЕ_ИМЯ – имя пользователя на github
- Скопируйте скрипт в папку созданного репозитория (она появится в run)
- Зайдите в папку run/scripts , чтобы запустить файл activate.bat. Если он сработал успешно, то перед адресом в командной строке будет стоять название вашей папки. Например,
- Перейдем в папку run , затем в папку репозитория с помощью команды cd
- Установим модуль requests. Наберем pip install requests
- Чтобы создать зависимость введите pip freeze > requirements.txt
- В папке run создайте файл Procfile или Procfile.windows (для Windows) и сохраните в нем строку web: python bot.py, где bot.py – имя вашего файла с программой для бота
- В папке репозитория создайте файл __init__.py. Он будет пустым
Далее последовательно набирайте в командной строке
Вы увидите сообщение об инициализации пустого репозитория.
Внимание, после add пробел и точка! Добавляет файлы в локальный депозиторий.
Выполнение команды занимает некоторое время, необходимо подождать.
git commit -m ‘short message that describe changes to commit’
Фиксирует изменения в репозитории.
git push -u https://github.com/ИМЯ_ПОЛЬЗОВАТЕЛЯ/ИМЯ_РЕПОЗИТОРИЯ
Позволит развернуть проект на github.Затем выполните команды:
heroku create имя проекта
В результате вы получите адрес вашего проекта, например, runbot.herokuapp.com.
git push heroku master
Ждем окончания процесса компиляции проекта.
heroku ps:scale web=1
heroku openПоследняя команда откроет ваше приложение на сервере. Бот на Питоне для Телеграмма начнет свою работу.
На сайте с документацией можно посмотреть другие Telegram Bot примеры на Python.
Источник: telegramzy.ru
Учебник по разработке бота для Telegram на Python
Отличный учебник для тех, кто хочет научиться писать ботов для Telegram с использованием библиотеки pyTelegramBotAPI. Существует альтернативный вариант мана, написанный другим автором, там используется библиотека aiogram.
Учебник здесь
Все исходные коды к урокам расположены в этом репозитории
Читайте анонсы и посты целиком в ЖЖ, Medium, Голосе и Яндекс.Дзен!
Поддержите мой блог финансово. Все донаты пойдут на оплату хостинга и развитие сайта!
Telegram
Your Browser Does Not Support iframes!
Последние
Рубрики
Подписаться
Соединить с D
Соединить с D
0 комментариев
Inline Feedbacks
View all commentsСЧЕТЧИКИ
РЕКЛАМА И ДОНАТЫ
Социальные сети
Использование материалов разрешается с активной ссылкой на levashove.ru.
Источник: levashove.ru