原文:Facebook chat bot aka joke bot with django tutorial
机器人时代已经开始了。如今,聊天机器人引起轰动,并被誉为下一代的网站和应用的替代品。许多平台都开发了聊天机器人作为交互式工具,例如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。
来源:-