استخدام بايثون لتحميل الصورة الرمزية (واجهة برمجة تطبيقات Discourse)

أهلاً :waving_hand:،

لقد قرأت هذه المشاركات المفيدة (1, 2)؛ ومع ذلك، ما زلت أفتقد شيئًا يمنعني من تحميل صورة رمزية بنجاح من بايثون إلى Discourse باستخدام واجهة برمجة التطبيقات. أنا مسؤول موقع Discourse الخاص بي.

الخبر السار: يعمل الأمر في Postman كما هو موضح أدناه.

الخبر ليس جيدًا جدًا: لم أتمكن من ترجمة هذا إلى بايثون (أحصل على أخطاء 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: أشعر أنني قريب ولكنني جديد نسبيًا في استخدام واجهات برمجة التطبيقات. أي إشارة في الاتجاه الصحيح ستكون موضع تقدير كبير!

إعجاب واحد (1)

أوه! اكتشفت من هنا أنه يمكنني استخدام “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:

إعجاب واحد (1)

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