Как загрузить фотографии / картинки в Zoom API, используя Python (multipart / form-data) с JWT? - PullRequest
0 голосов
/ 18 февраля 2020

Я ломал голову, пытаясь заставить это работать с 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)

Это тоже не работает. : /

1 Ответ

1 голос
/ 18 февраля 2020

Получается, что multipart/form-data НЕ РАБОТАЕТ для Zoom API Photo Upload, но вместо этого вы должны удалить Content-Type и заменить его на 'Accept': 'application/json'. Простое изменение, но вуаля! теперь будет загружать фотографии.

import requests

userid = 'myuserid@place.com'
jwt_token = '<supersecretkey>'
filepath = '/Users/me/Pictures/myprofilepic.jpg'

url = 'https://api.zoom.us/v2/users/{0}/picture'.format(userid)

headers = {'Authorization': 'Bearer {}'.format(jwt_token),
           'Accept': 'application/json',
           }
files = {'pic_file': open(filepath, 'rb'))}

response = requests.post(url, files=files, headers=headers)
print response.content

Надеюсь, это избавит людей от проблем с API Zoom.

...