多部分POST请求Google Glass

时间:2013-07-08 21:16:56

标签: python django google-mirror-api

我正在尝试使用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 - >头

谢谢

3 个答案:

答案 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

您实际上无法使用requestsposter自动对数据进行编码,因为这些库会在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我用你的视频进行测试:)谢谢。