Создание первого бота Telegram на Python 3: пошаговое руководство


Чат-боты совершают революцию в том, как люди взаимодействуют с техникой. В последние годы их простота и низкая стоимость способствовали их внедрению в различных сферах и отраслях. В этой статье разработчик Toptal Natural Language Processing — Ali Abdel Aal демонстрирует, как вы можете создать и развернуть чат-бота Telegram на Python за несколько часов.

Чат-боты часто называют революцией в том, как пользователи взаимодействуют с технологиями и предприятиями. Они имеют довольно простой интерфейс по сравнению с традиционными приложениями, поскольку требуют от пользователей только общения в чате, а чат-боты должны понимать и делать все, что от них требует пользователь, по крайней мере, в теории.

Telegram Bot Python

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

Сегодня чат-боты используются во многих сценариях, начиная от простых задач, таких как отображение времени и погодных данных, и заканчивая более сложными операциями, такими как элементарная медицинская диагностика и общение/поддержка клиентов. Вы можете разработать чат-бота, который будет помогать вашим клиентам, когда они задают определенные вопросы о вашем продукте, или создать персонального помощника-чатбота, который будет решать основные задачи и напоминать вам, когда пора отправляться на встречу или в спортзал.

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

Telegram — одна из самых популярных IM-платформ сегодня, поскольку она позволяет хранить сообщения в облаке, а не только на вашем устройстве, и может похвастаться хорошей мультиплатформенной поддержкой, поскольку Telegram можно использовать на Android, iOS, Windows и практически на любой другой платформе, поддерживающей веб-версию. Создание чат-бота в Telegram довольно простое и требует нескольких шагов, которые занимают очень мало времени. Чатбот может быть интегрирован в группы и каналы Telegram, а также работать сам по себе.

В этом уроке мы создадим Telegram-бота, который будет выдавать вам изображение аватара из Adorable Avatars. В нашем примере мы создадим бота с помощью Flask и развернем его на бесплатном сервере Heroku.

Чтобы пройти этот учебник, вам понадобится Python 3, установленный в вашей системе, а также навыки кодирования на Python. Хорошее понимание того, как работают приложения, будет хорошим дополнением, но не обязательным, так как мы будем подробно разбирать большую часть представленного материала. Вам также понадобится Git, установленный в вашей системе.

Конечно, для работы с учебником также требуется учетная запись Telegram, которая является бесплатной. Вы можете зарегистрироваться здесь. Также необходим аккаунт Heroku, который вы можете получить бесплатно здесь.

Создание вашего Telegram-бота

Чтобы создать чат-бота в Telegram, вам нужно обратиться к BotFather, который, по сути, является ботом, используемым для создания других ботов.

Нужная вам команда — /newbot, которая приведет к следующим шагам по созданию вашего бота:

Screenshot BotFather Telegram

Ваш бот должен иметь два атрибута: имя и имя пользователя. Имя будет отображаться для вашего бота, а имя пользователя будет использоваться для упоминаний и обмена.

После выбора имени бота и имени пользователя, которые должны заканчиваться на «bot», вы получите сообщение с маркером доступа, и вам, очевидно, нужно будет сохранить маркер доступа и имя пользователя на будущее, поскольку они вам еще понадобятся.

Кодирование логики чатбота

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

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

$ python -m venv botenv/

Теперь у нас будет каталог botenv/, который будет содержать все библиотеки Python, которые мы будем использовать. Выполните следующую команду и активируйте virtualenv:

$ source botenv/bin/activate

Библиотеки, необходимые для нашего бота, следующие:

  • Flask: Микро-веб фреймворк, созданный на Python.
  • Python-telegram-bot: Обертка Telegram на Python.
  • Requests: Популярная http-библиотека для Python.

Вы можете установить их в виртуальную среду с помощью команды pip следующим образом:

(telebot) $ pip install flask
(telebot) $ pip install python-telegram-bot
(telebot) $ pip install requests

Теперь давайте просмотрим каталог нашего проекта.

.
├── app.py
├── telebot
│   ├── credentials.py
│   |   .
│   |   вы можете создать свой движок здесь
│   |   .
│   └── __init__.py
└── botenv

В файле credentials.py нам понадобятся три переменные:

bot_token = "здесь находится ваш токен доступа от BotFather".
bot_user_name = "имя пользователя, которое вы ввели"
URL = "ссылка на приложение heroku, которую мы создадим позже"

Теперь давайте вернемся к нашему app.py и пройдемся по коду шаг за шагом:

