Python을 사용해 아바타 업로드하기 (Discourse API)

안녕하세요 :waving_hand:,

유용한 게시물들(1, 2)을 읽어보았지만, Python에서 API를 사용하여 Discourse에 아바타를 성공적으로 업로드하는 데 필요한 것이 아직 부족한 것 같습니다. 저는 제 Discourse 사이트의 관리자입니다.

좋은 소식: 아래에 표시된 것처럼 Postman에서는 작동합니다.

아쉬운 소식: Python으로 이를 구현하지 못하고 있습니다(시도한 내용에 따라 400 또는 422 오류가 발생합니다). 다음을 시도해 보았습니다:

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)

이 코드는 400 오류를 반환합니다. 작동하는지 확인하기 위해 로컬 이미지를 사용하는 것도 시도해 보았습니다:

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)

이 코드는 422 오류를 반환합니다:

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

:folded_hands: 거의 성공한 것 같은데, API 사용에 대해 아직 초보적인 수준이라 정확한 방향을 잡지 못하고 있습니다. 올바른 방향으로의 힌트가 주시면 감사하겠습니다!

우와! 여기에서 "url"을 다음과 같이 매개변수로 사용할 수 있다는 것을 발견했어요:

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)

드디어 200 응답을 받았습니다!

이제 이 과정을 실제로 완료하려면 두 번째 단계가 필요하다는 것을 알고 있어요 :thinking:. 제가 뭘 할 수 있을지 한번 확인해 보겠습니다…

네! 2단계 방법을 알아냈어요!

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)

정말 좋아요! :heart: