Unicodeユーザー名

現在、Discourse の Unicode ユーザー名は API で機能しません。

このバグを修正することは可能ですか?

これを試したところ、うまくいきました。

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

どのように失敗するかデモンストレーションしていただけますか?

「いいね!」 2

Michael Brown様、ありがとうございます。

テストしたところ、ブラウザでは問題ありませんでしたが、プログラミングソフトウェアでは問題が発生しました。これは、このプロトコルを転送するにはASCIIのみが使用できるというルールがあるためです。

エラーの原因:

TypeError: ヘッダーコンテンツに無効な文字があります [“Api-Username”]

ログを参照してください。一致させるために、utf8エンコーディングまたはデコーディングを一度追加することが推奨されます。

  1. テストインターフェース

  1. Webアドレス

https://xxxxxxxx/posts.json

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

テスト結果

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

リソースを表示する権限がありません。APIユーザー名またはキーが無効です。

エラーの原因

ヘッダーでの中国語の使用は無効です。サーバーに送信するにはencodeURI()でエンコードする必要がありますが、サーバーが認識するにはdecodeURI()でデコードする必要があります。

判断を追加することを提案します。見つからない場合は、decodeURI()を試してユーザー名を一致させてください。

何を使用していますか?エラーはPythonのようですが、これはrequestsではサポートされていますが、使用しているライブラリではサポートされていない可能性があります。

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

ヘッダー値を明示的にbytesに変換するために.encode()を呼び出してみてください…もっとも、すべてが8ビットクリーンではないため、この提案には同意します:

は理にかなっています。

「いいね!」 3

フォーラムを検索する クエリで古いバージョンのAPIを使用できます

新しいバージョンのAPIはクエリで動作しません

クエリと互換性がありますか この問題を修正してください

例:

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

これが解決されることを願っています。

解決しません。APIパラメータはクエリパラメータではなくヘッダーとして渡す必要があります。それは変わりません。

「いいね!」 2

しかし、ヘッダーはASCII以外の文字を渡すことができません。中国語のユーザー名を渡したいのです。

@supermathie が上記で証明したように、渡すことができます。

cURL

Python:

「いいね!」 2

実際には機能しません。試しましたが、ヘッダーにASCII以外の文字を含めることはできないため、エンコード変換を行う必要があります。しかし、文字をエンコードした後、ユーザー名が存在しないというプロンプトが表示されます。これは、受信側のディスコースで復元されていないためです。

ヘッダーはURIエンコーディングではなく、UTF-8でエンコードする必要があります。

「いいね!」 2
  1. 1: ヘッダーに中国語文字を含めることはできません。
  2. 2: utf8 は投稿のコンテンツを参照し、ヘッダーは参照しません。
  3. 3: Discourse は UrlEncode でデコードされず、ユーザー名が存在しないと表示されます。

以下のテストデータを提供します

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

成功

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

失敗

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

ありがとうございます!マイケル・ブラウン

「いいね!」 1

APIキーは直ちにローテーションしてください @zengyunsi、漏洩したと考えてください。

…ただし、ヘッダーを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

これは正しいですか、そして例を挙げてもらえますか、ありがとう!

Content-Type: Application/json; charset=utf-8
Accept: Application/json; charset=utf-8
Api-Key: f9c13aafa9b21baf778161bff66a62533ba650b6e4542e3e9788e98c55ded869
Api-Username: 風の旅人

常にプロンプトを表示
要求されたリソースを表示することは許可されていません。APIのユーザー名またはキーが無効です。

以下の例で確認できます。

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

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

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

api-username が適切にエンコードされていないようです。

>>> '风之旅人'.encode()
b'\xe9\xa3\x8e\xe4\xb9\x8b\xe6\x97\x85\xe4\xba\xba'
「いいね!」 1

ありがとうございます。試してみます。中国語のユーザー名を使用してAPI操作を呼び出すことができれば、より便利です。ありがとうございます!


これは少し奇妙で、APIも通常どおり使用できません

APIキーのスコープに問題がある可能性が高いです。

:sweat_smile:試してみましたが、うまくいかないようです。Pythonはできませんが。
同じメッセージが表示されます。

ASCIIユーザー名で同じ呼び出しは機能しますか?

(おそらく機能せず、それが「APIを通常どおり使用できません」という意味だと思います)

もしそうなら、ウェブサイトは別のプロキシを使用していますか、それとも標準のインストールを使用していますか?

はい、この呼び出し は、バイト自体ではなく、UTF-8 バイト シーケンスのエスケープされた表現としてエンコードしました。