带 django 教程的 Facebook 聊天机器人、又名笑话机器人
机器人时代已经开始了。如今,聊天机器人引起轰动,并被誉为下一代的网站和应用的替代品。许多平台都开发了聊天机器人作为交互式工具,例如 Facebook, Telegram 等等。聊天机器人在中国的通讯巨头 WeChat 中颇负盛名,其中,人们通过聊天预定出租车和进行金融交易。
我决定尝试开发一个聊天机器人,它只做一件事。不管用户输入什么,它都发送一个像下面这样的不含图片的随机笑话。
作为开始,我们将要在 django 中开发它。为什么是 django 呢?我擅长于 python,因此使用 Django,你可以使用任何你喜欢的。官方文档是用于 node.js 的。
- 从这里 创建一个页面 | Facebook 创建一个 facebook 页面。选择一些页面类型并进行设置。
- 从这里 登录到 Facebook | Facebook 创建一个 facebook 应用,并填写所需的详细信息来创建一个应用。
- 一旦页面和应用都创建好了,那么转到应用设置,并在 Product Settings 下点击 Add Product,然后选择 Messenger 。
- 现在,你需要设置网络钩子。我们需要将该 django 项目部署在线,并且使其可为 facebook 创建请求,而 facebook 只允许 https url。 Your development environment, in the cloud 是我发现在线的最佳选择,而它对于一个基本的应用是免费的。在 c9 中创建工作空间,选择 Django 作为平台。现在,你将被定向到你的在线工作空间。
- 在工作区中,使用下面的命令来创建一个 django 应用。
django-admin.py startapp jokebot
这应该创建一个应用 jokebot。
转到工作空间中的 settings.py 文件,找到 INSTALLED_APPS,并添加 jokebot。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'jokebot',
]
修改 urls.py 以包含网络钩子的端点。该网络钩子将拦截端点 url/james,而我们必须返回一个 token 以供 facebook 验证。
from django.conf.urls import url, include
from django.contrib import admin
from jokebot.views import jokebot
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^james/?$', jokebot.as_view())
]
现在,打开应用 jokebot 中的 views.py ,并如下修改它。
import json, requests, random, re
from pprint import pprint
from django.views import generic
from django.http.response import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
def get_joke(fbid, recevied_message):
joke_text = requests.get("http://api.icndb.com/jokes/random/").json()['value']['joke']
post_message_url = 'https://graph.facebook.com/v2.6/me/messages?access_token=%s'%'Place your access token here'
response_msg = json.dumps({"recipient":{"id":fbid}, "message":{"text":joke_text}})
status = requests.post(post_message_url, headers={"Content-Type": "application/json"},data=response_msg)
pprint(status.json())
class jokebot(generic.View):
def get(self, request, *args, **kwargs):
if self.request.GET['hub.verify_token'] == verify_token:
return HttpResponse(self.request.GET['hub.challenge'])
else:
return HttpResponse('Error, invalid token')
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return generic.View.dispatch(self, request, *args, **kwargs)
def post(self, request, *args, **kwargs):
incoming_message = json.loads(self.request.body.decode('utf-8'))
for entry in incoming_message['entry']:
for message in entry['messaging']:
if 'message' in message:
get_joke(message['sender']['id'], message['message']['text'])
return HttpResponse()
我们创建了一个类 jokebot,它响应一个网络钩子请求中的
self.request.GET['hub.challenge']
在"PRODUCT SETTINGS"部分,点击你刚刚添加的"Messenger"产品,找到 Webhooks 部分,点击 Setup Webhooks。为网络钩子输入一个 URL,输入一个验证令牌,并在 Subscription 字段下选择 message_deliveries, messages, messaging_optins, 和 messaging_postbacks。
选择任意 verify_token,并将其放到 facebook 和代码中。要获得 url,点击 c9 中的 Run ,并将 url/james 放到回调的 url 选项中。现在,点击 Verify and Save,然后应该就可以让该网络钩子被验证。
现在,我们使用这个代码处理消息并发送一个笑话
def post(self, request, *args, **kwargs):
incoming_message = json.loads(self.request.body.decode('utf-8'))
for entry in incoming_message['entry']:
for message in entry['messaging']:
if 'message' in message:
get_joke(message['sender']['id'], message['message']['text'])
return HttpResponse()
这基本上读取一个消息的 Post 请求,并用一个笑话进行响应。
def get_joke(fbid, recevied_message):
joke_text = requests.get("http://api.icndb.com/jokes/random/").json()['value']['joke']
post_message_url = 'https://graph.facebook.com/v2.6/me/messages?access_token=%s'%'Place your access token here'
response_msg = json.dumps({"recipient":{"id":fbid}, "message":{"text":joke_text}})
status = requests.post(post_message_url, headers={"Content-Type": "application/json"},data=response_msg)
pprint(status.json())
这个函数使用一个在线 API The Internet ChuckNorris Database 获取一个随机笑话,然后将其发送回给用户。
要获得 Token Generation 部分的页面访问令牌,选择你的 Page。一个 Page Access Token 将会为你生成。复制此 Page Access Token。注意:生成的令牌将不在此 UI 进行保存。每次选择那个 Page,都将会生成新的令牌。然而,任何之前创建令牌将继续发挥作用。
所以现在再次运行服务器并发送一条消息,你应该会得到一个 Chuck Norris 笑话。请记住,应用程序现在仅适用于你。为了使其公开,你必须请求 fb 批准您的应用程序并进行发布。
你可以在这里发现完整的代码 Anil1331/Facebook-chat-bot 。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: Django 中正确处理数据库并发的方法
下一篇: 使用 Django 进行原型化
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论