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!

1 curtida

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…

2 curtidas

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:

1 curtida

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.