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

Опубликовано: 2022-03-11

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

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

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

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

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

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

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

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

Оживление вашего Telegram-бота

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

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

Учебник по ботам в Telegram — пример скриншота

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

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

Закодируйте логику чат-бота

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

Во-первых, давайте создадим виртуальную среду. Это помогает изолировать требования вашего проекта от глобальной среды Python.

 $ python -m venv botenv/

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

 $ source botenv/bin/activate

Библиотеки, которые нам нужны для нашего бота:

  • Flask: микровеб-фреймворк, построенный на Python.
  • Python-telegram-bot: оболочка Telegram на Python.
  • Запросы: популярная http-библиотека Python.

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

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

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

 . ├── app.py ├── telebot │ ├── credentials.py │ | . │ | you can build your engine here │ | . │ └── __init__.py └── botenv

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

 bot_token = "here goes your access token from BotFather" bot_user_name = "the username you entered" URL = "the heroku app link that we will create later"

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

 # import everything 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)

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

 # start the flask app app = Flask(__name__)

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

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

 @app.route('/{}'.format(TOKEN), methods=['POST']) def respond(): # retrieve the message in JSON and then transform it to Telegram object update = telegram.Update.de_json(request.get_json(force=True), bot) chat_id = update.message.chat.id msg_id = update.message.message_id # Telegram understands UTF-8, so encode text for unicode compatibility text = update.message.text.encode('utf-8').decode() # for debugging purposes only print("got text message :", text) # the first time you chat with the bot AKA the welcoming message if text == "/start": # print the welcoming message bot_welcome = """ Welcome to coolAvatar bot, the bot is using the service from http://avatars.adorable.io/ to generate cool looking avatars based on the name you enter so please enter a name and the bot will reply with an avatar for your name. """ # send the welcoming message bot.sendMessage(chat_id=chat_id, text=bot_welcome, reply_to_message_id=msg_id) else: try: # clear the message we got from any non alphabets text = re.sub(r"\W", "_", text) # create the api link for the avatar based on http://avatars.adorable.io/ url = "https://api.adorable.io/avatars/285/{}.png".format(text.strip()) # reply with a photo to the name the user sent, # note that you can send photos by url and telegram will fetch it for you bot.sendPhoto(chat_id=chat_id, photo=url, reply_to_message_id=msg_id) except Exception: # if things went wrong 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, который дает нам возможность позволить боту вызывать наш сервер всякий раз, когда вызывается сообщение, так что нам не нужно заставлять наш сервер страдать в цикле while, ожидая прихода сообщения.

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

Маршрут здесь может быть любым; ты тот, кто назовет это:

 @app.route('/setwebhook', methods=['GET', 'POST']) def set_webhook(): # we use the bot object to link the bot to our app which live # in the link provided by URL s = bot.setWebhook('{URL}{HOOK}'.format(URL=URL, HOOK=TOKEN)) # something to let us know things work if s: return "webhook setup ok" else: return "webhook setup failed"

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

 @app.route('/') def index(): return '.' if __name__ == '__main__': # note the threaded arg which allow # your app to have more than one thread 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(): # retrieve the message in JSON and then transform it to Telegram object update = telegram.Update.de_json(request.get_json(force=True), bot) chat_id = update.message.chat.id msg_id = update.message.message_id # Telegram understands UTF-8, so encode text for unicode compatibility text = update.message.text.encode('utf-8').decode() # for debugging purposes only print("got text message :", text) # the first time you chat with the bot AKA the welcoming message if text == "/start": # print the welcoming message bot_welcome = """ Welcome to coolAvatar bot, the bot is using the service from http://avatars.adorable.io/ to generate cool looking avatars based on the name you enter so please enter a name and the bot will reply with an avatar for your name. """ # send the welcoming message bot.sendMessage(chat_id=chat_id, text=bot_welcome, reply_to_message_id=msg_id) else: try: # clear the message we got from any non alphabets text = re.sub(r"\W", "_", text) # create the api link for the avatar based on http://avatars.adorable.io/ url = "https://api.adorable.io/avatars/285/{}.png".format(text.strip()) # reply with a photo to the name the user sent, # note that you can send photos by url and telegram will fetch it for you bot.sendPhoto(chat_id=chat_id, photo=url, reply_to_message_id=msg_id) except Exception: # if things went wrong 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 создайте новое приложение. Как только вы это сделаете, он направит вас на страницу развертывания . Затем откройте вкладку « Настройки » в новом окне и скопируйте домен приложения, который будет выглядеть примерно так: https://appname.herokuapp.com/ , и вставьте его в переменную URL-адреса внутри credentials.py .

