使用 FB Messenger 和 Django 的 Echo 机器人
Echo bot using FB Messenger and Django
我有以下观点:
import json, requests
from pprint import pprint
from django.shortcuts import render
from django.http import HttpResponse
from django.views.generic import View
from django.views.decorators.csrf import csrf_exempt
def echo(fb_id, received_message):
post_message_url = 'https://graph.facebook.com/v2.6/me/messages?access_token=EAAPZASejNRr4BACmWieSuuFpTcK9ZCZB7sJzdZCnw0WS3lUI6RXIZArgwt8m8Qg9JMm4GZACyIFPCG0CnubFxxfzzRomplntBHhr4ZCKzupGJZCiLjnw9UrUmgQWbCGXi5at9vZBVVmKFYSGfDZCVoY83KIIO62XiFXAr6Ut2OQIS2aAZDZD'
reply = json.dumps({
'recipient': {'id': fb_id},
'message': {'text': received_message},
})
status = requests.post(post_message_url, headers={'Content-Type': 'application/json'}, data=reply)
pprint(status.json())
class FbBotView(View):
@csrf_exempt
def dispatch(self, request, *args, **kwargs):
return View.dispatch(self, self.request, *args, **kwargs)
def get(self, request, *args, **kwargs):
if self.request.GET['hub.verify_token'] == '25461261':
return HttpResponse(request.GET['hub.challenge'])
else:
return HttpResponse('Error: Incorrect verification token')
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:
pprint(message)
echo(message['sender']['id'], message['message']['text'])
return HttpResponse()
给出的教程 here 说 echo 函数应该在 FbBotView class 中。果然,当我将 echo 函数放入 class FbBotView 时,机器人无法回显。为什么会这样?
如果我看清楚了教程,它说的是外面而不是里面...
# yomamabot/fb_yomamabot/views.py
# This function should be outside the BotsView class
def post_facebook_message(fbid, recevied_message):
post_message_url = 'https://graph.facebook.com/v2.6/me/messages?access_token=<page-access-token>'
response_msg = json.dumps({"recipient":{"id":fbid}, "message":{"text":recevied_message}})
status = requests.post(post_message_url, headers={"Content-Type": "application/json"},data=response_msg)
pprint(status.json())
我认为原因是您在 Django 中使用 class-based views 而不是基于函数的视图,这就是为什么您不能在 FbBotView
.[=13 中使用自定义方法的原因=]
我有以下观点:
import json, requests
from pprint import pprint
from django.shortcuts import render
from django.http import HttpResponse
from django.views.generic import View
from django.views.decorators.csrf import csrf_exempt
def echo(fb_id, received_message):
post_message_url = 'https://graph.facebook.com/v2.6/me/messages?access_token=EAAPZASejNRr4BACmWieSuuFpTcK9ZCZB7sJzdZCnw0WS3lUI6RXIZArgwt8m8Qg9JMm4GZACyIFPCG0CnubFxxfzzRomplntBHhr4ZCKzupGJZCiLjnw9UrUmgQWbCGXi5at9vZBVVmKFYSGfDZCVoY83KIIO62XiFXAr6Ut2OQIS2aAZDZD'
reply = json.dumps({
'recipient': {'id': fb_id},
'message': {'text': received_message},
})
status = requests.post(post_message_url, headers={'Content-Type': 'application/json'}, data=reply)
pprint(status.json())
class FbBotView(View):
@csrf_exempt
def dispatch(self, request, *args, **kwargs):
return View.dispatch(self, self.request, *args, **kwargs)
def get(self, request, *args, **kwargs):
if self.request.GET['hub.verify_token'] == '25461261':
return HttpResponse(request.GET['hub.challenge'])
else:
return HttpResponse('Error: Incorrect verification token')
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:
pprint(message)
echo(message['sender']['id'], message['message']['text'])
return HttpResponse()
给出的教程 here 说 echo 函数应该在 FbBotView class 中。果然,当我将 echo 函数放入 class FbBotView 时,机器人无法回显。为什么会这样?
如果我看清楚了教程,它说的是外面而不是里面...
# yomamabot/fb_yomamabot/views.py
# This function should be outside the BotsView class
def post_facebook_message(fbid, recevied_message):
post_message_url = 'https://graph.facebook.com/v2.6/me/messages?access_token=<page-access-token>'
response_msg = json.dumps({"recipient":{"id":fbid}, "message":{"text":recevied_message}})
status = requests.post(post_message_url, headers={"Content-Type": "application/json"},data=response_msg)
pprint(status.json())
我认为原因是您在 Django 中使用 class-based views 而不是基于函数的视图,这就是为什么您不能在 FbBotView
.[=13 中使用自定义方法的原因=]