使用Quizlet API为图像和Python3请求发送imageData []的正确方法

时间:2017-03-02 16:11:18

标签: python json api

我正在构建用于在某个团队中学习名字的抽认卡。实现是Slack和Quizlet之间的集成;从Slack中提取名称和照片并将其放入私人Quizlet集中。我昨晚刚刚升级到高级版,所以我应该可以上传图片了。

我在OSX上使用Python3并且已成功通过身份验证。我知道这是因为我能够成功通过API(https://quizlet.com/api/2.0/docs/api-list)制作一套卡片,使用以下代码:

url = 'https://api.quizlet.com/2.0'
headers = {
    'Authorization': 'Bearer ' + data["access_token"]
}

def create_set():
    #POST /sets - Add a new set
    payload = {
        'title':'test0',
        'terms': names, #names is a preassembled list
        'definitions': pictures, #as is pictures
        'lang_terms': 'en', 
        'lang_definitions': 'en',
        'visibility': 'password',
        'password': 'secret_password'
    }
    call = requests.post(url+"/sets", headers=headers, json=payload)
    return call 

既然我能够将名字,甚至Slack个人资料照片的链接放到抽认卡上,我就会发布图片而感到茫然。这是我的代码:

def upload_photos():
    #POST   https://api.quizlet.com/2.0/images  Upload one or more images
    url = 'https://api.quizlet.com/2.0'        
    headers = {'Authorization': 'Bearer ' + data["access_token"]}
    # ,'Content-type': 'multipart/form-data'

    imageData = {
        'imageData': open(pictures[0], 'rb')
    }

    payload = {
        'imageData':pictures[0]
    }

    call = requests.post(url+"/images", headers=headers, files=imageData, json=payload)
    return call

我尝试过以下方法:

  • 使用有效负载JSON。当我给它整个图片列表时,而不只是[X]上的元素:b'{"http_code":400,"error":"validation_errors","error_title":"Error","error_description":"The \"imageData\" parameter is missing or not valid.","validation_errors":["The \"imageData\" parameter is missing or not valid."]}'
  • 尝试手动添加multipart / form-data标头。 (参见注释掉的行)。但是,这给了我:b'{"http_code":400,"error":"client_developer_error","error_title":"Error","error_description":"Expected a imageData parameter"}'
  • 当我尝试发送打开的文件时,我被告知JSON不会以这种方式序列化,这是有道理的。
  • 当我只提供文件所在位置的数组列表时,我得到的相同错误是imageData无效。
  • 我尝试了我能找到的Quizlet的每个包装器/ Python包,但所有这些包似乎都被遗弃了,而且大部分缺少文档。

总结一下,我想弄清楚如何从Slack获取个人资料图片(无论是下载的图片还是网址)到Quizlet的API。提前感谢任何输入。

更新:我在Quizlet API页面上播放了示例curl请求并使其与-f @参数一起使用。似乎@"让curl模拟用户按下提交按钮的填写表单。根据RFC 2388,这会导致使用Content-Type multipart / form-data对POST数据进行curl。这样可以上传二进制文件等。强制使用'内容' part为文件,文件名前缀为@符号。要从文件中获取内容部分,请在文件名前加上符号<前缀。 @和<之间的区别然后,@使文件作为文件上传附加在帖子中,而<创建一个文本字段,然后从文件中获取该文本字段的内容。"如果有人知道如何做Python的等价物,我想我会更接近。

0 个答案:

没有答案