4

マルチパート エンコーディングを使用してタイムラインに添付ファイルを追加しようとしています。私は次のようなことをしてきました:

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

また、application/json では問題なく動作しています。ただし、マルチパートの本文をフォーマットする方法がわかりません。私はいくつかのライブラリも使用しました: requests と poster で、どちらも何らかの理由で 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')})

ここではリクエストを使用しています:

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

実際にリクエストポスターを使用してデータを自動的にエンコードすることはできません。これらのライブラリは で物事をエンコードするのmultipart/form-dataに対し、Mirror API は で物事を望んでいるためmultipart/relatedです。


現在のエラー コードをデバッグする方法:

あなたのコードは認証エラーである 401 を返します。これは、リクエストにアクセス トークンを含めていない可能性があることを意味します。アクセス トークンを含めるには、リクエストでAuthorizationフィールドをBearer: YOUR_ACCESS_TOKENに設定します (ドキュメントはこちら)。

アクセス トークンの取得方法がわからない場合は、Glass 開発者向けドキュメントに、アクセス トークンの取得方法を説明するページがあります。認証プロセスで multipart-upload の次のスコープが要求されていることを確認してください。要求されていない場合、403 エラーが発生します。https://www.googleapis.com/auth/glass.timeline

于 2013-07-10T00:03:26.133 に答える
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 に答える