Google Adsense のアドセンス狩りなどの被害から自分のウェブサイトを守るために、
容疑者の IP アドレスを特定することが必要になります。
しかし、サーバがないに等しい静的サイトではサーバサイドの言語である PHP を使用することができません。
今回は、
- PHP を使わずに JavaScript と外部 API を用いて、無料で IP アドレスを取得する方法
- 取得した IP アドレスを Google Analytics 画面に表示させる方法
をご紹介します。
IP アドレスを取得する
ipinfo.io というサービスを利用します。
script
タグを JavaScript で動的に生成して、src
属性にhttps://ipinfo.io?callback=callback
を指定します。
このscript
タグを、head
タグの末尾に追加すると、API から JSONP 形式のデータがcallback
関数を通して取得できます。
1<script>2var script = document.createElement('script');3script.src='https://ipinfo.io?callback=callback'4document.head.appendChild(script);56function callback(data) {7console.log(data.ip);8};9// またはアロー関数を使って10// callback = data => console.log(data.ip);11</script>
これでコンソールに IP アドレスが表示されるようになります。
アロー関数について
コールバック関数外部から参照する
data.ip
という値はcallback
関数の外部から参照できないので、次のように書くことはできません。
1<script>2var script = document.createElement('script');3script.src='https://ipinfo.io?callback=callback'4document.head.appendChild(script);56function callback(data) {7const ip_adress = data.ip;8};910console.log(ip_adress);11</script>
-> ip_adress is not defined
これを解消するために、WeakMap
を使用します。
これを使えば、関数の外部からも関数内の値を参照できるようになります。
1<script>2var wm = new WeakMap;3var obj = {};4callback = data => wm.set(obj, data.ip);56var script = document.createElement('script');7script.src='https://ipinfo.io?callback=callback'8document.head.appendChild(script);910console.log(wm.get(obj));11</script>
ところが、これだけではまだコンソールに表示されません。
これは、行動フローとしてこのscript
タグの処理(console.log(wm.get(obj));
まで)がすべて終わった後に、
新たに生成されたscript
タグが IP アドレスを取得しているからです。
つまり、
- IP アドレスを取得するための
script
タグを生成 console.log()
- 新たに生成された
script
タグが IP アドレスを取得
という流れになってしまっています。
window.onload
を使って、HTML の読み込みが完了してからconsole.log()
を実行させます。
1<script>2var wm = new WeakMap;3var obj = {};4callback = data => wm.set(obj, data.ip);56var script = document.createElement('script');7script.src='https://ipinfo.io?callback=callback'8document.head.appendChild(script);910window.onload = () => console.log(wm.get(obj));11</script>
Google Analytics と連携させる
Google Analyticsの画面から、
管理 > カスタム定義 > カスタムディメンションを選択します。
「新しいカスタムディメンション」をクリックし、内容を入力します。
「名前」は任意で、「範囲」を「ヒット」、「アクティブ」はチェックをします。
保存を押したあと、サンプルコードが出てきて、'dimension1'
などと書かれた部分があるのですが、
その数字は後ほど使います。
さて、コードを編集します。
Google Analytics のトラッキングコードに gtag.js を使っているなら、
次のようなコードがhead
タグの間に挿入されていると思います。
1<!-- Global site tag (gtag.js) - Google Analytics -->2<script async src="https://www.googletagmanager.com/gtag/js?id=UA-000000000-0"></script>3<script>4window.dataLayer = window.dataLayer || [];5function gtag(){dataLayer.push(arguments);}6gtag('js', new Date());78gtag('config', 'UA-000000000-0');9</script>
カスタムディメンションを使用するために、次のように編集します。
1<!-- Global site tag (gtag.js) - Google Analytics -->2<script async src="https://www.googletagmanager.com/gtag/js?id=UA-000000000-0"></script>3<script>4window.dataLayer = window.dataLayer || [];5function gtag(){dataLayer.push(arguments);}6gtag('js', new Date());78gtag('config', 'UA-000000000-0', {9'custom_map': {10'dimension1': 'ip'11},12'ip': wm.get(obj)13});14</script>
これをさきほどのコードとあわせます。
1<!-- Global site tag (gtag.js) - Google Analytics -->2<script async src="https://www.googletagmanager.com/gtag/js?id=UA-000000000-0"></script>3<script>4var wm = new WeakMap;5var obj = {};6callback = data => wm.set(obj, data.ip);78var script = document.createElement('script');9script.src='https://ipinfo.io?callback=callback'10document.head.appendChild(script);1112window.onload = () => {13window.dataLayer = window.dataLayer || [];14function gtag(){dataLayer.push(arguments);}15gtag('js', new Date());1617gtag('config', 'UA-000000000-0', {18'custom_map': {19'dimension1': 'ip'20},21'ip': wm.get(obj)22});23};24</script>
これで取得した IP アドレスが Google Analytics に認識されるようになります。
Google Analytics から確認できるようにする
Google Analytics の画面から、
カスタム > カスタムレポート > 新しいカスタムレポート を選択します。
ディメンションの詳細 > ディメンションの追加 から、さきほど設定したカスタムディメンションを選択します。
例えば、IP という名前にしていれば、IP と検索すれば出てきます。
他の項目を設定して保存すれば、カスタムレポートから IP アドレスを確認することができるようになります。
お役に立てれば幸いです。
では