作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
Ali已经构建了多个NLP系统,并在各种机器学习工具和Python库方面拥有实践经验.
聊天机器人经常被吹捧为用户与技术和企业互动方式的一场革命. 与传统应用程序相比,它们的界面相当简单, 因为他们只需要用户聊天, 聊天机器人应该理解并完成用户的任何要求, 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不知道你的项目使用了哪些库,所以我们必须使用 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
.
现在,回到 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机器人已经启动并全天候运行,不需要你的干预. 您可以向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是一个支持多种编程语言的云平台即服务(Paas). 在本教程中,我们使用它来承载我们的逻辑并保持它一直运行.
世界级的文章,每周发一次.
世界级的文章,每周发一次.
Join the Toptal® community.