# импорт всего
from flask import Flask, request
import telegram
from telebot.credentials import bot_token, bot_user_name,URL
global bot
global TOKEN
TOKEN = bot_token
bot = telegram.Bot(token=TOKEN)

Теперь у нас есть объект бота, который будет использоваться для любых действий, которые мы потребуем от бота.

# запускаем приложение flask
app = Flask(__name__)

Нам также необходимо привязать функции к определенным маршрутам. Другими словами, нам нужно указать Flask, что делать при вызове определенного адреса. Более подробную информацию о Flask и маршрутах можно найти здесь.

В нашем примере функция маршрута отвечает на URL-адрес, который, по сути, является /{token}, и это URL-адрес, который Telegram будет вызывать для получения ответов на сообщения, отправленные боту.

@app.route('/{}'.format(TOKEN), methods=['POST'])
def respond():
   # получить сообщение в формате JSON, а затем преобразовать его в объект Telegram
   update = telegram.Update.de_json(request.get_json(force=True), bot)

   chat_id = update.message.chat.id
   msg_id = update.message.message_id

   # Telegram понимает UTF-8, поэтому кодируйте текст для совместимости с юникодом
   text = update.message.text.encode('utf-8').decode()
   # только в целях отладки
   print("получил текстовое сообщение :", text)
   # в первый раз, когда вы вступаете в чат с ботом, оно же приветственное сообщение
   if text == "/start":
       # вывести приветственное сообщение
       bot_welcome = """
       Добро пожаловать в бот, бот использует сервис http://avatars.adorable.io/ для генерации крутых аватаров на основе введенного вами имени, поэтому, пожалуйста, введите имя и бот ответит аватаром для вашего имени.
       """
       # отправить приветственное сообщение
       bot.sendMessage(chat_id=chat_id, text=bot_welcome, reply_to_message_id=msg_id)


   else:
       try:
           # очистить сообщение, которое мы получили от любых неалфавитных символов
           text = re.sub(r"\W", "_", text)
           # создайте api ссылку для аватара на основе http://avatars.adorable.io/
           url = "https://api.adorable.io/avatars/285/{}.png".format(text.strip())
           # ответить фотографией на имя, которое прислал пользователь,
           # обратите внимание, что вы можете отправить фотографии по url, и telegram подберет их для вас
           bot.sendPhoto(chat_id=chat_id, photo=url, reply_to_message_id=msg_id)
       except Exception:
           # если что-то пошло не так
           bot.sendMessage(chat_id=chat_id, text="There was a problem in the name you used, please enter different name", reply_to_message_id=msg_id)

   return 'ok'

Интуитивный способ заставить эту функцию работать заключается в том, что мы будем вызывать ее каждую секунду, чтобы она проверяла, пришло ли новое сообщение, но мы не будем этого делать. Вместо этого мы будем использовать Webhook, который дает нам возможность позволить боту обращаться к нашему серверу всякий раз, когда вызывается сообщение, так что нам не нужно заставлять наш сервер мучиться в цикле ожидания прихода сообщения.

Итак, мы создадим функцию, которую нам самим нужно будет вызывать для активации Webhook Telegram, по сути, говоря Telegram вызывать определенную ссылку, когда приходит новое сообщение. Мы вызовем эту функцию только один раз, когда впервые создадим бота. Если вы измените ссылку приложения, то вам нужно будет снова запустить эту функцию с новой ссылкой.

Маршрут здесь может быть любым; вы сами будете вызывать его:

@app.route('/setwebhook', methods=['GET', 'POST'])
def set_webhook():
    # мы используем объект bot, чтобы связать бота с нашим приложением, которое живет
    # в ссылке, предоставленной URL
    s = bot.setWebhook('{URL}{HOOK}'.format(URL=URL, HOOK=TOKEN))
    # чтобы мы знали, что все работает
    if s:
        return "webhook setup ok"
    else:
        return "webhook setup failed"

Теперь, когда все готово, давайте просто сделаем причудливую домашнюю страницу, чтобы мы знали, что движок работает.

@app.route('/')
def index():
    return '.'
if __name__ == '__main__':
    # обратите внимание на аргумент threaded, который позволяет
    # вашему приложению иметь более одного потока
    app.run(threaded=True)

Давайте посмотрим на полную версию app.py:

import re
from flask import Flask, request
import telegram
from telebot.credentials import bot_token, bot_user_name,URL


global bot
global TOKEN
TOKEN = bot_token
bot = telegram.Bot(token=TOKEN)

app = Flask(__name__)

