作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
阿里·阿卜杜勒·阿尔的头像

Ali Abdel Aal

Ali已经构建了多个NLP系统,并在各种机器学习工具和Python库方面拥有实践经验.

Expertise

Previously At

IBM
Share

聊天机器人经常被吹捧为用户与技术和企业互动方式的一场革命. 与传统应用程序相比,它们的界面相当简单, 因为他们只需要用户聊天, 聊天机器人应该理解并完成用户的任何要求, at least in theory.

许多行业正在将客户服务转向聊天机器人系统. 这是因为与实际人类相比,成本大幅下降, 也因为它的健壮性和持续可用性. 聊天机器人提供一定程度的用户支持,而不需要大量的额外成本.

Today, 聊天机器人用于许多场景, 从显示时间和天气数据等简单的任务到基本的医疗诊断和客户沟通/支持等更复杂的操作. 你可以设计一个聊天机器人,当你的客户问你的产品的某些问题时,它会帮助你, 或者你可以做一个个人助理聊天机器人,它可以处理基本的任务,并提醒你什么时候该去开会或去健身房.

谈到在哪里部署聊天机器人,有很多选择, 最常见的用途之一是社交媒体平台, 因为大多数人经常使用它们. 即时通讯应用程序也是如此,不过需要注意一些问题.

Telegram 是当今最流行的即时通讯平台之一吗, 因为它允许你将消息存储在云端,而不仅仅是你的设备上,而且它拥有良好的多平台支持, 就像你在安卓上使用Telegram一样, iOS, Windows, 以及其他可以支持网络版本的平台. 在Telegram上构建聊天机器人相当简单,只需要很少的步骤,花费很少的时间就可以完成. 聊天机器人可以集成到Telegram的群组和频道中,也可以独立工作.

在本教程中,我们将创建一个Python Telegram机器人,为您提供来自 Adorable Avatars. 我们的示例将涉及使用Flask构建一个bot,并将其部署到免费的Heroku服务器上.

要完成本教程,您需要 Python 3 安装在您的系统上 Python编程技能. Also, 了解应用程序的工作原理将是一个很好的补充, but not a must, 因为我们将会详细讲解大部分的内容. You also need Git 安装在您的系统上.

当然,该教程还需要一个免费的Telegram帐户. You can sign up here. Heroku账户也是必需的,你可以免费获得 here.

入门:如何制作一个电报机器人

要在Telegram上创建聊天机器人,您需要联系 BotFather,它本质上是一个用来创建其他机器人的机器人.

您需要的命令是 /newbot 下面是创建bot的步骤:

电报机器人教程-截图示例

您的bot应该有两个属性:名称和用户名. 这个名字会出现在你的聊天机器人上,而用户名将用于提及和分享.

在选择bot名称和用户名(必须以“bot”结尾)之后,您将获得一条包含访问令牌的消息, 显然,您需要保存访问令牌和用户名以备以后使用, 因为你会需要它们.

编写聊天机器人逻辑代码

我们将在本教程中使用Ubuntu. For Windows users, 这里的大多数命令都可以正常工作,没有任何问题, 但是如果您在虚拟环境设置中遇到任何问题, please consult this link. 对于Mac用户来说,本教程应该可以很好地工作.

首先,让我们创建一个虚拟环境. 它有助于将项目的需求与全局Python环境隔离开来.

$ python -m venv botenv/

Now we will have a botenv/ 目录,其中包含我们将使用的所有Python库. 继续激活 virtualenv 使用如下命令:

$ source botenv/bin/activate

我们的bot需要的库是:

您可以使用pip命令在虚拟环境中安装它们,如下所示:

$ PIP安装flask
$ PIP安装python-telegram-bot
(telebot) $ PIP安装请求

现在让我们浏览我们的项目目录.

.
├── app.py
├── telebot
│├──├.py
│   |   .
│|您可以在这里构建您的引擎
│   |   .
│   └── __init__.py
└── botenv

