Unicode-Benutzernamen

Derzeit funktionieren Discourse-Unicode-Benutzernamen nicht mit der API

Ist es möglich, diesen Fehler zu beheben?

Ich habe das gerade versucht und es funktioniert für mich:

○ → 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"
}

Können Sie zeigen, wie es bei Ihnen fehlschlägt?

2 „Gefällt mir“

Vielen Dank, Michael Brown.

Ich habe es getestet und wenn ich es im Browser teste, ist es in Ordnung, aber in der Programmiersoftware ist es nicht in Ordnung, da die Regel lautet, dass nur ASCII für die Übertragung dieses Protokolls verwendet werden darf.

Grund für den Fehler:

TypeError: Ungültiges Zeichen im Header-Inhalt ["Api-Username"]

Bitte beziehen Sie sich auf das Protokoll. Es wird empfohlen, einmal eine UTF8-Kodierung oder -Dekodierung hinzuzufügen, um sie abzugleichen.

  1. Test-Schnittstelle

  1. Webadresse

https://xxxxxxxx/posts.json

Accept:application/json
api-key:f9c13aafa9b21baf778161bff66a62533ba650b6e4542e3e9788e98c55ded869
Api-Username:system

Testergebnisse:

OK

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

Sie dürfen die angeforderte Ressource nicht anzeigen. Der API-Benutzername oder der Schlüssel ist ungültig.

Grund für den Fehler:

Die Verwendung von Chinesisch im Header ist ungültig. Es muss mit encodeURI() kodiert werden, um an den Server übertragen zu werden, aber der Server muss es mit decodeURI() dekodieren, um es erkennen zu können.

Schlagen Sie vor, eine Prüfung hinzuzufügen. Wenn kein Treffer gefunden wird, versuchen Sie, decodeURI() zu verwenden, um den Benutzernamen abzugleichen.

Was verwendest du? Der Fehler sieht nach Python aus? Dies wird von requests unterstützt, aber möglicherweise nicht von den von dir verwendeten Bibliotheken.

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'}

Versuche, .encode() aufzurufen, um den Header-Wert explizit in bytes zu konvertieren… obwohl ich zugeben muss, dass, da nicht alles 8-Bit-sauber ist, ich dieser Vorschlag zustimme:

ist vernünftig.

3 „Gefällt mir“

Foren durchsuchen Ältere Versionen der API können mit Query verwendet werden Neuere Versionen der API funktionieren nicht mit Query Ist es mit Query kompatibel Beheben Sie dieses Problem

Beispiel:

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

Hoffentlich wird dies gelöst.

Das wird es nicht, Sie müssen die API-Parameter jetzt als Header und nicht als Query-Parameter übergeben. Daran wird sich nichts ändern.

2 „Gefällt mir“

Aber der Header kann keine Nicht-ASCII-Zeichen übergeben. Ich möchte den chinesischen Benutzernamen übergeben.

Das kann er, wie @supermathie oben bewiesen hat:

cURL

Python:

2 „Gefällt mir“

Tatsächlich funktioniert es nicht, ich habe es versucht, da der Header keine Nicht-ASCII-Zeichen enthalten kann, Sie müssen eine Kodierungskonvertierung durchführen, aber nach der Kodierung der Zeichen wird die Meldung angezeigt, dass der Benutzername nicht existiert, da im Diskurs auf der Empfängerseite keine Wiederherstellung erfolgt ist!!

Die Header müssen als UTF-8 kodiert werden, nicht mit URI-Kodierung.

2 „Gefällt mir“
  1. 1: Der Header darf keine chinesischen Zeichen enthalten
  2. 2: utf8 bezieht sich auf den Inhalt des Beitrags, nicht auf den Header
  3. 3: Discourse wird nicht mit UrlEncode dekodiert, es wird angezeigt, dass der Benutzername nicht existiert.

Die folgenden Testdaten werden bereitgestellt

https://www.baowei.ink/posts.json
{
  "title": "标题标题标题标题标题",
  "raw": "标题标题标题标题标题标题标题标题标题标题",
  "category": 10,
}

Erfolg

Content-Type: application/json; charset=UTF-8
Api-Key: «redacted»
Api-Username: system

Fehlgeschlagen

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

Vielen Dank! Michael Brown

1 „Gefällt mir“

Sie sollten diesen API-Schlüssel sofort rotieren, @zengyunsi, er gilt als kompromittiert.

… obwohl ich bestätigen kann, dass er funktioniert, wenn Sie die Header mit UTF-8 kodieren:

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 „Gefällt mir“

Ist dies der Fall und können Sie ein Beispiel geben, danke!

Content-Type: Application/json; charset=utf-8
Accept: Application/json; charset=utf-8
Api-Key: f9c13aafa9b21baf778161bff66a62533ba650b6e4542e3e9788e98c55ded869
Api-Username: \xe9\xa3\x8e\xe4\xb9\x8b\xe6\x97\x85\xe4\xba\xba

Immer auffordern
Sie dürfen die angeforderte Ressource nicht anzeigen. Der API-Benutzername oder der Schlüssel ist ungültig

Ich kann bestätigen, dass das folgende Beispiel funktionieren würde:

$ 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":[]}

Und ohne api-* Header:

$ 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-Anfragebeispiel:

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]>

Es scheint, dass Ihr api-username nicht richtig kodiert ist.

>>> '风之旅人'.encode()
b'\xe9\xa3\x8e\xe4\xb9\x8b\xe6\x97\x85\xe4\xba\xba'
1 „Gefällt mir“

Vielen Dank an alle, ich werde es versuchen. Wenn Sie den chinesischen Benutzernamen verwenden können, um die API aufzurufen, ist das bequemer. Vielen Dank!


Das ist etwas seltsam und ich kann die API auch nicht normal verwenden

Es ist höchstwahrscheinlich ein Problem mit dem API-Schlüsselbereich.

:sweat_smile: Ich habe es versucht und es scheint auch nicht zu funktionieren, aber ich kann kein Python.
Die gleiche Meldung…

Funktioniert derselbe Aufruf mit einem ASCII-Benutzernamen?

(Ich vermute nein und das meinen Sie mit „Ich kann die API nicht normal verwenden“)

Wenn ja, hat die Website einen weiteren Proxy davor oder verwendet sie die Standardinstallation?

Ja, dieser Aufruf hat ihn als eine maskierte Darstellung der UTF-8-Byte-Sequenz kodiert, anstatt als die Bytes selbst.