API経由でアップロードするために、以下のコードを使用しています。
# そして、どこに送信するかをDiscourseに尋ねます。
r = requests.post(
f"https://{DISCOURSE}/uploads/generate-presigned-put", json=file_info, headers=HEADERS)
if r.status_code != 200:
print(
f"画像のアップロード先を尋ねる際にエラーが発生しました: {r.status_code} が返されました", file=sys.stderr)
sys.exit(1)
upload_url = r.json()['url']
upload_uid = r.json()['unique_identifier']
# そして、指示された場所に画像を配置します。
r = requests.put(upload_url, data=image_data)
if r.status_code != 200:
print(
f"外部ストレージへの画像のアップロード中にエラーが発生しました: {r.status_code} が返されました", file=sys.stderr)
sys.exit(1)
# そして、Discourseにそれが成功したことを伝え、後で参照できるIDを取得します。
r = requests.post(f"https://{DISCOURSE}/uploads/complete-external-upload",
data=f'unique_identifier={upload_uid}', headers=HEADERS)
if r.status_code != 200:
print(f"アップロードの完了中にエラーが発生しました: {r.status_code} が返されました", file=sys.stderr)
sys.exit(1)
image_id = r.json()['id']
これは「全アクセス」APIキーでは機能しますが、「uploads: create」スコープを持つ詳細設定のキーを使用すると、/uploads/generate-presigned-put への post で403エラーが発生します。