JavaScript だけで無料で IP アドレスを取得する方法

 

Google Adsense のアドセンス狩りなどの被害から自分のウェブサイトを守るために、

容疑者の IP アドレスを特定することが必要になります。

しかし、サーバがないに等しい静的サイトではサーバサイドの言語である PHP を使用することができません。

今回は、

  • PHP を使わずに JavaScript と外部 API を用いて、無料で IP アドレスを取得する方法
  • 取得した IP アドレスを Google Analytics 画面に表示させる方法

をご紹介します。

関連記事

Google Adsense 広告のクリックには注意しよう

Google Adsense 広告のクリックには注意しよう


IP アドレスを取得する

ipinfo.io というサービスを利用します。

scriptタグを JavaScript で動的に生成して、src属性にhttps://ipinfo.io?callback=callbackを指定します。

このscriptタグを、headタグの末尾に追加すると、API から JSONP 形式のデータがcallback関数を通して取得できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<script>
    var script = document.createElement('script');
    script.src='https://ipinfo.io?callback=callback'
    document.head.appendChild(script);

    function callback(data) {
        console.log(data.ip);
    };
    // またはアロー関数を使って
    // callback = data => console.log(data.ip);
</script>

これでコンソールに IP アドレスが表示されるようになります。

アロー関数について

アロー関数


コールバック関数外部から参照する

data.ipという値はcallback関数の外部から参照できないので、次のように書くことはできません。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<script>
    var script = document.createElement('script');
    script.src='https://ipinfo.io?callback=callback'
    document.head.appendChild(script);

    function callback(data) {
        const ip_adress = data.ip;
    };
    
    console.log(ip_adress);
</script>
-> ip_adress is not defined

これを解消するために、WeakMapを使用します。

WeakMapは連想配列の強化版で、Hugo の.Scratchのようなものです。

これを使えば、関数の外部からも関数内の値を参照できるようになります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<script>
    var wm = new WeakMap;
    var obj = {};
    callback = data => wm.set(obj, data.ip);

    var script = document.createElement('script');
    script.src='https://ipinfo.io?callback=callback'
    document.head.appendChild(script);

    console.log(wm.get(obj));
</script>

ところが、これだけではまだコンソールに表示されません。

これは、行動フローとしてこのscriptタグの処理(console.log(wm.get(obj));まで)がすべて終わった後に、

新たに生成されたscriptタグが IP アドレスを取得しているからです。

つまり、

  1. IP アドレスを取得するためのscriptタグを生成
  2. console.log()
  3. 新たに生成されたscriptタグが IP アドレスを取得

という流れになってしまっています。

window.onloadを使って、HTML の読み込みが完了してからconsole.log()を実行させます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<script>
    var wm = new WeakMap;
    var obj = {};
    callback = data => wm.set(obj, data.ip);

    var script = document.createElement('script');
    script.src='https://ipinfo.io?callback=callback'
    document.head.appendChild(script);

    window.onload = () => console.log(wm.get(obj));
</script>

Google Analytics と連携させる

Google Analyticsの画面から、

管理 > カスタム定義 > カスタムディメンションを選択します。

Google Analytics カスタムディメンション

「新しいカスタムディメンション」をクリックし、内容を入力します。

「名前」は任意で、「範囲」を「ヒット」、「アクティブ」はチェックをします。

保存を押したあと、サンプルコードが出てきて、'dimension1'などと書かれた部分があるのですが、

その数字は後ほど使います。


さて、コードを編集します。

Google Analytics のトラッキングコードに gtag.js を使っているなら、

次のようなコードがheadタグの間に挿入されていると思います。

1
2
3
4
5
6
7
8
9
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-000000000-0"></script>
<script>
    window.dataLayer = window.dataLayer || [];
    function gtag(){dataLayer.push(arguments);}
    gtag('js', new Date());

    gtag('config', 'UA-000000000-0');
</script>

カスタムディメンションを使用するために、次のように編集します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-000000000-0"></script>
<script>
    window.dataLayer = window.dataLayer || [];
    function gtag(){dataLayer.push(arguments);}
    gtag('js', new Date());

    gtag('config', 'UA-000000000-0', {
        'custom_map': {
            'dimension1': 'ip'
        },
        'ip': wm.get(obj)
    });
</script>

これをさきほどのコードとあわせます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-000000000-0"></script>
<script>
    var wm = new WeakMap;
    var obj = {};
    callback = data => wm.set(obj, data.ip);

    var script = document.createElement('script');
    script.src='https://ipinfo.io?callback=callback'
    document.head.appendChild(script);

    window.onload = () => {
        window.dataLayer = window.dataLayer || [];
        function gtag(){dataLayer.push(arguments);}
        gtag('js', new Date());

        gtag('config', 'UA-000000000-0', {
            'custom_map': {
                'dimension1': 'ip'
            },
            'ip': wm.get(obj)
        });
    };
</script>

これで取得した IP アドレスが Google Analytics に認識されるようになります。


Google Analytics から確認できるようにする

Google Analytics の画面から、

カスタム > カスタムレポート > 新しいカスタムレポート を選択します。

ディメンションの詳細 > ディメンションの追加 から、さきほど設定したカスタムディメンションを選択します。

例えば、IP という名前にしていれば、IP と検索すれば出てきます。

他の項目を設定して保存すれば、カスタムレポートから IP アドレスを確認することができるようになります。


お役に立てれば幸いです。

では👋