In the credentials.py 文件中我们将需要三个变量:

bot_token = "这是来自BotFather的访问令牌"
Bot_user_name = "您输入的用户名"
URL = "稍后创建的heroku应用链接"

现在回到我们的app.Py并一步一步地通过代码:

# import everything
从flask中导入flask
import telegram
from telebot.导入bot_token, bot_user_name,URL
global bot
global TOKEN
TOKEN = bot_token
bot = telegram.Bot(token=TOKEN)

现在我们有了bot对象,它将用于我们要求bot执行的任何操作.

#启动flask应用
app = Flask(__name__)

我们还需要将函数绑定到特定的路由. 换句话说,我们需要告诉Flask在调用特定地址时该做什么. 更多关于Flask和路由的详细信息可以在这里找到 here.

在我们的示例中,route函数响应的URL基本上是 /{token},这是Telegram将调用的URL,以获取发送给bot的消息的响应.

@app.route('/{}'.格式(令牌)、方法=['文章'])
def respond():
   #检索JSON格式的消息,然后将其转换为Telegram对象
   update = telegram.Update.de_json(request.get_json(力= True),机器人)

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

   电报理解UTF-8,所以编码文本以兼容unicode
   text = update.message.text.encode('utf-8').decode()
   #仅用于调试目的
   打印(“收到短信:”,文本)
   #你第一次和机器人聊天又名欢迎信息
   如果text == "/start":
       #打印欢迎信息
       bot_welcome = """
       欢迎来到coolAvatar机器人,这个机器人正在使用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)
           #创建基于http://avatars的头像的API链接.adorable.io/
           url = "http://api.adorable.io/avatars/285/{}.png".format(text.strip())
           #回复用户发送的名字的照片
           请注意,您可以通过url发送照片,电报将为您获取
           bot.sendPhoto(chat_id=chat_id, photo=url, reply_to_message_id = msg_id)
       except Exception:
           #如果出了问题
           bot.sendMessage (chat_id = chat_id, text=“您使用的名称有问题, 请输入不同的名称”, reply_to_message_id = msg_id)

   return 'ok'

让这个函数工作的直观方法是我们每秒调用一次, 以便检查是否有新消息到达, 但我们不会那样做. 相反,我们将使用 Webhook 这为我们提供了一种让bot在调用消息时调用服务器的方法, 这样我们就不需要让我们的服务器在等待消息到来的while循环中受苦.

So, 我们将创建一个我们自己需要调用的函数来激活Telegram的Webhook, 基本上是告诉Telegram在新消息到达时调用特定的链接. 我们将只在第一次创建bot时调用这个函数一次. 如果您更改了应用程序链接,那么您将需要使用新链接再次运行此函数.

The route here can be anything; you’re the one who will call it:

@app.route('/setwebhook', methods=['GET', 'POST'])
def set_webhook():
    #我们使用bot对象将bot链接到我们的应用程序
    #在URL提供的链接中
    s = bot.setWebhook (' {URL}{钩}'.格式(URL = URL,钩=令牌))
    让我们知道事情是否有效的东西
    if s:
        返回"webhook setup ok"
    else:
        返回"webhook设置失败"

现在一切都设置好了,让我们制作一个漂亮的主页,这样我们就知道引擎已经启动了.

@app.route('/')
def index():
    return '.'
如果__name__ == '__main__':
    注意线程参数允许
    #你的应用程序有多个线程
    app.run(threaded=True)

让我们来看看完整版的应用程序.py:

import re
从flask中导入flask
import telegram
from telebot.导入bot_token, bot_user_name,URL


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

app = Flask(__name__)

@app.route('/{}'.格式(令牌)、方法=['文章'])
def respond():
   #检索JSON格式的消息,然后将其转换为Telegram对象
   update = telegram.Update.de_json(request.get_json(力= True),机器人)

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

   电报理解UTF-8,所以编码文本以兼容unicode
   text = update.message.text.encode('utf-8').decode()
   #仅用于调试目的
   打印(“收到短信:”,文本)
   #你第一次和机器人聊天又名欢迎信息
   如果text == "/start":
       #打印欢迎信息
       bot_welcome = """
       欢迎来到coolAvatar机器人,这个机器人正在使用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)
           #创建基于http://avatars的头像的API链接.adorable.io/
           url = "http://api.adorable.io/avatars/285/{}.png".format(text.strip())
           #回复用户发送的名字的照片
           请注意,您可以通过url发送照片,电报将为您获取
           bot.sendPhoto(chat_id=chat_id, photo=url, reply_to_message_id = msg_id)
       except Exception:
           #如果出了问题
           bot.sendMessage (chat_id = chat_id, text=“您使用的名称有问题, 请输入不同的名称”, reply_to_message_id = msg_id)

   return 'ok'

