*

[仮想通貨API]IP制限の上限を超えてアクセスするやり方(プロキシ)

APIアクセス制限には、APIキーベースのものとIPアドレスベースのものがありますが、ここではIPアドレスベースの制限を超える方法について紹介します。

基本的にはどの仮想通貨取引所も両方の制限を書けていますが、ドキュメントに記載されている数値よりも小さいアクセスでもIPアドレスの制限を受けることがあります。

 

下記は、bitFlyerのAPIアクセス制限に関する記載です。

各取引所APIでは一定時間の間にたたくことができる回数に上限があります。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
HTTP API は、以下のとおり呼出回数を制限いたします。

Private API は 1 分間に約 200 回を上限とします。
IP アドレスごとに 1 分間に約 500 回を上限とします。

1 日の平均約定単価が 0.01 未満のユーザーは、翌日の Private API 呼出回数が 1 分間に約 10 回まで制限されることがあります。
マニュアル発注は制限されません。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

(細かい情報は変更されている可能性があります)

これでも十分上限は大きいですが、どうやらこの以下の回数の場合でも
アクセス回数が多いIPはアクセス拒否されることがあるようです。(実体験)

たぶんサーバーがDosと認識して、上限に達する前に自動的に拒否しているんだと思います。

しかし、ネットワークの世界ではこういった事態もよく遭遇するもので、回避方法があります。

プロキシを使う

phpではcurlを使う際にプロキシを設定できます。IPに対するアクセス制限は串を刺せば無問題です。(APIアカウントに対する制限はさすがに無理です。)

海外IPをはじく可能性があるので、プロキシは日本のロケーションのものにしましょう。一応

記述自体は簡単でcurlのオプションに下記を足せばいいだけです。

プロキシの寿命と自動取得

問題は、無料プロキシの場合のプロキシの寿命です。
長時間できるものもありますが、永続的かつ自動的にプロキシのIPを回そうと思います。

手としては、
A 複数のIPをあらかじめリストで取得しておき、失敗したら次のIPを試行するループ文を使う
B プロキシのIPリストをリアルタイムで出しているサイトからスクレイピングして取得し、繰り返し試行する
があります。

Bの方が完全上位互換ですが、なかなかスクレイピングしやすい良いサイトが見つからないので、
とりあえず、Aでいきます。

プロキシ周りはあまり日常において必要性を感じていないので詳しくない関係上、もっといいプロキシIPリストの取得方法があるかもしれません。

リストを外部ファイルにすると巨大なリストも処理できますが、
とりあえずお試しなので、php本文の先頭にずらずら書きます。

(プログラマのやることとは思えない冗長さですね…)

あとはfor文でこの配列の処理をすればOKです。

 

プロキシの取得方法

取引所APIを使った自動売買のプロキシの設定方法ですが、
一番かんたんな方法としては、
Googleで「japan proxy list」などと検索して定期的に
手動でプロキシを更新する方法です。

一番間違いがないとは思いますが正直なところ面倒だと思います。
それが仕事なら良いですけどね。

2つ目の方法としては、
「japan proxy list」の検索結果のサイトの中で
できるだけシンプルなレイアウトのサイトを見つけ、
定期的にCRONでスクレイピングして別ファイルに保存し、
トレードファイルから呼び出す方法です。

CRONはサーバーで定期的にphpなどを呼び出す機能で
最近のレンタルサーバーならメニューの中にあると思います。

スクレイピングは自分でコーディングしなければいけないので、
正直大変だと思います。

スクレイピングに関しては「MT4のチャート上にWEBデータを表示する」際に必要になったことがあるので、
そちらの記事を参照してください。

有料プロキシサーバーサービス

妥協案としては、
長く使える有料proxyサーバーを買うのが一番良いと思います。
数百円でレンタルできますし、速度も早いです。

VPNにしてしまうと、同じIPアドレスを多くの人が使っているので、
弾かれてしまう可能性が高いです。(ZAIFでは弾かれたことがあります)

 

プロキシとタイムアウト設定

また、プロキシを経由するとアクセス上限は超えられますが、
取引所がレスポンスを返そうとしているタイミングでタイムアウトすると、
2重にオーダーを送信してしまう可能性があります。

かといって、タイムアウトを設定しないと
プロキシサーバーが止まった時に
自サーバーのCPUがそこで止まってしまい、サーバー会社に怒られます。

