أسماء المستخدمين يونيكود

لا تعمل أسماء المستخدمين 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"
}

هل يمكنك توضيح كيف يفشل الأمر بالنسبة لك؟

إعجابَين (2)

شكرا لك، مايكل براون.

لقد اختبرته، وإذا اختبرته في المتصفح فهو جيد، ولكن في برنامج البرمجة فهو ليس جيدًا، لأن القاعدة هي أنه لا يمكن استخدام سوى ASCII لنقل هذا البروتوكول.

سبب الخطأ:

TypeError: حرف غير صالح في محتوى الرأس [“Api-Username”]

يرجى الرجوع إلى السجل، ويوصى بإضافة ترميز أو فك ترميز utf8 مرة واحدة للمطابقة

  1. واجهة الاختبار

  1. عنوان الويب

https://xxxxxxxx/posts.json

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 بت، فإنني أتفق مع هذا الاقتراح:

معقول.

3 إعجابات

ابحث في المنتديات يمكن استخدام الإصدارات الأقدم من واجهة برمجة التطبيقات مع Query

الإصدارات الأحدث من واجهة برمجة التطبيقات لا تعمل Query

هل هو متوافق مع Query قم بإصلاح هذه المشكلة

على سبيل المثال:

https://www.xxx.com/posts.json?api_key=714552c6148e1617aeab526d0606184b94a80ec048fc09894ff1a72b740c5f19&api_username=system

نأمل أن يتم حل هذا.

لن يتم ذلك، تحتاج الآن إلى تمرير معلمات واجهة برمجة التطبيقات (API) كرؤوس بدلاً من معلمات الاستعلام. هذا لن يتغير.

إعجابَين (2)

ولكن لا يمكن للرأس تمرير أحرف غير ASCII، أريد تمرير اسم المستخدم الصيني

يمكنه ذلك، كما أثبت @supermathie أعلاه:

cURL

Python:

إعجابَين (2)

في الواقع، لا يعمل، لقد حاولت، لأن الرأس لا يمكن أن يحتوي على أحرف غير ASCII، تحتاج إلى إجراء تحويل ترميز، ولكن بعد ترميز الأحرف، سيظهر خطأ بأن اسم المستخدم غير موجود، لأن discourse في الطرف المستقبل لم يستعد!!

يجب ترميز الرؤوس بترميز UTF-8، وليس بترميز URI.

إعجابَين (2)

١. ١: لا يمكن أن يحتوي العنوان على أحرف صينية
٢. ٢: يشير 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

شكرا لك! مايكل براون

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

ستحتاج إلى تدوير مفتاح واجهة برمجة التطبيقات هذا فورًا يا @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
3 إعجابات

هل هذه هي الحالة ويمكنك تقديم مثال، شكرًا!

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'
إعجاب واحد (1)

شكرا لكم جميعا، سأحاول، إذا كان بإمكانكم استخدام اسم المستخدم الصيني لاستدعاء عملية واجهة برمجة التطبيقات فهو أكثر ملاءمة، شكرا لكم!


هذا غريب بعض الشيء ولا يمكنني استخدام واجهة برمجة التطبيقات (API) بشكل طبيعي أيضًا

من المحتمل جدًا أن تكون المشكلة متعلقة بنطاق مفتاح واجهة برمجة التطبيقات (API key scope).

:sweat_smile: لقد جربت ذلك ولم ينجح الأمر أيضًا، لكني لا أعرف بايثون.
نفس الرسالة··

هل يعمل نفس الاستدعاء باسم مستخدم ASCII؟

(أخمن لا وهذا ما تقصده بـ “لا يمكنني استخدام واجهة برمجة التطبيقات بشكل طبيعي”)

إذا كان الأمر كذلك، فهل يحتوي الموقع على وكيل آخر أم أنه يستخدم التثبيت القياسي؟

نعم، هذه المكالمة قامت بترميزها كتمثيل مُهرب لتسلسل بايت UTF-8، بدلاً من البايتات نفسها.