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!

1 Mi Piace

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…

2 Mi Piace

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:

1 Mi Piace

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