И снова здравствуйте! Сегодня продолжим заниматься нашим ботом. А попробуем мы сделать следующее: бот будет возвращать всё то, что вы напишете ему в чате. Клёво? Тогда поехали. ;)
Для тех, кто не создал бота в BotFather, советую почитать тут. Если вы не знакомы с языком программирования, советую вам пройти курс на JetBrains Academy, тут статья-описание данного курса.
Что нам понадобится:
- Установленный Python на компьютере версией 3.5 и выше,
- Среда разработки или любой редактор кода, в котором будем писать код для бота,
- Созданный бот в BotFather,
- Немножко смекалки и сообразительности
Я буду использовать PyCharm в качестве среды разработки и библиотеку python-telegram-bot, предоставляющая чистый Python-интерфейс для Telegram Bot API. Пример кода будет в конце статьи.
Давайте для начала создадим папку py_bot, в которой создадим файл echo_bot.py и откроем в редакторе кода.
Установим библиотеку python-telegram-bot с помощью следующей команды, введя ее в терминал (командную строку), предварительно открыв в нем папку проекта :
pip install python-telegram-bot --upgrade
Теперь приступим непосредственно к самому коду. Импортируем из модуля telegram.ext Updater, CommandHandler, MessageHandler, Filters.
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
Updater получает обновления от Telegram и доставляет их диспетчеру. CommandHandler обрабатывает команды Telegram'а, MessageHandler обрабатывает сообщения Telegram'а, Filters помогает фильтровать сообщения MessageHandler'a.
Напишем функцию start(), которая выведет сообщение "Привет! Я бот, повторяющий слова, написанные тобой в чате.". Она будет использоваться для того, чтобы отправить ответное сообщение команде /start.
def start(update, context):
update.message.reply_text('Привет! Я бот, повторяющий слова, написанные тобой в чате.')
Чтобы закрепить то, чему мы научились, создадим похожую функцию, которая при команде /help отправит сообщение "Помогите".
def help_command(update, context):
update.message.reply_text('Help!')
Затем напишем нашу ключевую функцию, которая будет повторять отправленный текст пользователя и отправлять в ответ.
def echo(update, context):
update.message.reply_text(update.message.text)
Теперь нам нужно связать все эти разрозненные функции, не так ли? Let's do that!
Напишем функцию main(), в которой:
- создадим экземпляр класса updater = Updater('ваш токен', use_context=True),
- дадим диспетчеру регистрировать наши обработчики (handlers) dp = updater.dispatcher,
- добавим обработчики CommandHandler /start и /hel. dp.add_handler(CommandHandler("start", start)) dp.add_handler(CommandHandler("help", help_command)),
- добавим обработчик MessageHandler, который первым аргументом примет фильтры Filter.text и ~Filters.command, где символ ~ означает "не", то есть в нашем случае разрешай текст и не разрешай реагировать на команды. Вторым аргументом принимается коллбэк функция, у нас это функция echo(). dp.add_handler(MessageHandler(Filters.text & ~Filters.command, echo)),
- запустим запрашивание обновлений от Telegram. updater.start_polling(),
- чтобы код после запуска сразу же не отключился, добавим updater.idle(), чтобы наш код "застыл" в ожидании действий пользователя до тех пор, пока мы сами не выключим его.
def main():
updater = Updater(
"1173900008:AAEH1M8St4toafkR0KX-KiREt4bGjMKInpc", use_context=True)
dp = updater.dispatcher
dp.add_handler(CommandHandler("start", start))
dp.add_handler(CommandHandler("help", help_command))
dp.add_handler(MessageHandler(Filters.text & ~Filters.command, echo))
updater.start_polling()
updater.idle()
Теперь, чтобы запустить наш код, добавим и нажмем на кнопку Run :
if __name__ == '__main__':
main()
В итоге у нас получилось
Весь код для бота:
Спасибо за внимания! Увидимся в следующей статье.