質問の一括インポート

こんにちは

私の質問と回答は JSON 形式で用意されています:

サンプル JSON ドキュメント
{
    "id": "x017c4h221p7T8sboHglB-7kQ==",
    "created": "2018-05-09T20:13:23Z",
    "title": "Docker i/o エラー",
    "body": "<p>こんにちは Stephane さん、Kafka を実行するたびに Docker を再起動しなければなりません。TCP ポートバインドでエラーが発生するためです。Kafka サービスを停止して終了すると、ポートは解放されると理解しています。</p>",
    "course": {
        "_class": "course",
        "id": "x0190RCkGpZ6FMe4CPAF8aOoQ==",
        "title": "Apache Kafka シリーズ - 初心者向け Apache Kafka 入門 v2",
        "url": "/apache-kafka/"
    },
    "replies": [{
            "_class": "answer",
            "id": "x01Qx2rNaX48kxP4NFFSSCK7g==",
            "created": "2018-05-10T07:04:10Z",
            "user": {
                "_class": "user",
                "id": "x01N-Fup_OULjTEtHPLwc8JSQ==",
                "name": "Ivan",
                "locale": "en_US"
            },
            "is_top_answer": null,
            "body": "<p>こんにちは Nandini さん、</p><p>問題についてもう少し詳しく説明していただけませんか?Kafka サービスを停止すれば、もちろん Kafka が使用するポートは解放されます。</p><p>よろしくお願いいたします、</p><p>Ivan</p>",
        },
        {
            "_class": "answer",
            "id": "x01bLG2QPhyLwZ_RJsbMge16A==",
            "created": "2018-05-10T20:45:39Z",
            "user": {
                "_class": "user",
                "id": "x01oX4mwhRQoLXKuhHXDHg3zg==",
                "name": "Nandini",
                "locale": "en_US"
            },
            "is_top_answer": null,
            "body": "<p>Kafka サービスを停止して再起動すると、Docker のポートが解放されず、ポート 2181 と 3030 で TCP バインディングエラーが発生します。</p>",
            "is_upvoted": false,
            "num_upvotes": 0
        },
        {
            "_class": "answer",
            "id": "x01yL8D1-inVZE3njAo08-uMw==",
            "created": "2018-05-11T00:32:46Z",
            "user": {
                "_class": "user",
                "id": "x01lNfqEyIqBf47SM76dxq0rw==",
                "name": "Stephane Maarek",
                "locale": "en_US"
            },
            "is_top_answer": true,
            "body": "<p>可能であれば Docker エンジンを、またはコンピュータを再起動してみてください。それで解決するかどうか確認してください!</p><p>それ以外の場合は、ポート 2181 上で何かが実行されています。FAQ レクチャー(レクチャー 22)を確認してください。多くの学生が同様の問題に直面しています。</p>",
            "is_upvoted": false,
            "num_upvotes": 0
        }
    ],
    "user": {
        "_class": "user",
        "id": "x01oX4mwhRQoLXKuhHXDHg3zg==",
        "name": "Nandini",
        "locale": "en_US"
    }
}

API を呼び出すための Python スクリプトを開発しましたが、API 側でスロットリングに関連するエラーが多数発生しています:

このアクションを多すぎます。もう一度試す前に X 秒お待ちください。

合計約 3000 件の質問(平均 2 つの回答付き)をインポートする必要がありますが、API ルートが長すぎるのではないかと思っています。

この API スロットリングの問題を無効にする方法はありますか?

データをインポートする他の方法はありますか? 関連するユーザーは 2 人のみなので、ユーザー作成は不要です。また、ホストされた Discourse を使用しているため、基盤となるデータベースに直接アクセスできるかどうかわかりません。

持っている Python コードを共有することも、この作業に多くの労力が必要であればバウンティを設けることも喜んで行います。

Make sure the user performing the actions via the API key has staff privileges, even if only temporary.

That will help with some of the rate limits.

An easy approach I used was to add
sleep(0.7)
inside the Ruby loop. (you may need to tweak that)

For 3000 requests it would take 35 minutes to complete. A bit painful, but for a once off I don’t think it would be all that bad.

「いいね!」 5

I have admin permissions (using my own API key) and I still get a throttle it seems every 60 API calls. I tried to change things in settings > Rate limits but doesn’t seem to help

「いいね!」 3

同様の現象が発生します。

もし意図的に1秒の遅延を加えると、その問題は発生しなくなります。

OK、1分あたり60回の呼び出し制限は以下のように回避できます。

サーバー上で

cd /var/discourse

containers/app.yml をエディタで開きます(私は vi を使用します)。env セクションに以下の行を追加します。

DISCOURSE_MAX_ADMIN_API_REQS_PER_KEY_PER_MINUTE : 6000

保存します。

再構築してください(単なる再起動では効果はありません)
./launcher rebuild app

「いいね!」 2