No momento, nomes de usuário Unicode do Discourse não funcionam com a API.
É possível corrigir este bug?
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ê?
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.
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.
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.
Mas o cabeçalho não pode passar caracteres não ASCII, quero passar o nome de usuário chinês
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.
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
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
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'
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!
É muito provável que seja um problema com o escopo da chave da API.
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.