Nomi utente Unicode

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.

  1. Interfaccia di test

  1. Indirizzo web

https://xxxxxxxx/posts.json

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

Può farlo, come dimostrato da @supermathie sopra:

cURL

Python:

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.

  1. 1: l’intestazione non può contenere caratteri cinesi
  2. 2: utf8 si riferisce al contenuto del post, non all’intestazione
  3. 3: Discourse non viene decodificato da UrlEncode, mostrerà che il nome utente non esiste.

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!


Questo è un po’ strano e non riesco nemmeno a usare l’API normalmente

È molto probabile che si tratti di un problema con l’ambito della chiave API.

:sweat_smile: 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.