我正在尝试使用multipart编码为我的时间轴添加附件。我一直在做类似以下的事情:
req = urllib2.Request(url,data={body}, header={header})
resp = urllib2.urlopen(req).read()
它一直适用于application / json。但是,我不知道如何为multipart格式化body。我还使用了一些库:请求和海报,它们都因某种原因返回401。
如何使用libary(最好是urllib2的插件)或urllib2本身(如上面的代码块)制作多部分请求?
编辑: 我也希望这能够支持https://developers.google.com/glass/timeline
中的mirror-api“video / vnd.google-glass.stream-url”对于使用海报库的请求,这里是代码:
register_openers()
datagen, headers = multipart_encode({'image1':open('555.jpg', 'rb')})
这里是使用requets:
headers = {'Authorization' : 'Bearer %s' % access_token}
files = {'file': open('555.jpg', 'rb')}
r = requests.post(timeline_url,files=files, headers=headers)
返回401 - >头
谢谢
答案 0 :(得分:1)
这里有一个使用流视频网址功能的多部分请求的Curl示例:
Previous Streaming Video Answer with Curl example
它完全符合您的要求,但使用Curl。您只需要将其适应您的技术堆栈。
即使您使用正确的语法,您收到的401也会阻止您。 401响应表示您无权修改时间线。确保您可以先插入一个简单的hello world text only卡。一旦你越过401错误并进入解析错误和格式问题,上面的链接应该是你需要的一切。
最后一点,您不需要urllib2,镜像API团队在我们的圈子中删除了一个功能的宝石,我们不需要为获取视频的二进制文件而烦恼,检查一下上面链接的示例我仅在多部分有效负载中提供了一个URL,无需流式传输二进制数据! Google为我们带来了XE6及以上版本的所有魔力。
感谢Team Glass!
我想你会发现这比你想象的要简单。尝试卷曲示例并注意不兼容的视频类型,当你走得那么远时,如果你不使用兼容类型,它似乎不能在Glass中工作,请确保你的视频以Glass友好格式编码。 / p> 祝你好运!
答案 1 :(得分:1)
如何使用多部分编码将附件添加到时间轴:
将带有多部分编码的附件添加到时间轴的最简单方法是使用 Google APIs Client Library for Python。使用此库,您可以简单地使用Mirror API timeline insert documentation中提供的以下示例代码(单击Examples下的Python选项卡)。
from apiclient.discovery import build
service = build('mirror', 'v1')
def insert_timeline_item(service, text, content_type=None, attachment=None,
notification_level=None):
timeline_item = {'text': text}
media_body = None
if notification_level:
timeline_item['notification'] = {'level': notification_level}
if content_type and attachment:
media_body = MediaIoBaseUpload(
io.BytesIO(attachment), mimetype=content_type, resumable=True)
try:
return service.timeline().insert(
body=timeline_item, media_body=media_body).execute()
except errors.HttpError, error:
print 'An error occurred: %s' % error
您实际上无法使用requests或poster自动对数据进行编码,因为这些库会在multipart/form-data
中对事物进行编码,而Mirror API需要multipart/related
中的内容。
如何调试当前的错误代码:
您的代码提供401,这是授权错误。这意味着您可能无法在请求中包含访问令牌。要包含访问令牌,请在请求中将Authorization
字段设置为Bearer: YOUR_ACCESS_TOKEN
(文档here)。
如果您不知道如何获取访问令牌,Glass开发人员文档会有page here解释如何获取访问令牌。确保您的授权过程为multipart-upload请求了以下范围,否则您将收到403错误。 https://www.googleapis.com/auth/glass.timeline
答案 2 :(得分:0)
我就是这样做的,以及python客户端库如何做到这一点。
from email.mime.multipart import MIMEMultipart
from email.mime.nonmultipart import MIMENonMultipart
from email.mime.image import MIMEImage
mime_root = MIMEMultipart('related', '===============xxxxxxxxxxxxx==')
headers= {'Content-Type': 'multipart/related; '
'boundary="%s"' % mime_root.get_boundary(),
'Authorization':'Bearer %s' % access_token}
setattr(mime_root, '_write_headers', lambda self: None)
#Create the metadata part of the MIME
mime_text = MIMENonMultipart(*['application','json'])
mime_text.set_payload("{'text':'waddup doe!'}")
print "Attaching the json"
mime_root.attach(mime_text)
if method == 'Image':
#DO Image
file_upload = open('555.jpg', 'rb')
mime_image = MIMENonMultipart(*['image', 'jpeg'])
#add the required header
mime_image['Content-Transfer-Encoding'] = 'binary'
#read the file as binary
mime_image.set_payload(file_upload.read())
print "attaching the jpeg"
mime_root.attach(mime_image)
elif method == 'Video':
mime_video = MIMENonMultipart(*['video', 'vnd.google-glass.stream-url'])
#add the payload
mime_video.set_payload('https://dl.dropboxusercontent.com/u/6562706/sweetie-wobbly-cat-720p.mp4')
mime_root.attach(mime_video)
Mark Scheel我用你的视频进行测试:)谢谢。