与瓶

2016-05-05 24 views
1

我试图让FB信使API使用Python的瓶,调整下面的说明工作的Facebook Messenger的:https://developers.facebook.com/docs/messenger-platform/quickstart与瓶

到目前为止,事情已经做得较好。我验证了我的回调,并且能够接收我在我的页面上使用Messenger发送的消息,就像在我的heroku服务器中的日志中指出我的服务器正在接收相应的数据包。现在,我正在努力向客户端发送回应消息,以传递我的应用程序。特别是,我不知道如何从教程瓶执行以下部分:

var token = "<page_access_token>"; 

function sendTextMessage(sender, text) { 
    messageData = { 
    text:text 
} 
request({ 
    url: 'https://graph.facebook.com/v2.6/me/messages', 
    qs: {access_token:token}, 
    method: 'POST', 
    json: { 
    recipient: {id:sender}, 
    message: messageData, 
    } 
}, function(error, response, body) { 
    if (error) { 
    console.log('Error sending message: ', error); 
    } else if (response.body.error) { 
    console.log('Error: ', response.body.error); 
    } 
}); 
} 

到目前为止,我在我的服务器端瓶模块该位:

@app.route('/', methods=["GET", "POST"]) 
def chatbot_response(): 
    data = json.loads(req_data) 
    sender_id = data["entry"][0]["messaging"][0]["sender"]["id"] 
    url = "https://graph.facebook.com/v2.6/me/messages" 
    qs_value = {"access_token": TOKEN_OMITTED} 
    json_response = {"recipient": {"id": sender_id}, "message": "this is a test response message"} 
    response = ("my response text", 200, {"url": url, "qs": qs_value, "method": "POST", "json": json_response}) 
    return response 

然而,运行这个,我发现虽然我可以处理有人发送我的页面,但它不会发送回应(即没有在信使聊天框中显示)。我是Flask的新手,所以任何帮助都可以通过与Flask上面的Javascript代码相同的方式得到很大的赞赏。

谢谢!

回答

-1

在Flask中进行响应时,必须小心。简单地做一个return语句不会返回任何东西给请求者。您可能需要查看jsonify()。它将采用Python字典并将其作为JSON对象返回给浏览器。

from flask import jsonify 
return jsonify({"url": url, "qs": qs_value, "method": "POST", "json": json_response}) 

如果你想在回应更多的控制,如设置代码,看看make_response()

+0

“简单地做一个return语句不会返回任何东西给请求者”这是不正确的。 Flask将函数的返回值自动转换为Response对象。 http://flask.pocoo.org/docs/0.10/quickstart/#about-responses –

0

在你的教程,场景,Node.js的应用程序发送一个HTTP POST请求回到Facebook的服务器,然后将内容转发给客户端。

到目前为止,听起来像你的瓶应用仅接收(AKA 服务)的HTTP请求。原因在于这就是Flask图书馆的全部内容,也是Flask唯一的作用。

若要发送一个HTTP请求回Facebook,您可以使用任何你喜欢的Python HTTP客户端库。标准库中有一个名为urllib,但使用起来有点笨拙......试试Requests库。

由于您的请求处理程序正在委托传出的HTTP调用,您还需要查看对此子请求的响应,以确保一切按计划进行。

你的处理程序最终可能看起来像

import json 
import os 
from flask import app, request 
# confusingly similar name, keep these straight in your head 
import requests 

FB_MESSAGES_ENDPOINT = "https://graph.facebook.com/v2.6/me/messages" 

# good practice: don't keep secrets in files, one day you'll accidentally 
# commit it and push it to github and then you'll be sad. in bash: 
# $ export FB_ACCESS_TOKEN=my-secret-fb-token 
FB_TOKEN = os.environ['FB_ACCESS_TOKEN'] 


@app.route('/', method="POST") 
def chatbot_response(): 
    data = request.json() # flasks's request object 
    sender_id = data["entry"][0]["messaging"][0]["sender"]["id"] 
    send_back_to_fb = { 
     "recipient": { 
      "id": sender_id, 
     }, 
     "message": "this is a test response message" 
    } 

    # the big change: use another library to send an HTTP request back to FB 
    fb_response = requests.post(FB_MESSAGES_ENDPOINT, 
           params={"access_token": FB_TOKEN}, 
           data=json.dumps(send_back_to_fb)) 

    # handle the response to the subrequest you made 
    if not fb_response.ok: 
     # log some useful info for yourself, for debugging 
     print 'jeepers. %s: %s' % (fb_response.status_code, fb_response.text) 

    # always return 200 to Facebook's original POST request so they know you 
    # handled their request 
    return "OK", 200 
+0

感谢您的帮助!我尝试运行你的例子,并从FB中得到以下响应:“jeepers。400:{”error“:{”message“:”(#100)param recipient must be non-empty。“,”type“:”OAuthException“ ,“code”:100,“fbtrace_id”:“”}“。我也试着用(“recipient”:sender_id)键/值对修改上面的post请求的params参数,但是我仍然得到相同的错误。因为sender_id绝对是一个实际的数值,所以很奇怪。有什么想法吗? – MEric

+0

有两个途径可以实现:首先,在调用过程中使用'print sender_id'或'print send_back_to_fb'进行调试,仔细检查实际发送的值是否合理 - 做一个真正的愚蠢的完整性检查总是一个好主意。第二,也许FB需要你的请求中正确的“application/json”头文件来理解你发送的内容,试着在'json' kwarg中传递数据(非序列化):'requests.post(FB_MESSAGES_ENDPOINT,params = { “access_token”:FB_TOKEN},json = send_back_to_fb)' –

+0

针对Facebook的另一个方便的调试工具特别好,因为它们的文档有时会混淆或过时:请尝试https://developers.facebook.com/上的图形浏览器工具。工具/资源管理器/ ...你可以很容易地重建和玩你尝试的POST请求,同时消除了一些复杂的大型双向交互。 –

0

这是对我的作品的代码:

data = json.loads(request.data)['entry'][0]['messaging'] 
for m in data: 
    resp_id = m['sender']['id'] 
    resp_mess = { 
    'recipient': { 
     'id': resp_id, 
    }, 
    'message': { 
     'text': m['message']['text'], 
    } 
    } 
    fb_response = requests.post(FB_MESSAGES_ENDPOINT, 
           params={"access_token": FB_TOKEN}, 
           data=json.dumps(resp_mess), 
           headers = {'content-type': 'application/json'}) 

主要区别:

message需要为实际一个text关键响应消息,并且您需要添加application/jsoncontent-type标题。

没有content-type头你得到The parameter recipient is required错误响应,没有messagetext键你得到param message must be non-empty错误响应。

1

这是使用fbmq library的瓶的例子,对我的作品:

回声例如:

from flask import Flask, request 
from fbmq import Page 

page = fbmq.Page(PAGE_ACCESS_TOKEN) 

@app.route('/webhook', methods=['POST']) 
def webhook(): 
    page.handle_webhook(request.get_data(as_text=True)) 
    return "ok" 

@page.handle_message 
def message_handler(event): 
    page.send(event.sender_id, event.message_text)