Utilisation de Python pour téléverser un avatar (API Discourse)

Bonjour :waving_hand:,

J’ai lu ces publications utiles (1, 2) ; cependant, il me manque encore quelque chose qui m’empêche de télécharger avec succès un avatar de Python vers Discourse en utilisant l’API. Je suis l’administrateur de mon site Discourse.

La bonne nouvelle : cela fonctionne dans Postman, comme le montre l’image ci-dessous.

La moins bonne nouvelle : Je n’ai pas réussi à traduire cela en Python (j’obtiens des erreurs 400 ou 422, selon ce que je tente). J’ai essayé ceci :

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)

Cela me donne une erreur 400. J’ai également essayé d’utiliser une image locale juste pour voir si je pouvais y parvenir :

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)

Cela me donne une erreur 422 :

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

:folded_hands: J’ai l’impression d’être proche, mais je suis un peu nouveau dans l’utilisation des API. Toute indication dans la bonne direction serait grandement appréciée !

1 « J'aime »

Ooo ! J’ai découvert par ici que je peux utiliser « url » comme paramètre comme suit :

data={
"type": "avatar",
"user_id": user_id,
"synchronous": True,
"url":  "url_de_mon_image"
}

url = "<mon_site>/uploads.json"

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

J’obtiens enfin un 200 !

Maintenant, je sais qu’il y a une 2ème étape que je dois effectuer pour réellement terminer ce processus :thinking:, voyons ce que je peux faire…

2 « J'aime »

Oui ! J’ai trouvé la 2e étape !

url = "<mon_site>/users/<nom_utilisateur>/preferences/avatar/pick.json"

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

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

J’adore ça ! :heart:

1 « J'aime »

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