Actualmente, los nombres de usuario de Unicode de Discourse no funcionan con la API.
¿Es posible corregir este error?
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?
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.
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.
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á.
Pero la cabecera no puede pasar caracteres no ASCII, quiero pasar el nombre de usuario chino
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.
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
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
¿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'
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!
Es muy probable que sea un problema con el ámbito de la clave de API.
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í.