Usando Python para fazer upload de avatar (API do Discourse)

Olá :waving_hand:,

Li estes posts úteis (1, 2); no entanto, ainda me falta algo que me impede de carregar com sucesso um avatar do Python para o Discourse usando a API. Eu sou o administrador do meu site Discourse.

A boa notícia: Funciona no Postman, como mostrado abaixo.

A nem tão boa notícia: Não consegui traduzir isso para Python (obtendo erros 400 ou 422, dependendo do que eu tento). Tentei o seguinte:

img_data = requests.get("my_image_url").content

data={
"type": "avatar",
"user_id": user_id,
"synchronous": True,
"file":  img_data
}

url = "<my site>/uploads.json"

response = requests.request("POST", url, headers=headers, data=data)

Isso me dá um erro 400. Eu também tentei usar uma imagem local apenas para ver se conseguia fazê-la funcionar:

with open('my_local_image.jpg', "rb") as f:
    image_b64 = base64.b64encode(f.read()).decode("utf8")

data={
"type": "avatar",
"user_id": user_id,
"synchronous": True,
"file":  image_b64
}

url = "<my site>/uploads.json"

response = requests.request("POST", url, headers=headers, data=data)

Isso me dá um erro 422:

"failed":"FAILED","message":"undefined method `tempfile\\' for #\\u003cString:0x00007f5befda7af8\\u003e"

:folded_hands: Sinto que estou perto, mas sou um pouco novo em usar API. Qualquer dica na direção certa seria muito apreciada!

Ooo! Descobri daqui (aqui) que posso usar “url” como parâmetro da seguinte forma:

data={
"type": "avatar",
"user_id": user_id,
"synchronous": True,
"url":  "url_to_my_image"
}

url = "<my_site>/uploads.json"

response = requests.request("POST", url, headers=headers, data=data)

Finalmente obtive um 200!

Agora, sei que há um 2º passo que preciso dar para completar este processo :thinking:, deixe-me ver o que consigo fazer…

Sim! Descobri o 2º passo!

url = "<meu_site>/users/<nome_de_usuário>/preferences/avatar/pick.json"

data={
"upload_id": "<id_do_1º_passo>",
"type":  "uploaded"
}

response = requests.request("PUT", url, headers=headers, data=data)

Adorei! :heart: