4

我正在尝试使用多部分编码将附件添加到我的时间轴。我一直在做类似以下的事情:

req = urllib2.Request(url,data={body}, header={header})
resp = urllib2.urlopen(req).read()

它一直适用于应用程序/json。但是,我不确定如何格式化多部分的正文。我还使用了一些库:请求和海报,它们都出于某种原因返回 401。

如何使用库(最好是 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 -> 标头

谢谢

4

3 回答 3

1

如何使用多部分编码将附件添加到时间线:

将具有多部分编码的附件添加到时间线的最简单方法是使用 Google APIs Client Library for Python使用此库,您可以简单地使用Mirror API 时间线插入文档中提供的以下示例代码(单击示例下的 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

如果您不知道如何获取访问令牌,Glass 开发者文档有一个页面解释如何获取访问令牌。确保您的授权过程为多部分上传请求了以下范围,否则您将收到 403 错误。https://www.googleapis.com/auth/glass.timeline

于 2013-07-10T00:03:26.133 回答
1

这里有一个使用流式视频 url 功能的多部分请求的工作 Curl 示例:

上一个带有 Curl 示例的流式视频答案

它完全符合您的要求,但使用 Curl。你只需要适应你的技术堆栈。

即使您使用正确的语法,您收到的 401 也会阻止您。401 响应表示您无权修改时间线。确保您可以先插入一个简单的 hello world 纯文本卡片。一旦你克服了 401 错误并进入解析错误和格式问题,上面的链接应该是你需要的一切。

最后一点,您不需要urllib2,Mirror API 团队在我们的圈子中放弃了一个功能的宝石,我们不需要为获取视频的二进制文件而烦恼,检查上面链接的示例我提供了一个多部分负载中的 URL,无需流式传输二进制数据!Google 为我们做了 XE6 及更高版本的所有魔法。

感谢玻璃队!

我想你会发现这比你想象的要简单。尝试 curl 示例并注意不兼容的视频类型,当你走到那一步时,如果你不使用兼容的类型,它似乎无法在 Glass 中工作,请确保你的视频以 Glass 友好的格式编码。

祝你好运!

于 2013-07-09T05:34:30.413 回答
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 我将您的视频用于测试目的:) 谢谢。

于 2013-07-31T20:12:31.507 回答