ファイルのようなオブジェクトを引数として取るpythonライブラリ(poster )を使用しています。ドキュメントには次のように記載されています。
ファイルのようなオブジェクトは、.read() と .fileno() のいずれか、または .seek() と .tell() の両方をサポートする必要があります。
Pythonopen
関数を使用してライブラリを試してみましたが、正常に動作します。現在、次を使用して URL から画像をダウンロードしています。
access_token = "XXXXXXXXXXXXXXXXXXXXX"
postPhotoUrl = "https://graph.facebook.com/me/photos?access_token=%s" % access_token
register_openers()
# get image from external URL
data = urllib2.urlopen("http://example.com/image.png")
data = StringIO(data.read())
### data, headers = multipart_encode({"source":open("file.png")}) <- WORKS FINE
data, headers = multipart_encode({"source":data})
request = urllib2.Request(postPhotoUrl,data,headers)
編集:私の目標は、外部 URL から画像を取得し、Facebook グラフ API を使用して投稿することです。Pythonopen
関数を使用しても問題はありません。StringIO を使用しようとすると、POST 要求で本文が送信されません。