Derzeit funktionieren Discourse-Unicode-Benutzernamen nicht mit der API
Ist es möglich, diesen Fehler zu beheben?
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?
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.
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.
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.
Aber der Header kann keine Nicht-ASCII-Zeichen übergeben. Ich möchte den chinesischen Benutzernamen übergeben.
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.
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
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
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'
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!
Es ist höchstwahrscheinlich ein Problem mit dem API-Schlüsselbereich.
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.