2

Requests を使用してCloudApp の APIにアクセスし、Python でCloudAppに画像を投稿する方法を理解しようと数日を費やしました。Posterを使用するpycloudappを使用してこれを達成できますが、 Requests で方法を学びたいです。

InspectB.inを使用して、スクリプトと pycloudapp によって投稿された内容を比較して、違いを見つけようとしました。多くはないように見えますが、存在する少数が重要であることは明らかです。現在のコードでは、サーバー側のエラー (500) が発生し、イライラしています。Poster ベースのコードは機能するので、Requests も機能させる方法を見つけたいと思っていますが、これは実現不可能かもしれません。

CloudApp は Amazon Web Storage を使用しており、AWS では「file」パラメーターを最後に指定する必要があることを知っています。これまでのところ、個別の辞書を使用するのではdata = collections.OrderedDict(sorted(upload_values)); data['file'] = open(last_pic, 'rb')なく、filesパラメーターなしで使用するいくつかの順列を試しました (ここで提案されているように。ファイル名の有無にかかわらず辞書を試しました。datafilesfiles

これが私のコードです:

#!/usr/bin/env python

import requests
import os

last_pic = '/.../image.jpg'

USER = 'email@email.com'
PASS = 'mypass'

AUTH_URL = 'http://my.cl.ly'
API_URL = 'http://my.cl.ly/items/new'

s = requests.Session()
s.auth = requests.auth.HTTPDigestAuth(USER, PASS)
s.headers.update({'Accept': 'application/json'})

upload_request = s.get(API_URL)

upload_values = upload_request.json()['params']

filename = os.path.basename(last_pic)
upload_values['key'] = upload_values['key'].replace(r'${filename}', filename)

files = {'file': open(last_pic, 'rb')}

stuff = requests.post(upload_request.json()['url'], data=upload_values, files=files)
print(stuff.text)

InspectB.in によると、作業中の (pycloudapp) 投稿と私の投稿の唯一の違いは次のとおりです。

pycloudapp 投稿本文のすべてのパラメーターにはContent-Type: text/plain; charset=utf-8がありますが、私のコードにはありません。例えば:

--d5e0c013a6de4105b07ac844eea4da6e
Content-Disposition: form-data; name="acl"
Content-Type: text/plain; charset=utf-8

public-read

対私の:

--b1892e959d124887a61143dd2b468579
Content-Disposition: form-data; name="acl"

public-read

ファイルデータが異なります。

パイクラウドアプリ:

--d5e0c013a6de4105b07ac844eea4da6e
Content-Disposition: form-data; name="file"
Content-Type: text/plain; charset=utf-8

����JFIFHH���ICC_PROFILE�applmntrRGB XYZ �...

対私の:

--b1892e959d124887a61143dd2b468579
Content-Disposition: form-data; name="file"; filename="20130608-ScreenShot-180.jpg"
Content-Type: image/jpeg

����JFIFHH���ICC_PROFILE�applmntrRGB XYZ �...

ヘッダーは、次の点を除いて基本的に同じです。

パイクラウドアプリ:

Accept: application/json
Accept-Encoding: identity

私の:

Accept: */*
Accept-Encoding: gzip, deflate, compress

具体的には、両方とも正常に登録されていますContent-Type: multipart/form-data

受け入れヘッダーが重要な違いかもしれないと考えて、私は追加しようとしましたheaders = {'accept': 'application/json', 'content-type': 'multipart/form-data'}(そしてそれらの両方を個別に)、運がありませんでした。残念ながら、ヘッダーを変更すると、すべてのヘッダーが上書きされ、マルチパート エンコーディングが失われます。

Content-Type: image/jpegまた、ファイルが私の投稿Content-Type: text/plain; charset=utf-8にあるのか、作業中の投稿にあるのかが問題になるのではないかと思っています。

非常に長い投稿で申し訳ありません。これは私を夢中にさせてきました。あなたが提供できる助けに感謝します。

4

1 に答える 1