現在、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"
}
どのように失敗するかデモンストレーションしていただけますか?
Michael Brown様、ありがとうございます。
テストしたところ、ブラウザでは問題ありませんでしたが、プログラミングソフトウェアでは問題が発生しました。これは、このプロトコルを転送するにはASCIIのみが使用できるというルールがあるためです。
エラーの原因:
TypeError: ヘッダーコンテンツに無効な文字があります [“Api-Username”]
ログを参照してください。一致させるために、utf8エンコーディングまたはデコーディングを一度追加することが推奨されます。
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ビットクリーンではないため、この提案には同意します:
は理にかなっています。
フォーラムを検索する クエリで古いバージョンのAPIを使用できます
新しいバージョンのAPIはクエリで動作しません
クエリと互換性がありますか この問題を修正してください
例:
https://www.xxx.com/posts.json?api_key=714552c6148e1617aeab526d0606184b94a80ec048fc09894ff1a72b740c5f19&api_username=system
これが解決されることを願っています。
解決しません。APIパラメータはクエリパラメータではなくヘッダーとして渡す必要があります。それは変わりません。
しかし、ヘッダーはASCII以外の文字を渡すことができません。中国語のユーザー名を渡したいのです。
実際には機能しません。試しましたが、ヘッダーにASCII以外の文字を含めることはできないため、エンコード変換を行う必要があります。しかし、文字をエンコードした後、ユーザー名が存在しないというプロンプトが表示されます。これは、受信側のディスコースで復元されていないためです。
ヘッダーはURIエンコーディングではなく、UTF-8でエンコードする必要があります。
以下のテストデータを提供します
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
ありがとうございます!マイケル・ブラウン
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
これは正しいですか、そして例を挙げてもらえますか、ありがとう!
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'
ありがとうございます。試してみます。中国語のユーザー名を使用してAPI操作を呼び出すことができれば、より便利です。ありがとうございます!
APIキーのスコープに問題がある可能性が高いです。
試してみましたが、うまくいかないようです。Pythonはできませんが。
同じメッセージが表示されます。
ASCIIユーザー名で同じ呼び出しは機能しますか?
(おそらく機能せず、それが「APIを通常どおり使用できません」という意味だと思います)
もしそうなら、ウェブサイトは別のプロキシを使用していますか、それとも標準のインストールを使用していますか?
はい、この呼び出し は、バイト自体ではなく、UTF-8 バイト シーケンスのエスケープされた表現としてエンコードしました。