@app.route('/{}'.format(TOKEN), methods=['POST'])
def respond():
   # получить сообщение в формате JSON, а затем преобразовать его в объект Telegram
   update = telegram.Update.de_json(request.get_json(force=True), bot)

   chat_id = update.message.chat.id
   msg_id = update.message.message_id

   # Telegram понимает UTF-8, поэтому кодируйте текст для совместимости с юникодом
   text = update.message.text.encode('utf-8').decode()
   # только в целях отладки
   print("получил текстовое сообщение :", text)
   # в первый раз, когда вы вступаете в чат с ботом, оно же приветственное сообщение
   if text == "/start":
       # вывести приветственное сообщение
       bot_welcome = """
       Добро пожаловать в бот, бот использует сервис http://avatars.adorable.io/ для генерации крутых аватаров на основе введенного вами имени, поэтому, пожалуйста, введите имя и бот ответит аватаром для вашего имени.
       """
       # отправить приветственное сообщение
       bot.sendMessage(chat_id=chat_id, text=bot_welcome, reply_to_message_id=msg_id)


   else:
       try:
           # очистить сообщение, которое мы получили от любых неалфавитных символов
           text = re.sub(r"\W", "_", text)
           # создайте api ссылку для аватара на основе http://avatars.adorable.io/
           url = "https://api.adorable.io/avatars/285/{}.png".format(text.strip())
           # ответить фотографией на имя, которое прислал пользователь,
           # обратите внимание, что вы можете отправить фотографии по url, и telegram подберет их для вас
           bot.sendPhoto(chat_id=chat_id, photo=url, reply_to_message_id=msg_id)
       except Exception:
           # если что-то пошло не так
           bot.sendMessage(chat_id=chat_id, text="There was a problem in the name you used, please enter different name", reply_to_message_id=msg_id)

   return 'ok'

@app.route('/set_webhook', methods=['GET', 'POST'])
def set_webhook():
   s = bot.setWebhook('{URL}{HOOK}'.format(URL=URL, HOOK=TOKEN))
   if s:
       return "webhook setup ok"
   else:
       return "webhook setup failed"

@app.route('/')
def index():
   return '.'


if __name__ == '__main__':
   app.run(threaded=True)

Это последний фрагмент кода, который вы напишете в нашем руководстве. Теперь мы можем перейти к последнему шагу — запуску нашего приложения на Heroku.

Запуск нашего приложения на Heroku

Перед запуском нашего приложения нам понадобится несколько вещей.

Heroku не может знать, какие библиотеки использует ваш проект, поэтому мы должны сообщить ему об этом с помощью файла requirements.txt — частая проблема заключается в том, что вы неправильно пишете требования, поэтому будьте внимательны — и сгенерировать файл требований с помощью pip:

pip freeze > requirements.txt

Теперь у вас есть готовый файл требований.

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

web: gunicorn app:app

Завершающий шаг: Вы можете добавить файл .gitignore в свой проект, чтобы неиспользуемые файлы не загружались в хранилище.

В панели управления Heroku создайте новое приложение. После этого вы перейдете на страницу развертывания. Затем откройте вкладку Settings в новом окне и скопируйте домен приложения, который будет иметь вид https://appname.herokuapp.com/, и вставьте его в переменную URL в файле credentials.py.

Теперь вернитесь на вкладку » Deploy» и продолжите действия:

Примечание: Пользователи Windows и macOS могут выполнить шаги, описанные здесь.

Войдите в систему Heroku:

$ heroku login

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

$ heroku login -i

Инициализируйте Git-репозиторий в нашей директории:

$ git init
$ heroku git:remote -a {heroku-project-name}

Развертывание приложения:

$ git add .
$ git commit -m "first commit"
$ git push heroku master

В этот момент вы увидите прогресс сборки в вашем терминале. Если все прошло нормально, вы увидите что-то вроде этого:

remote: -----> Launching...
remote:        Released v6
remote:        https://project-name.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.

Теперь перейдите на страницу приложения (ссылка домена, которую вы скопировали ранее) и добавьте в конец ссылки /setwebhook так, чтобы адрес был что-то вроде https://appname.herokuapp.com/setwebhook. Если вы видите, что webhook настроен нормально, значит, вы готовы к работе!

Завершение. Telegram бот готов

Теперь ваш бот Telegram работает круглосуточно и без вашего вмешательства. Вы можете добавить в бота любую логику, какую захотите.

Надеюсь, вам было интересно создавать своего первого бота Telegram.


Добавить комментарий