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?

2 Mi Piace

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.

3 Mi Piace

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à.

2 Mi Piace

Ma l’intestazione non può passare caratteri non ASCII, voglio passare il nome utente cinese

Può farlo, come dimostrato da @supermathie sopra:

cURL

Python:

2 Mi Piace

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.

2 Mi Piace
  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

1 Mi Piace

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
3 Mi Piace

È 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'
1 Mi Piace

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.