带 django 教程的 Facebook 聊天机器人、又名笑话机器人

发布于 2024-08-17 13:47:14 字数 6128 浏览 5 评论 0

机器人时代已经开始了。如今,聊天机器人引起轰动,并被誉为下一代的网站和应用的替代品。许多平台都开发了聊天机器人作为交互式工具,例如 Facebook, Telegram 等等。聊天机器人在中国的通讯巨头 WeChat 中颇负盛名,其中,人们通过聊天预定出租车和进行金融交易。

我决定尝试开发一个聊天机器人,它只做一件事。不管用户输入什么,它都发送一个像下面这样的不含图片的随机笑话。

作为开始,我们将要在 django 中开发它。为什么是 django 呢?我擅长于 python,因此使用 Django,你可以使用任何你喜欢的。官方文档是用于 node.js 的。

  1. 从这里 创建一个页面 | Facebook 创建一个 facebook 页面。选择一些页面类型并进行设置。
  2. 从这里 登录到 Facebook | Facebook 创建一个 facebook 应用,并填写所需的详细信息来创建一个应用。
  3. 一旦页面和应用都创建好了,那么转到应用设置,并在 Product Settings 下点击 Add Product,然后选择 Messenger
  4. 现在,你需要设置网络钩子。我们需要将该 django 项目部署在线,并且使其可为 facebook 创建请求,而 facebook 只允许 https url。 Your development environment, in the cloud 是我发现在线的最佳选择,而它对于一个基本的应用是免费的。在 c9 中创建工作空间,选择 Django 作为平台。现在,你将被定向到你的在线工作空间。
  5. 在工作区中,使用下面的命令来创建一个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
23 人气
更多

推荐作者

风暴

文章 0 评论 0

乐玩

文章 0 评论 0

英雄似剑

文章 0 评论 0

秋风の叶未落

文章 0 评论 0

luoshaoja

文章 0 评论 0

吴彦文

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文