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!

1 me gusta

¡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…

2 Me gusta

¡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:

1 me gusta

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