Alligator Swamp

技術メモ

どこどこJPを使ってみた

位置情報が欲しいなーということで、この前海外のサービスであるGeoIPについて調査したが、どうやら日本製のものもあるらしいので調べてみた。

どこどこJP

IPアドレスDBを提供する日本のサービス。
位置情報はもちろん、情報の正確度や法人からのアクセスであれば企業情報も取得可能。
これらの情報を取得するには、APIを用いて指定URLにアクセスを行う。
金額は初期費用¥50,250+¥10,250~(リクエスト数に応じて金額UP)
ただし、個人利用&非商用利用であれば無料。

APIの種類

  • Javascript API
    • scriptタグを指定するだけで、アクセスしてきたIPの情報を取得可能。
    • Cookieを利用してAPIサーバのリクエスト回数を抑えると良い。(方法はこちら)
  • REST API
    • URLにapiキーとIPアドレスと指定しリクエストを行う。
    • フォーマットはxmlとjsonのみ。
    • 1リクエスト1IP。
  • リクエスト情報取得API
    • タグを貼ったページのアクセス数を、日別、月別、都道府県別などの区分で取得することが出来る。
    • フォーマットはxmlとjsonのみ。

REST APIでJSON形式のデータ取得をしてみる

まず個人利用登録して非商用利用のAPIキーを作成。
以下の様なperlソースを書いて実行。

#!/usr/bin/env perl

use strict;
use warnings;

use LWP::UserAgent;
use URI;
use JSON qw(decode_json);
use Encode;
use utf8;

sub get_docodoco_data {

    my $ipadr = shift;

    my $uri = make_request_uri($ipadr);
    my $ua = LWP::UserAgent->new;
    my $res = $ua->get($uri);

    die "Error: ". $res->status_line if $res->is_error;
    my $json = $res->content;
    my $ref = decode_json(encode_utf8($json));

    return $ref;
}

sub make_request_uri {

    my $ipadr = shift;

    my $base_uri = 'http://api.docodoco.jp/v3/search';
    my $api_key1 = 'APIキー1';
    my $api_key2 = 'APIキー2';
    my $format   = 'json';
    my $charset  = 'utf8';

    my $uri = URI->new($base_uri);
    my $params = {
        key1 => $api_key1,
        key2 => $api_key2,
        ipadr => $ipadr,
        format => $format,
        charset => $charset
    };
    $uri->query_form(%$params);

    return $uri;
}

my $ipadr = shift;
die "Error: 引数がないぞ" unless defined $ipadr;

my $docodoco = get_docodoco_data($ipadr);

print "CountryCode : " . $docodoco->{CountryCode} . "\n";
print "CountryAName: " . $docodoco->{CountryAName} . "\n";
print "CountryJName: " . $docodoco->{CountryJName} . "\n";
print "PrefCode    : " . $docodoco->{PrefCode} . "\n";
print "PrefAName   : " . $docodoco->{PrefAName} . "\n";
print "PrefJName   : " . $docodoco->{PrefJName} . "\n";
print "PrefCF      : " . $docodoco->{PrefCF} . "\n";
print "CityAName   : " . $docodoco->{CityAName} . "\n";
print "CityJName   : " . $docodoco->{CityJName} . "\n";
print "CityCF      : " . $docodoco->{CityCF} . "\n";
print "CityLatitude: " . $docodoco->{CityLatitude} . "\n";
print "CityLongtude: " . $docodoco->{CityLongtude} . "\n";

結果は以下のとおり。

CountryCode : JP
CountryAName: japan
CountryJName: 日本
PrefCode    : 13
PrefAName   : tokyo
PrefJName   : 東京
PrefCF      : 00
CityAName   : shinjuku-ku
CityJName   : 新宿区
CityCF      : 00
CityLatitude: 35.69390
CityLongtude: 139.70343

get_docodoco_dataというサブルーチン名にセンスの無さが伺えるが気にしない。
CF値が高いと信頼性も高いとのこと。
なので上記の結果は日本からのアクセスである、としか分からなかったという事ですね。

レスポンスタイムの計測

上記ソースとは別に、テキストファイルに書かれたIP一覧をリクエストをするというソースを書いて実行したところ、1件当たり20msec~30msecの時間がかかった。
計算上では1万件のログを処理しようとすると3~5分くらいかかる。
(公式では平均すると300msec以内と書かれているのは危険係数込みかな)

GeoIPとの比較

GeoIPではJapanとしか分からないIPでも、どこどこJPでは日本/東京/新宿区と詳細に取得出来ることが多々ある。
海外のIP(主にUS)だとまったく逆の結果になる。
メインターゲットが日本なのであればどこどこJPを使うべきだなぁー。