Nombres de usuario Unicode

Actualmente, los nombres de usuario de Unicode de Discourse no funcionan con la API.

¿Es posible corregir este error?

Lo acabo de probar y me funciona:

○ → curl -s -L -H 'api-key: «redacted»' -H 'api-username: doesnotexist' https://try.discourse.org/u/运思/notifications.json
{"errors":["No tiene permiso para ver el recurso solicitado. El nombre de usuario o la clave de la API no son válidos."],"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"
}

¿Puede demostrar cómo le falla a usted?

2 Me gusta

Gracias, Michael Brown.

Lo he probado y si lo pruebo en el navegador está bien, pero en el software de programación no está bien, porque la regla es que solo se pueden usar caracteres ascii para transferir este protocolo.

Razón del error:

TypeError: Carácter no válido en el contenido de la cabecera ["Api-Username"]

Por favor, consulte el registro, se recomienda añadir codificación o decodificación ut8 una vez para que coincida.

  1. Interfaz de prueba

  1. Dirección web

https://xxxxxxxx/posts.json

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

Resultados de la prueba:

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

No tiene permiso para ver el recurso solicitado. El nombre de usuario o la clave de la API no son válidos.

Razón del error:

El uso de caracteres chinos en la cabecera no es válido, necesita ser codificado con encodeURI() para poder ser transmitido al servidor, pero el servidor necesita decodificarlo con decodeURI() para poder reconocerlo.

Sugiero añadir una comprobación, si no se encuentra, intentar decodificarURI, para que coincida con el nombre de usuario.

¿Qué estás usando? ¿El error parece de Python? Esto es compatible con requests, pero posiblemente no con las bibliotecas que estás 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'}

Intenta llamar a .encode() para convertir explícitamente el valor del encabezado a bytes… aunque hay que admitir que, dado que no todo es 8-bit limpio, estoy de acuerdo con esta sugerencia:

es razonable.

3 Me gusta

Buscar en los foros Las versiones anteriores de la API se pueden usar con Query

Las versiones más recientes de la API no funcionan con Query

¿Es compatible con Query? Soluciona este problema

Por ejemplo:

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

Esperemos que esto se resuelva.

No lo hará, ahora necesita pasar los parámetros de la API como encabezados en lugar de parámetros de consulta. Eso no cambiará.

2 Me gusta

Pero la cabecera no puede pasar caracteres no ASCII, quiero pasar el nombre de usuario chino

Sí puede, como demostró @supermathie arriba:

cURL

Python:

2 Me gusta

De hecho, no funciona, lo he intentado, porque la cabecera no puede contener caracteres no ASCII, necesitas hacer una conversión de codificación, pero después de codificar los caracteres, te pedirá que el nombre de usuario no existe, ¡porque en el discurso en el extremo receptor no se restauró!

Las cabeceras deben codificarse como UTF-8, no con codificación URI.

2 Me gusta
  1. 1: el encabezado no puede contener caracteres chinos
  2. 2: utf8 se refiere al contenido de la publicación, no al encabezado
  3. 3: Discourse no se decodifica mediante UrlEncode, mostrará que el nombre de usuario no existe.

Se proporcionan los siguientes datos de prueba

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

Aprobado

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

Fallido

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

¡Gracias! Michael Brown

1 me gusta

Deberías rotar esa clave de API inmediatamente @zengyunsi, considérala filtrada.

… aunque puedo confirmar que funciona cuando codificas las cabeceras 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 Me gusta

¿Es este el caso y puede proporcionar un ejemplo, gracias!

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

Siempre solicite
No tiene permitido ver el recurso solicitado. El nombre de usuario o la clave de la API no son válidos.

Puedo confirmar que el siguiente ejemplo funcionaría:

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

Y sin la cabecera 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"}

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

Parece que tu api-username no está codificado apropiadamente

>>> '风之旅人'.encode()
b'\xe9\xa3\x8e\xe4\xb9\x8b\xe6\x97\x85\xe4\xba\xba'
1 me gusta

Gracias a todos, voy a intentarlo. Si pueden usar el nombre de usuario chino para llamar a la operación de la API es más conveniente, ¡gracias!


Esto es un poco extraño y tampoco puedo usar la API normalmente.

Es muy probable que sea un problema con el ámbito de la clave de API.

:sweat_smile: Lo intenté y parece que tampoco funciona, pero no sé Python.
La misma indicación…

¿Funciona la misma llamada con un nombre de usuario ASCII?

(Supongo que no y eso es lo que quieres decir con “No puedo usar la API normalmente”)

Si es así, ¿el sitio web tiene otro proxy delante o está utilizando la instalación estándar?

Sí, esta llamada la codificó como una representación escapada de la secuencia de bytes UTF-8, en lugar de los bytes en sí.