Proxy Manager を利用してCCXT の Too Many Requests を回避した話

こんばんは!くりぷとべあーです。

今日は小ネタです。CCXTで某取引所を叩く時に頻繁にToo Many Requestを吐いてうざかったのでそれに対処した話です。

正直もっと簡単な回避方法もあるかもしれないと思いつつ書いたので、なんかもっと良いやり方あったらぜひマウントして教えてくださいw

使ったもの

Zyte Smart Proxy Managerというサービスを利用しました。(アフィリンクではないので安心して踏んでくださいw)

これを使えば以下のような簡単なコードでProxyを利用したアクセスにしてくれて、かつ、アクセス毎に自動で違うIPを割り振ってくれます。便利ですね。

import json
import requests

API_KEY = 'hogehogehogehogehoge'
res = requests.get(
    "https://httpbin.org/get",
    proxies={
        'http': f"http://{API_KEY}:@proxy.crawlera.com:8011/",
        'https': f"http://{API_KEY}:@proxy.crawlera.com:8011/"
    },
    verify='/path/to/zyte-proxy-ca.crt'
)
json.loads(res.text)['origin']

CCXTで使う

そして、Zyte Smart Proxy Manager を CCXT で使います。

結論から言うと以下のようなコードで利用できました。Binanceは全然Too Many Requestにならないのですがあくまでイメージとして使いました。

import ccxt

EXCHANGES = [
    'ftx',
    'binance',
]
USE_PROXY_EXCHANGES = [
    'binance',
]
API_KEY = 'hogehogehogehogehoge'

def create_ccxt_client(exchange_name):
    exchange_class = getattr(ccxt, exchange_name)
    client = exchange_class()

    if exchange_name in USE_PROXY_EXCHANGES:
        client.proxies = {
            'http': f"http://{API_KEY}:@proxy.crawlera.com:8011/",
            'https': f"http://{API_KEY}:@proxy.crawlera.com:8011/"
        }
        # 以下二行の設定方法が正しいかどうかわからない、が、ちゃんと動いてはいる。
        client.verify = '/path/to/zyte-proxy-ca.crt'
        client.validateServerSsl = '/path/to/zyte-proxy-ca.crt'

    return client

for exchange in EXCHANGES:
    client = create_ccxt_client(exchange)
    client.load_markets()

ちなみに上記のコードはCCXTのソースコードの この辺り を見ながら作りました。certを噛ませるところが少し難しかったです。もっと他に正しいやり方があるような気もします…。(正しいやり方知ってる方とかいたら教えてください)

環境変数を設定してリクエストする方法ならもっと簡単だったのですが、以下の理由から上記のやり方を取りました。

  • 環境変数に設定すると影響範囲が広すぎた。Slackにメッセージを飛ばすようなライブラリもProxy経由になったりと影響が出てしまった。

  • 環境変数に設定するとProxyを噛ませる必要がない取引所でもProxy経由になってしまう。環境変数を無視するオプションがCCXTにあるのでそれを使えばいいが、そのように組むくらいならProxyを利用する場合のみProxyの設定を噛ませるのが正道だろう。

注意点とか

Zyte Smart Proxy Manager の価格は超安い訳ではないと思います。普通のプランだと$0.01/accessぐらいでした。

高い訳でもないですが、投機的実行で超大量のtxを投げる用途としては高すぎて使いづらいだろうなぁという感じです。

Basicプランだと$0.01/accessぐらい

また、レイテンシもやや気になります。超遅くはないですが、安定しなくてたまにめっちゃ遅いです。なのでオーダー出す時とか、オーダーを出すために正確な板を取る時とかはProxy Managerを外してアクセスかけるのが妥当かなとか思ってます。

おわりに

上記のような懸念はあるとしても、まぁまぁ使い勝手いいんじゃないかなと思います。

自分でIPローテーションさせるプロキシサーバー組んだりするのも面倒だし、Proxyのリスト買ってくるのもProxyの精査の手間とかあったりすると思うので、お金払う価値はあるかなと思います。

よかったら使ってみてください。
んじゃまたね🤗

この記事が気に入ったらサポートをしてみませんか?