لا تعمل أسماء المستخدمين Unicode في Discourse حاليًا مع واجهة برمجة التطبيقات (API)
هل من الممكن إصلاح هذه المشكلة؟
لا تعمل أسماء المستخدمين Unicode في Discourse حاليًا مع واجهة برمجة التطبيقات (API)
هل من الممكن إصلاح هذه المشكلة؟
لقد جربت هذا للتو ويعمل معي:
○ → curl -s -L -H 'api-key: «redacted»' -H 'api-username: doesnotexist' https://try.discourse.org/u/运思/notifications.json
{"errors":["You are not permitted to view the requested resource. The API username or key is invalid."],"error_type":"invalid_access"}
○ → curl -s -L -H 'api-key: «redacted»' -H 'api-username: 运思' https://try.discourse.org/u/运思/notifications.json | jq '.users[0]'
{
"id": 41,
"username": "运思",
"name": "Michael Brown",
"avatar_template": "/user_avatar/try.discourse.org/运思/{size}/208_2.png",
"trust_level": 1,
"assign_icon": "user-plus",
"assign_path": "/u/运思/activity/assigned"
}
هل يمكنك توضيح كيف يفشل الأمر بالنسبة لك؟
شكرا لك، مايكل براون.
لقد اختبرته، وإذا اختبرته في المتصفح فهو جيد، ولكن في برنامج البرمجة فهو ليس جيدًا، لأن القاعدة هي أنه لا يمكن استخدام سوى ASCII لنقل هذا البروتوكول.
سبب الخطأ:
TypeError: حرف غير صالح في محتوى الرأس [“Api-Username”]
يرجى الرجوع إلى السجل، ويوصى بإضافة ترميز أو فك ترميز utf8 مرة واحدة للمطابقة
Accept:application/json
api-key:f9c13aafa9b21baf778161bff66a62533ba650b6e4542e3e9788e98c55ded869
Api-Username:system
نتائج الاختبار:
حسناً
Accept:application/json
api-key:f9c13aafa9b21baf778161bff66a62533ba650b6e4542e3e9788e98c55ded869
Api-Username:风之旅人
{“status”:500,“error”:“Internal Server Error”}
Accept:application/json
api-key:f9c13aafa9b21baf778161bff66a62533ba650b6e4542e3e9788e98c55ded869
Api-Username:%E8%BF%90%E6%80%9D
ليس مسموحًا لك بعرض المورد المطلوب. اسم مستخدم واجهة برمجة التطبيقات أو المفتاح غير صالح
سبب الخطأ:
استخدام اللغة الصينية في الرأس غير صالح، ويجب ترميزه بواسطة encodeURI() لنقله إلى الخادم، ولكن يحتاج الخادم إلى فك ترميزه بواسطة decodeURI() لكي يتعرف عليه.
نقترح إضافة شرط، إذا لم يتم العثور عليه، حاول فك ترميز URI، ومطابقة اسم المستخدم.
ماذا تستخدم؟ يبدو الخطأ أنه بايثون؟ هذا مدعوم بواسطة requests ولكن ربما ليس بواسطة المكتبات التي تستخدمها.
In [1]: import requests
In [2]: api_key = '«redacted»'
In [3]: r = requests.get('https://try.discourse.org/u/运思/notifications.json', headers = {
'api-key': api_key,
'api-username': '运思'.encode()
})
In [4]: r.status_code
Out[4]: 200
In [5]: r.json()['users'][0]
Out[5]:
{'id': 41,
'username': '运思',
'name': 'Michael Brown',
'avatar_template': '/user_avatar/try.discourse.org/运思/{size}/208_2.png',
'trust_level': 1,
'assign_icon': 'user-plus',
'assign_path': '/u/运思/activity/assigned'}
حاول استدعاء .encode() لتحويل قيمة الرأس صراحةً إلى bytes… على الرغم من أنه بما أن ليس كل شيء نظيفًا بـ 8 بت، فإنني أتفق مع هذا الاقتراح:
معقول.
ابحث في المنتديات يمكن استخدام الإصدارات الأقدم من واجهة برمجة التطبيقات مع Query
الإصدارات الأحدث من واجهة برمجة التطبيقات لا تعمل Query
هل هو متوافق مع Query قم بإصلاح هذه المشكلة
على سبيل المثال:
https://www.xxx.com/posts.json?api_key=714552c6148e1617aeab526d0606184b94a80ec048fc09894ff1a72b740c5f19&api_username=system
نأمل أن يتم حل هذا.
لن يتم ذلك، تحتاج الآن إلى تمرير معلمات واجهة برمجة التطبيقات (API) كرؤوس بدلاً من معلمات الاستعلام. هذا لن يتغير.
ولكن لا يمكن للرأس تمرير أحرف غير ASCII، أريد تمرير اسم المستخدم الصيني
في الواقع، لا يعمل، لقد حاولت، لأن الرأس لا يمكن أن يحتوي على أحرف غير ASCII، تحتاج إلى إجراء تحويل ترميز، ولكن بعد ترميز الأحرف، سيظهر خطأ بأن اسم المستخدم غير موجود، لأن discourse في الطرف المستقبل لم يستعد!!
يجب ترميز الرؤوس بترميز UTF-8، وليس بترميز URI.
١. ١: لا يمكن أن يحتوي العنوان على أحرف صينية
٢. ٢: يشير utf8 إلى المحتوى في المنشور، وليس العنوان
٣. ٣: لا يتم فك تشفير Discourse بواسطة UrlEncode، وسيظهر أن اسم المستخدم غير موجود.
بيانات الاختبار التالية مقدمة
https://www.baowei.ink/posts.json
{
"title": "标题标题标题标题标题",
"raw": "标题标题标题标题标题标题标题标题标题标题",
"category": 10,
}
نجاح
Content-Type: application/json; charset=UTF-8
Api-Key: «redacted»
Api-Username: system
فشل
Content-Type: application/json; charset=UTF-8
Api-Key: «redacted»
Api-Username: 风之旅人
Content-Type: application/json; charset=UTF-8
Api-Key: «redacted»
Api-Username: %E9%A3%8E%E4%B9%8B%E6%97%85%E4%BA%BA
شكرا لك! مايكل براون
ستحتاج إلى تدوير مفتاح واجهة برمجة التطبيقات هذا فورًا يا @zengyunsi، اعتبره مسربًا.
… على الرغم من أنني أستطيع التأكيد على أنه يعمل عند تشفير الرؤوس باستخدام UTF-8:
In [1]: import requests
In [2]: api_key = '«redacted»'
In [3]: r = requests.get('https://www.baowei.ink/posts.json', headers={'api-key': api_key, 'api-username': '风之旅人'.encode()})
In [4]: r.status_code
Out[4]: 200
In [5]: len(r.json()['latest_posts'])
Out[5]: 19
هل هذه هي الحالة ويمكنك تقديم مثال، شكرًا!
Content-Type: Application/json; charset=utf-8
Accept: Application/json; charset=utf-8
Api-Key: f9c13aafa9b21baf778161bff66a62533ba650b6e4542e3e9788e98c55ded869
Api-Username: \u0631\u0650\u064a\u0640\u062d\u0650\u0644\u0640\u0645\u0640\u0646
دائماً ما يظهر
لا يُسمح لك بعرض المورد المطلوب. اسم مستخدم واجهة برمجة التطبيقات أو المفتاح غير صالح
يمكنني التأكيد على أن المثال أدناه سيعمل:
$ curl -s -L \
-H 'api-key: 60834ccb8eda28cf17bab8efbbb2fbf874eb8b5a75ff17ddbd2346eb292881a0' \
-H 'api-username: 测试用户' \
http://localhost:4200/u/%E6%B5%8B%E8%AF%95%E7%94%A8%E6%88%B7/emails.json
{"email":"discobot_email","secondary_emails":[],"unconfirmed_emails":[],"associated_accounts":[]}
وبدون ترويسة api-*:
$ curl -s -L \
http://localhost:4200/u/%E6%B5%8B%E8%AF%95%E7%94%A8%E6%88%B7/emails.json
{"errors":["You need to be logged in to do that."],"error_type":"not_logged_in"}
مثال Python requests:
import requests
api_key = '60834ccb8eda28cf17bab8efbbb2fbf874eb8b5a75ff17ddbd2346eb292881a0'
api_username = '测试用户'
api_endpoint = 'http://localhost:4200/u/%E6%B5%8B%E8%AF%95%E7%94%A8%E6%88%B7/emails.json'
r = requests.get(api_endpoint, headers={
'api-key': api_key, 'api-username': api_username.encode()})
print(r)
<Response [200]>
يبدو أن api-username الخاص بك لم يتم ترميزه بشكل مناسب
>>> '风之旅人'.encode()
b'\xe9\xa3\x8e\xe4\xb9\x8b\xe6\x97\x85\xe4\xba\xba'
شكرا لكم جميعا، سأحاول، إذا كان بإمكانكم استخدام اسم المستخدم الصيني لاستدعاء عملية واجهة برمجة التطبيقات فهو أكثر ملاءمة، شكرا لكم!
من المحتمل جدًا أن تكون المشكلة متعلقة بنطاق مفتاح واجهة برمجة التطبيقات (API key scope).
لقد جربت ذلك ولم ينجح الأمر أيضًا، لكني لا أعرف بايثون.
نفس الرسالة··
هل يعمل نفس الاستدعاء باسم مستخدم ASCII؟
(أخمن لا وهذا ما تقصده بـ “لا يمكنني استخدام واجهة برمجة التطبيقات بشكل طبيعي”)
إذا كان الأمر كذلك، فهل يحتوي الموقع على وكيل آخر أم أنه يستخدم التثبيت القياسي؟
نعم، هذه المكالمة قامت بترميزها كتمثيل مُهرب لتسلسل بايت UTF-8، بدلاً من البايتات نفسها.