@app.route('/set_webhook', methods=['GET', 'POST'])
def set_webhook():
   s = bot.setWebhook (' {URL}{钩}'.格式(URL = URL,钩=令牌))
   if s:
       返回"webhook setup ok"
   else:
       返回"webhook设置失败"

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


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

这是您将在本教程中编写的最后一段代码. 现在我们可以进入最后一步,在Heroku上启动我们的应用程序.

在Heroku上发布我们的应用

在制作应用程序之前,我们需要做一些事情.

Heroku不知道你的项目使用了哪些库,所以我们必须使用 requirements.txt 文件—常见的问题是您拼错了需求, 因此,要小心使用pip生成需求文件:

pip freeze > requirements.txt

现在您已经准备好了需求文件.

Now you need the Procfile 它告诉Heroku我们的应用从哪里开始,所以创建一个 Procfile 文件并添加以下内容:

Web: gunicorn app:app

一个弹跳步骤:您可以添加一个 .gitignore 文件到您的项目,这样不用的文件就不会被上传到存储库.

From your Heroku dashboard, create a new app. 一旦你找到了,它会指引你到 Deploy page. Then, open the Settings 选项卡在一个新的窗口,并复制应用程序的域,这将是类似的 http://appname.herokuapp.com/ 并粘贴到URL变量中 credentials.py.

Heroku仪表盘截图

现在,回到 Deploy TAB键并继续以下步骤:

Note: Windows和macOS用户可以按照描述的步骤操作 here.

Log in to Heroku:

$ heroku login

请注意,这种方法有时会卡住 waiting for login,如果您遇到这种情况,请尝试使用以下命令登录:

$ heroku login -i

在我们的目录中初始化一个Git存储库:

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

Deploy the app:

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

此时,您将在终端中看到构建进度. 如果一切正常,您将看到如下内容:

remote: -----> Launching...
remote:已发布v6版本
远程:http://project-name.herokuapp.部署到Heroku
remote:
remote:验证部署... done.

现在转到app页面(你之前复制的域名的链接),并添加到链接的末尾 /setwebhook 地址会是这样的 http://appname.herokuapp.com/setwebhook. If you see webhook setup ok,那就意味着你准备好出发了!

现在去和你的机器人谈谈

Telegram聊天机器人的实时版本

最后的润色,技巧和技巧

现在你的Telegram机器人已经启动并全天候运行,不需要你的干预. 您可以向bot添加任何您想要的逻辑, so, for example, 你可以通过添加“打字”状态和发送照片状态使你的机器人更逼真,如下所示:

