Usando Python para subir avatar (API de Discourse)

Hola :waving_hand:,

He leído estas útiles publicaciones (1, 2); sin embargo, todavía me falta algo que me impide subir con éxito un avatar de Python a Discourse usando la API. Soy el administrador de mi sitio Discourse.

La buena noticia: Funciona en Postman como se muestra a continuación.

La no tan buena noticia: No he podido traducir esto a Python (obteniendo errores 400 o 422, dependiendo de lo que intente). He probado lo siguiente:

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)

Esto me da un error 400. También he intentado usar una imagen local solo para ver si podía hacer que funcionara:

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)

Esto me da un error 422:

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

:folded_hands: ¡Siento que estoy cerca pero soy algo nuevo en el uso de API. Cualquier indicación en la dirección correcta sería muy apreciada!

¡Ooo! Descubrí desde aquí que puedo usar “url” como parámetro de la siguiente manera:

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 obtuve un 200!

Ahora, sé que hay un segundo paso que debo hacer para completar este proceso :thinking:, déjame ver qué puedo hacer…

¡Sí! ¡Descubrí el segundo paso!

url = "<mi_sitio>/usuarios/<nombre_de_usuario>/preferencias/avatar/elegir.json"

data={
"upload_id": "<id_del_primer_paso>",
"type":  "uploaded"
}

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

¡Me encanta! :heart: