Noms d'utilisateur Unicode

Actuellement, les noms d’utilisateur unicode de Discourse ne fonctionnent pas avec l’API.

Est-il possible de corriger ce bug ?

Je viens d’essayer et cela fonctionne pour moi :

○ → 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"
}

Pouvez-vous démontrer comment cela échoue pour vous ?

2 « J'aime »

Merci, Michael Brown.

Je l’ai testé et si je le teste dans le navigateur, ça va, mais dans le logiciel de programmation, ça ne va pas, car la règle est que seuls les caractères ASCII peuvent être utilisés pour transférer ce protocole.

Raison de l’erreur :

TypeError : Caractère invalide dans le contenu de l’en-tête ["Api-Username"]

Veuillez vous référer au journal, il est recommandé d’ajouter un encodage ou un décodage ut8 une fois pour la correspondance.

  1. Interface de test

  1. Adresse web

https://xxxxxxxx/posts.json

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

Résultats des tests :

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

Vous n’êtes pas autorisé à consulter la ressource demandée. Le nom d’utilisateur ou la clé de l’API est invalide.

Raison de l’erreur :

L’utilisation du chinois dans l’en-tête est invalide, il doit être encodé par encodeURI() pour être transmis au serveur, mais le serveur doit le décoder avec decodeURI() pour le reconnaître.

Suggérez d’ajouter un jugement, si non trouvé, essayez de décoderURI, pour faire correspondre le nom d’utilisateur.

Qu’utilisez-vous ? L’erreur ressemble à du Python ? Ceci est pris en charge par requests mais potentiellement pas par les bibliothèques que vous utilisez.

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'}

Essayez d’appeler .encode() pour convertir explicitement la valeur de l’en-tête en bytes… bien qu’il soit vrai que puisque tout n’est pas propre sur 8 bits, je suis d’accord avec cette suggestion :

est raisonnable.

3 « J'aime »

Rechercher dans les forums Les anciennes versions de l’API peuvent être utilisées avec Query

Les nouvelles versions de l’API ne fonctionnent pas avec Query

Est-ce compatible avec Query Résoudre ce problème

Par exemple :

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

J’espère que cela sera résolu.

Cela ne le sera pas, vous devez maintenant passer les paramètres de l’API en tant qu’en-têtes au lieu de paramètres de requête. Cela ne changera pas.

2 « J'aime »

Mais l’en-tête ne peut pas transmettre de caractères non-ASCII, je veux transmettre le nom d’utilisateur chinois

Il le peut, comme l’a prouvé @supermathie ci-dessus :

cURL

Python :

2 « J'aime »

En fait, cela ne fonctionne pas, j’ai essayé, car l’en-tête ne peut pas contenir de caractères non-ASCII, vous devez effectuer une conversion d’encodage, mais après avoir encodé les caractères, il indiquera que le nom d’utilisateur n’existe pas, car dans le discours, le destinataire n’a pas restauré !!

Les en-têtes doivent être encodés en UTF-8, et non avec un encodage URI.

2 « J'aime »
  1. 1 : l’en-tête ne peut pas contenir de caractères chinois
  2. 2 : utf8 fait référence au contenu du message, pas à l’en-tête
  3. 3 : Discourse n’est pas décodé par UrlEncode, il indiquera que le nom d’utilisateur n’existe pas.

Les données de test suivantes sont fournies

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

Réussite

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

Échec

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

Merci ! Michael Brown

1 « J'aime »

Vous devriez faire pivoter cette clé d’API immédiatement @zengyunsi, considérez-la comme divulguée.

… bien que je puisse confirmer qu’elle fonctionne lorsque vous encodez les en-têtes avec 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 « J'aime »

Est-ce le cas et pouvez-vous fournir un exemple, merci !

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

Toujours inviter
Vous n’êtes pas autorisé à consulter la ressource demandée. Le nom d’utilisateur ou la clé de l’API est invalide.

Je peux confirmer que l’exemple ci-dessous fonctionnerait :

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

Et sans l’en-tête 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"}

Exemple Python avec 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]>

Il semble que votre api-username ne soit pas encodé correctement.

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

Merci à tous, je vais essayer. Si vous pouvez utiliser le nom d’utilisateur chinois pour appeler l’API, ce sera plus pratique. Merci !


C’est un peu étrange et je ne peux pas non plus utiliser l’API normalement

Il s’agit très probablement d’un problème avec la portée de la clé API.

:sweat_smile: J’ai essayé et cela ne semble pas fonctionner non plus, mais je ne connais pas Python.
La même invite…

Le même appel avec un nom d’utilisateur ASCII fonctionne-t-il ?

(Je suppose que non et c’est ce que vous entendez par “Je ne peux pas utiliser l’API normalement”)

Si oui, le site Web a-t-il un autre proxy devant lui ou utilise-t-il l’installation standard ?

Oui, cet appel l’a encodé comme une représentation échappée de la séquence d’octets UTF-8, plutôt que comme les octets eux-mêmes.