Utilizzo di Python per caricare avatar (API Discourse)

Ciao :waving_hand:,

Ho letto questi post utili (1, 2); tuttavia, mi manca ancora qualcosa che mi impedisce di caricare correttamente un avatar da Python a Discourse utilizzando l’API. Sono l’amministratore del mio sito Discourse.

La buona notizia: Funziona in Postman, come mostrato di seguito.

La notizia non così buona: Non sono riuscito a tradurlo in Python (ottenendo errori 400 o 422, a seconda di cosa tento). Ho provato quanto segue:

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)

Questo mi dà un errore 400. Ho anche provato a usare un’immagine locale solo per vedere se riuscivo a farla funzionare:

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)

Questo mi dĂ  un errore 422:

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

:folded_hands: Sento di essere vicino ma sono un po’ nuovo nell’uso delle API. Qualsiasi suggerimento nella giusta direzione sarebbe molto apprezzato!

Ooo! Ho scoperto da qui che posso usare “url” come parametro come segue:

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

Ora, so che c’è un secondo passaggio da fare per completare effettivamente questo processo :thinking:, vediamo cosa posso fare…

Sì! Ho capito il secondo passaggio!

url = "<my_site>/users/<username>/preferences/avatar/pick.json"

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

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

Fantastico! :heart: