Attualmente i nomi utente unicode di discourse non funzionano con l’API
È possibile correggere questo bug?
Attualmente i nomi utente unicode di discourse non funzionano con l’API
È possibile correggere questo bug?
Ho appena provato e ha funzionato per me:
○ → curl -s -L -H 'api-key: «redacted»' -H 'api-username: doesnotexist' https://try.discourse.org/u/运思/notifications.json
{"errors":["Non sei autorizzato a visualizzare la risorsa richiesta. Il nome utente o la chiave API non è valido."],"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"
}
Puoi dimostrare come non funziona per te?
Grazie, Michael Brown.
L’ho testato e se lo testo nel browser va bene, ma nel software di programmazione non va bene, perché la regola è che solo ascii può essere utilizzato per trasferire questo protocollo.
Motivo dell’errore:
TypeError: Carattere non valido nel contenuto dell’intestazione ["Api-Username"]
Si prega di fare riferimento al log, si consiglia di aggiungere ut8 encoding o decoding una volta per la corrispondenza.
Accept:application/json
api-key:f9c13aafa9b21baf778161bff66a62533ba650b6e4542e3e9788e98c55ded869
Api-Username:system
Risultati del test:
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
Non sei autorizzato a visualizzare la risorsa richiesta. Il nome utente o la chiave API non sono validi.
Motivo dell’errore:
L’uso del cinese nell’intestazione non è valido, deve essere codificato da encodeURI() per essere trasmesso al server, ma il server deve decodificarlo con decodeURI() per riconoscerlo.
Si suggerisce di aggiungere un controllo, se non trovato, provare a decodificare decodeURI(), per trovare corrispondenza con il nome utente.
Cosa stai usando? L’errore sembra Python? Questo è supportato da requests ma possibilmente non dalle librerie che stai usando.
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'}
Prova a chiamare .encode() per convertire esplicitamente il valore dell’header in bytes… anche se, ammettiamolo, poiché non tutto è pulito a 8 bit, sono d’accordo con questo suggerimento:
è ragionevole.
Cerca nei forum Le versioni precedenti dell’API possono essere utilizzate con Query
Le versioni più recenti dell’API non funzionano Query
È compatibile con Query Risolvi questo problema
Ad esempio:
https://www.xxx.com/posts.json?api_key=714552c6148e1617aeab526d0606184b94a80ec048fc09894ff1a72b740c5f19&api_username=system
Speriamo che questo venga risolto.
Non lo sarà, ora devi passare i parametri dell’API come intestazioni invece che come parametri di query. Questo non cambierà.
Ma l’intestazione non può passare caratteri non ASCII, voglio passare il nome utente cinese
In realtà, non funziona, ho provato, perché l’intestazione non può contenere caratteri non ASCII, è necessaria una conversione di codifica, ma dopo la codifica dei caratteri, verrà visualizzato un messaggio che l’utente non esiste, perché nel discorso lato ricevente non è stato ripristinato!!
Le intestazioni devono essere codificate come UTF-8, non con codifica URI.
Vengono forniti i seguenti dati di test
https://www.baowei.ink/posts.json
{
"title": "标题标题标题标题标题",
"raw": "标题标题标题标题标题标题标题标题标题标题",
"category": 10,
}
Pass
Content-Type: application/json; charset=UTF-8
Api-Key: «redacted»
Api-Username: system
Fail
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
Grazie! Michael Brown
Dovresti ruotare quella chiave API immediatamente @zengyunsi, considerala compromessa.
… sebbene possa confermare che funziona quando codifichi gli header con 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
È così e puoi fornire un esempio, grazie!
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
Sempre prompt
Non è consentito visualizzare la risorsa richiesta. Il nome utente o la chiave API non sono validi.
Posso confermare che l’esempio seguente funzionerebbe:
$ 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":[]}
E senza l’intestazione 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"}
Esempio con 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]>
Sembra che il tuo api-username non sia codificato correttamente.
>>> '风之旅人'.encode()
b'\xe9\xa3\x8e\xe4\xb9\x8b\xe6\x97\x85\xe4\xba\xba'
Grazie a tutti, ci proverò, se potete usare il nome utente cinese per chiamare l’API è più conveniente, grazie!
È molto probabile che si tratti di un problema con l’ambito della chiave API.
Ho provato, ma sembra che non funzioni nemmeno. Non so Python.
Lo stesso messaggio…
La stessa chiamata con un nome utente ASCII funziona?
(Immagino di no ed è quello che intendi con “Non posso usare l’API normalmente”)
Se sì, il sito web ha un altro proxy davanti o sta utilizzando l’installazione standard?
Sì, questa chiamata l’ha codificata come una rappresentazione escapata della sequenza di byte UTF-8, piuttosto che come i byte stessi.