Yahoo-APIを無制限に叩くためのモジュール書いた

ふと気づくとYahooの「ウェブ検索API」の利用制限が変わっていて、今までは同一IPからの利用は5万回/24時間でしたが、10月13日から同一appidからの利用が5万回/24時間となっていました。

http://developer.yahoo.co.jp/newslist/1#64

つまりappidを複数用意して数珠つなぎに使って行けば、同一IPからの利用が事実上無制限となるんだよね!?ということで、久しぶりにPerl Module書きました。

WebService::APIKeys::AutoChanger
github: http://github.com/miki/WebService-APIKeys-AutoChanger
CPAN : http://search.cpan.org/~miki/WebService-APIKeys-AutoChanger

まだCPANにあがってないけど、そのうちこのURL↑で反映されると思います。

利用制限(回数と時間)を管理しながら、上限まで達したら次のappidにチェンジ、という処理を自動的にこなしてくれるモジュールです。

きっかけはYahoo-APIでしたが、汎用的に作ったつもりなので、同じような利用制限を設けているweb-APIであれば、たぶんどこででも使えると思います。

使い方

こんな感じで、WebService::Simpleとかと併用するといいよ。

  use WebService::Simple;
  use WebService::APIKeys::AutoChanger;
  
  my $changer = WebService::APIKeys::AutoChanger->new;
  
  $changer->set(
      api_keys => [
          'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
          'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy',
          'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz',
      ],
  );
  
  my $yahooJapan = WebService::Simple->new(
      base_url => 'http://search.yahooapis.jp/WebSearchService/V1/webSearch',
  );
  
  my @query = qw( foo bar baz ... );
  for my $query(@query){
      # 自動的に今現在有効なappidを返してくれます
      my $available_key = $changer->get_available;
      # あとはそれを使うだけ
      my $response = $yahooJapan->get( {
          appid => $available_key,
          query => $query } );
      do_something($response);
  }

内部のしくみ

YahooAPIは24時間で5万回の制限ですが、このような回数制限部分の制御にはThrottler系のモジュールを使ってます。とくに何も指定しなければデフォルトでData::Valveをロードし、max_items 50000, interval 86400で動きます。(YahooAPIにあわせちゃった)

ちなみにData::ValveはMooseを使ってますが、環境/ポリシーによってはMooseを使えない/使わない場合もあるので、そういう時はData::Throttlerを使ってください。こんな感じ。

  my $changer = WebService::APIKeys::AutoChanger->new;  
  $changer->set(
      api_keys => [
          'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
          'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy',
          'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz',
      ],
      throttler_class  => 'Data::Throttler',
      throttler_config => {
          max_items => ...,
          interval  => ...,
      }
  );

でも速度を求めるならData::Valve の方がおすすめです。Mooseの起動コストを考慮してもこっちの方が断然速いです。XSだし。


ちなみにYahoo-APIでは1アカウントでappidを10個まで取得できるみたいです。
なので10個をAutoChangerに設定しておけば、1日に50万クエリまでY-APIを使えてしまいます。

これで安心してがんがんY-APIを叩けるね!やったね!


というわけで、Yahoo様には足を向けては眠れない今日この頃です。