なので、取引所に止められていないのであれば、
プロキシは極力使わない方が良いと思います。

また、bitFlyerのサーバーはアメリカにあるので、
bitFlyerを使う場合は、プロキシリストは日本のロケーションでなくてもOKです。

というより、日本に限定しない方がスクレイピングに向いたサイトは見つかると思います。

 

プロキシとセキュリティ

あと、
無料プロキシの中には情報を抜き取っているところもあるはずなので、
プロキシサーバーを使う場合にはセキュリティと暗号化処理に気を付けてください。

間違ってもデバッグの際にAPIキーを平文で送るようなことがないようにしてください。

 

仮想通貨取引所のアクセス拒否との死闘と解決策

これまで取引所とさまざまな悪戦苦闘を繰り広げてきましたが、
良いアイディアが思いついたので、一回まとめたいと思います。

【これまでの経緯】
取引所にAPIのアクセス拒否される

プロキシを経由してIPアドレスを分散

一つのプロキシだと止まってしまうことがあるので複数のプロキシを使う

プロキシサーバーで停止するとレスポンス待ちになって自サーバーのCPUがパンクして止まる

プロキシ接続にタイムアウトを設定し、プロキシサーバーが止まった場合は次の別のプロキシを使う

取引所でオーダーが通ってレスポンスが返ってくる途中でプロキシサーバーが止まった場合、
オーダーが2重3重で発注される

とここまで来たのですが、
実にシンプルな解決策を思いつきました。

APIにPrivateアクセスする場合、
どの取引所でも「アクセスごとに増加しなければならない数字」(通常はUNIXタイムスタンプ)を
ハッシュに含めます。

これが増加していない場合はエラーになるので、それを逆に利用します

つまり、今までは
プロキシを繰り返し送信するfor文の中で都度タイムスタンプを発行していたのですが、
それをfor文の前に変数に入れることによって、
2重3重にオーダーが通りそうな場合はエラーを発生させることで約定を防ぐことができます。

つまり、

 

これを

こうすればよかっただけです。(コードについては前の投稿を見てください。)

こんな簡単なことに気付かなかったなんて、頭がいい人に見られたらバカにされても文句は言えないですね。

ちなみに今のPHPではマルチタスクもできるので、
オーダーの部分だけマルチタスクにしても良いかもしれません。

しかし、そんなモチベーションはないので、
極めたい人は試してみてください。

ちなみに、アクセス拒否は取引所側の手違いということで、
現在はプロキシを通さずに生IPでやれています。

今回のプロキシ云々が影響するのは、よっぽど大量アクセスをしている人に限られるでしょう。

この投稿は役に立ちましたか? 役に立った 役に立たなかった 0 人中 0 人がこの 投稿 は役に立ったと言っています。

Message

メールアドレスが公開されることはありません。

CAPTCHA


このコメントはWEBに公開されるので、問い合わせ等はメールなどでお願いします。

関連記事

コインチェックのAPIの使い方[PHP] 仮想通貨の自動売買開発

公開:2017/6/21 PHPプログラマと言っても、いろいろな分野の人がいるわけで、WEB系だか

記事を読む

[仮想通貨]現物取引のアービトラージと信用取引のアービトラージは別物

今さら~ な感じもしますが、タイトルの通りです。 仮想通貨からトレードの世界に入ってきた方の中には

記事を読む

仮想通貨APIでコピートレード配信システムを作るやり方

仮想通貨、暗号通貨の流行りって基本的にFXと同じ道をたどるので、 今後予想される流行の一つにコピー

記事を読む

POLONIEXのAPIでビットコインのヒストリデータを取得するやり方 仮想通貨の自動売買開発

公開:2017/9/4 国内の取引所でもAPIを発行している取引所はいくつかありますが、 ビ

記事を読む

サーバー系言語(PHP)で仮想通貨APIを処理するメリット,デメリット

Web APIは基本的にJavascriptで処理させることを想定していますが、これまでのようにPH

記事を読む

 
  • (↑広告です。このサイトの管理者の運営ではありません)

     


  • 横瀬兼元(ペンネーム)です。

    プロフィール
    商材を買わせようとする偽者がいるらしいのでご注意ください。
    ツイッター始めました(イマサラー)
    https://twitter.com/FxantennaC
    (埋め込みするとページ表示が極端に遅くなるので、リンクでご容赦を)

Translate »
ページトップへ