在Facebook messenger bot中向用户发送音频

时间:2017-10-05 07:23:28

标签: python facebook facebook-graph-api curl python-requests

我正在尝试使用文件上传将音频文件发送给Facebook messenger bot中的用户。 官方文档说你可以通过终端中的curl命令来完成。 此命令有效:

curl  \
  -F 'recipient={"id":user_id}' \
  -F 'message={"attachment":{"type":"audio", "payload":{}}}' \
  -F 'filedata=@mymp3.mp3;type=audio/mp3' \
  "https://graph.facebook.com/v2.6/me/messages?access_token=ACCESS_TOKEN"

其中ACCESS_TOKEN是我的页面标记,“mymp3.mp3”是我要发送的文件。

问题 - 我如何使用请求库在python中做同样的事情?

我试过了:

with open("mymp3.mp3", "rb") as o:
    payload = {
        'recipient': "{id: 1336677726453307}",
        'message': {'attachment': {'type': 'audio', 'payload':{}}},
        'filedata':o, 'type':'audio/mp3'
    }
    files = {'recipient': {'id': '1336677726453307'},'filedata':o}
    headers = {'Content-Type': 'audio/mp3'}
    r = requests.post(fb_url, data=payload)
print r.text

我收到此错误:

{"error":{"message":"(#100) Message cannot be empty, must provide valid attachment or text","type":"OAuthException","code":100,"error_subcode":2018034,"fbtrace_id":"E5d95+ILnf5"}}

另外,试过这个:

import requests
from requests_toolbelt import MultipartEncoder

m = MultipartEncoder(
    fields={
        'recipient': {'id': '1336677726453307'},
        'message': {'attachment': {'type': 'audio', 'payload':{}}},
        'filedata':(open("mymp3.mp3", "rb"), 'audio/mp3')
    }
)
headers = {'Content-Type': m.content_type}
r = requests.post(fb_url, data=m, headers=headers)
print r.text

我收到了这个错误: AttributeError:'dict'对象没有属性'encode'

2 个答案:

答案 0 :(得分:2)

好的,我明白了(非常感谢我的同事!)

fb_url = 'https://graph.facebook.com/v2.6/me/messages'
data = {
    'recipient': '{"id":1336677726453307}',
    'message': '{"attachment":{"type":"audio", "payload":{}}}'
}
files = {
    'filedata': ('mymp3.mp3', open("mymp3.mp3", "rb"), 'audio/mp3')}
params = {'access_token': ACCESS_TOKEN}
resp = requests.post(fb_url, params=params, data=data, files=files)

答案 1 :(得分:0)

我认为你的第一次尝试接近目标,但你似乎很难处理文件上传。 您首先需要了解curl的作用; curl documentation is here。然后对请求做同样的事情;文档为here

根据我的理解,你可以尝试:

with open("mymp3.mp3", "rb") as finput:
    data = {
        'recipient': "{id: 1336677726453307}",
        'message': {'attachment': {'type': 'audio', 'payload':{}}},
    }
    #
    files = {'filedata': ('mymp3.mp3', finput, 'audio/mp3')}
    # BTW you can remove the ACCESS_TOKEN from fb_url and pass it as params instead
    params = {'access_token': 'ACCESS_TOKEN'}
    resp = requests.post(fb_url, params=params, data=data, files=files)

print r.text