的下一个代码片段 respond() function:

   如果text == "/start":
       #打印欢迎信息
       bot_welcome = """
       欢迎来到coolAvatar机器人,这个机器人正在使用http://avatars提供的服务.adorable.Io /生成基于你输入的名字很酷的头像,所以请输入一个名字,机器人会回复你的名字的头像.
       """
       #发送欢迎信息
       bot.sendChatAction (chat_id = chat_id action =“输入”)
       sleep(1.5)
       bot.sendMessage (chat_id = chat_id, text=bot_welcome, reply_to_message_id = msg_id)


   else:
       try:
           #清除我们从非字母处得到的信息
           text = re.sub(r"\W", "_", text)
           #创建基于http://avatars的头像的API链接.adorable.io/
           url = "http://api.adorable.io/avatars/285/{}.png".format(text.strip())
           #回复用户发送的名字的照片
           请注意,您可以通过url发送照片,电报将为您获取
           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:
           #如果出了问题
           bot.sendMessage (chat_id = chat_id, text=“您使用的名称有问题, 请输入不同的名称”, reply_to_message_id = msg_id)

正如您在代码片段中看到的那样, 我们添加了一个输入操作,当我们即将发送关于机器人的信息,这是在文本格式, 并增加了一个上传照片的动作,当我们要发送一张照片,使机器人更逼真. 可以找到更多的行动 here.

您还可以从BotFather通道更改bot图像和描述,以使其更友好.

更多简单的电报机器人的例子可以在 python-telegram-bot page on GitHub.

你可以以我们的机器人为基础,使它成为下一个超级人工智能机器人——你所需要做的就是把你的逻辑整合到 respond() function. 例如,您的逻辑可以在单独的模块中,并且可以在 respond() function like so:

.
├── app.py
├── telebot
│├──├.py
│   ├──ai.py
│   |   .
│|您可以在这里构建您的引擎
│   |   .
│   └── __init__.py
└── botenv

And inside of ai.py :

def generate_smart_reply(文本):
    在这里我们可以做所有的工作
    这是ai的一个聪明的回答!"

将其导入 app.py :

import re
从时间导入睡眠
从flask中导入flask
import telegram
From telebot.导入generate_smart_reply
from telebot.导入bot_token, bot_user_name,URL

那就在 respond() code.

def respond():
   #检索JSON格式的消息,然后将其转换为Telegram对象
   update = telegram.Update.de_json(request.get_json(力= True),机器人)

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

   电报理解UTF-8,所以编码文本以兼容unicode
   text = update.message.text.encode('utf-8').decode()
   #仅用于调试目的
   打印(“收到短信:”,文本)
   #这里调用您的智能回复消息
   回复= generate_smart_reply(text)
   bot.sendMessage (chat_id = chat_id, text=reply, reply_to_message_id = msg_id)

现在你可以让你的机器人按照你想要的方式工作了——继续前进,创造下一个伟大的东西!

我希望您在学习如何用Python创建Telegram bot时感到愉快.

额外的资源

了解基本知识

  • 什么是电报机器人?

    Telegram bot是一种自动化软件,旨在帮助用户通过与系统的最小交互来满足他们的需求,并通过理解用户所说的话来提供最佳结果.

  • 电报机器人安全吗??

    考虑到使用端到端加密,电报机器人会遇到一些问题, 因为它们使用的加密技术与用户消息中使用的加密技术不同. 这使得机器人容易受到攻击,攻击者可以访问聊天消息,所以用户应该小心.

  • 弗拉斯克有什么用呢?

    Flask是一个用Python编写的微web框架. 我们用它以最小的努力构建了我们的web服务器.

  • Heroku的目的是什么?

    Heroku是一个支持多种编程语言的云平台即服务(Paas). 在本教程中,我们使用它来承载我们的逻辑并保持它一直运行.

就这一主题咨询作者或专家.
Schedule a call
阿里·阿卜杜勒·阿尔的头像
Ali Abdel Aal

Located in Cairo, Egypt

Member since August 8, 2018

About the author

Ali已经构建了多个NLP系统,并在各种机器学习工具和Python库方面拥有实践经验.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

Expertise

Previously At

IBM

世界级的文章,每周发一次.

订阅意味着同意我们的 privacy policy

世界级的文章,每周发一次.

订阅意味着同意我们的 privacy policy

Toptal Developers

Join the Toptal® community.