Nomes de usuário Unicode

No momento, nomes de usuário Unicode do Discourse não funcionam com a API.

É possível corrigir este bug?

Acabei de tentar isso e funcionou para mim:

○ → curl -s -L -H 'api-key: «redacted»' -H 'api-username: doesnotexist' https://try.discourse.org/u/运思/notifications.json
{"errors":["You are not permitted to view the requested resource. The API username or key is invalid."],"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"
}

Você pode demonstrar como falha para você?

2 curtidas

Obrigado, Michael Brown.

Eu testei e, se eu testar no navegador, está tudo bem, mas no software de programação não está, porque a regra é que apenas ASCII pode ser usado para transferir este protocolo.

Motivo do erro:

TypeError: Caractere inválido no conteúdo do cabeçalho ["Api-Username"]

Por favor, consulte o log, recomenda-se adicionar codificação ou decodificação ut8 uma vez para correspondência.

  1. Interface de teste

  1. Endereço da web

https://xxxxxxxx/posts.json

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

Resultados do teste:

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

Você não tem permissão para visualizar o recurso solicitado. O nome de usuário ou a chave da API são inválidos.

Motivo do erro:

O uso de chinês no cabeçalho é inválido, ele precisa ser codificado por encodeURI() para ser transmitido ao servidor, mas o servidor precisa decodificar decodeURI() para reconhecê-lo.

Sugere-se adicionar um julgamento, se não for encontrado, tentar decodificarURI, corresponder ao nome de usuário.

O que você está usando? O erro parece ser em Python? Isso é suportado por requests, mas possivelmente não pelas bibliotecas que você está 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'}

Tente chamar .encode() para converter explicitamente o valor do cabeçalho para bytes… embora admitamos que, como nem tudo é 8 bits limpo, concordo com esta sugestão:

é razoável.

3 curtidas

Pesquisar nos fóruns Versões mais antigas da API podem ser usadas com Query

Versões mais recentes da API não funcionam Query

É compatível com Query Corrija este problema

Por exemplo:

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

Espero que isso seja resolvido.

Não será, você agora precisa passar os parâmetros da API como cabeçalhos em vez de parâmetros de consulta. Isso não vai mudar.

2 curtidas

Mas o cabeçalho não pode passar caracteres não ASCII, quero passar o nome de usuário chinês

Pode, como provado por @supermathie acima:

cURL

Python:

2 curtidas

Na verdade, não funciona, eu tentei, porque o cabeçalho não pode conter caracteres não ASCII, você precisa fazer uma conversão de codificação, mas após a codificação dos caracteres, ele irá notificar que o nome de usuário não existe, porque no discurso do lado receptor não foi restaurado!!

Os cabeçalhos precisam ser codificados como UTF-8, não com codificação URI.

2 curtidas
  1. 1: o cabeçalho não pode conter caracteres chineses
  2. 2: utf8 refere-se ao conteúdo da postagem, não ao cabeçalho
  3. 3: Discourse não é decodificado por UrlEncode, ele mostrará que o nome de usuário não existe.

Os seguintes dados de teste são fornecidos

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

Obrigado! Michael Brown

1 curtida

Você vai querer rotacionar essa chave de API imediatamente @zengyunsi, considere-a vazada.

… embora eu possa confirmar que funciona quando você codifica os cabeçalhos com 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 curtidas

Este é o caso e você pode fornecer um exemplo, obrigado!

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 solicite
Você não tem permissão para visualizar o recurso solicitado. O nome de usuário ou a chave da API é inválido

Posso confirmar que o exemplo abaixo funcionaria:

$ 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 sem o cabeçalho 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"}

Exemplo 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 seu api-username não está codificado adequadamente

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

Obrigado a todos, vou tentar, se você puder usar o nome de usuário chinês para chamar a operação da API é mais conveniente, obrigado!


Isso é um pouco estranho e eu também não consigo usar a API normalmente

É muito provável que seja um problema com o escopo da chave da API.

:sweat_smile: Tentei e parece que também não funciona, mas eu não sei Python.
A mesma mensagem de erro…

A mesma chamada com um nome de usuário ASCII funciona?

(Acho que não e é isso que você quer dizer com “Não consigo usar a API normalmente”)

Se sim, o site tem outro proxy na frente dele ou está usando a instalação padrão?

Sim, esta chamada a codificou como uma representação escapada da sequência de bytes UTF-8, em vez dos próprios bytes.