Скриншот приборной панели Heroku

Теперь вернитесь на вкладку Deploy и выполните следующие шаги:

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

Войдите в Heroku:

 $ heroku login

Обратите внимание, что этот метод иногда зависает в waiting for 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 setup ok , это означает, что вы готовы к работе!

Теперь поговорите со своим ботом

Живая версия чат-бота Telegram
Живая версия бота

Последние штрихи, советы и хитрости

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

Следующий фрагмент кода из функции respond() :

 if text == "/start": # print the welcoming message bot_welcome = """ Welcome to coolAvatar bot, the bot is using the service from http://avatars.adorable.io/ to generate cool looking avatars based on the name you enter so please enter a name and the bot will reply with an avatar for your name. """ # send the welcoming message bot.sendChatAction(chat_id=chat_id, action="typing") sleep(1.5) bot.sendMessage(chat_id=chat_id, text=bot_welcome, reply_to_message_id=msg_id) else: try: # clear the message we got from any non alphabets text = re.sub(r"\W", "_", text) # create the api link for the avatar based on http://avatars.adorable.io/ url = "https://api.adorable.io/avatars/285/{}.png".format(text.strip()) # reply with a photo to the name the user sent, # note that you can send photos by url and telegram will fetch it for you bot.sendChatAction(chat_id=chat_id, action="upload_photo") sleep(2) bot.sendPhoto(chat_id=chat_id, photo=url, reply_to_message_id=msg_id) except Exception: # if things went wrong 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)

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

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

Еще много простых примеров телеграмм-ботов можно найти на странице python-telegram-bot на GitHub.

Вы можете использовать нашего бота и сделать его следующим суперроботом с искусственным интеллектом — все, что вам нужно сделать, это интегрировать свою логику в функцию respond() . Например, ваша логика может быть в отдельном модуле и может вызываться внутри функции respond() следующим образом:

 . ├── app.py ├── telebot │ ├── credentials.py │ ├──ai.py │ | . │ | you can build your engine here │ | . │ └── __init__.py └── botenv

И внутри ai .py :

 def generate_smart_reply(text): # here we can do all our work return "this is a smart reply from the ai!"

Импортируйте его прямо сейчас в приложение .py :

 import re from time import sleep from flask import Flask, request import telegram From telebot.ai import generate_smart_reply from telebot.credentials import bot_token, bot_user_name,URL

Затем просто вызовите его внутри кода respond() .

 def respond(): # retrieve the message in JSON and then transform it to Telegram object update = telegram.Update.de_json(request.get_json(force=True), bot) chat_id = update.message.chat.id msg_id = update.message.message_id # Telegram understands UTF-8, so encode text for unicode compatibility text = update.message.text.encode('utf-8').decode() # for debugging purposes only print("got text message :", text) # here call your smart reply message reply = generate_smart_reply(text) bot.sendMessage(chat_id=chat_id, text=reply, reply_to_message_id=msg_id)

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

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

Дополнительные ресурсы

  • Создание чат-бота с использованием Telegram и Python
  • Простой способ настроить Telegram Bot WebHook
  • Репозиторий Python-telegram-bot
  • Развертывание с помощью Git на Heroku
  • Документация по Python Telegram Bot
Связанный: Создайте чат-бот WhatsApp, а не приложение