これをPythonで動作させるために頭を悩ませてきました。Curl と JavaScript を使用してこれを行うことができるようですが、私は Python を離れたくありません。multipart/form-data
ドキュメントを読むと(ただし、かなりむき出しです)、ヘッダーのデータを次のようにフォーマットし、ファイルをバイナリとして送信する必要があると書かれています。
import requests
userid = 'myuserid@place.com'
url = 'https://api.zoom.us/v2/users/{0}/picture'.format(userid)
jwt_token = '<supersecretkey>'
filepath = '/Users/me/Pictures/myprofilepic.jpg'
headers = {
'Content-Type': 'multipart/form-data',
'Authorization': 'Bearer {0}'.format(jwt_token)
}
files = [
('pic_file', open('<filepath>','rb'))
]
response = requests.request('POST', url, headers=headers, files=files)
print(response.status_code)
ただし、この例は機能しません。500 エラーが発生し続けます。Zoom でサポート ケースを開いたところ、実行するコードがまったく同じでした。私は自分の境界をフォーマットして設定することで、これに自分で取り組もうとしました。
import requests
import binascii
import os
import base64
jwt_token = '<supersecretkey>'
filepath = '/Users/me/Pictures/myprofilepic.jpg'
def encode_image_base64(filename):
with open(filename,'rb') as file:
data_read = file.read()
data = base64.b64encode(data_read)
return data
def base64_encode_multipart_formdata(name,filename,content_type):
base64image = encode_image_base64(filename)
boundary = binascii.hexlify(os.urandom(16)).decode('ascii')
body = '--{0}\r\nContent-Disposition: form-data; name="{1}"; filename="{2}"\r\nContent-Type: {3}\r\n\r\n{4}\r\n--{0}--'.format(boundary,name,filename,content_type,base64image)
content_type = "multipart/form-data; boundary={}".format(boundary)
return( body, content_type)
def main():
name = 'pic_file'
content_type = 'image/jpeg'
body , ct = base64_encode_multipart_formdata(name,filepath,content_type)
headers = {
'Content-Type': '{}'.format(ct),
'Authorization': 'Bearer {}'.format(jwt_token)
}
response = requests.post(url, headers=headers, data=body)
print(response.status_code)
これもうまくいきません。