プログラム

海外IPアドレスを手軽にチェックしてみる(2)

お使いのパソコンで試せます。

さっそくEXCELで試してみましょう

まず、VBA(Visual Basic for Applications)を使って、アクセス元のIPアドレスが海外かどうかをチェックすることは可能ですが、VBA単体でこの作業を行うには、以前もご説明させていただいたとおり、いくつかの外部サービスやデータが必要です。以下に、その方法について説明します。

海外IPアドレスをチェックするためには、通常、IP Geolocation APIのようなサービスを使用して、IPアドレスがどの国からのものであるかを確認する方法がよく使われます。VBAからもこうした外部APIを呼び出すことが可能です。

・IP Geolocation APIの選択

無料または有料のIP Geolocation APIを利用します。例えば、ipinfo.ioやipstack.com、MaxMindのようなサービスがあります。

・VBAでAPIにリクエストを送信

VBAのXMLHTTPオブジェクトを使って、IPアドレスをAPIに送信し、国情報を取得します。
いわゆるソケット通信です。これはVBAに限らずいろいろなプログラミング言語で出てきますので、覚えておきましょう。

それでは、VBAサンプルです。

以下は、IPアドレスの情報を取得して、その国が日本(jp)かどうかをチェックする例です。


Sub CheckIfForeignIP()
    Dim ipAddress As String
    Dim apiUrl As String
    Dim httpRequest As Object
    Dim jsonResponse As String
    Dim countryCode As String
    
    ' チェックしたいIPアドレス
    ipAddress = "8.8.8.8" ' GoogleのパブリックDNSの例
    
    ' APIのURL(ipinfoを使用した例)
    apiUrl = "https://ipinfo.io/" & ipAddress & "/json"
    
    ' XMLHTTPオブジェクトの作成
    Set httpRequest = CreateObject("MSXML2.XMLHTTP")
    
    ' APIリクエストの送信
    httpRequest.Open "GET", apiUrl, False
    httpRequest.Send
    
    ' レスポンスの取得
    jsonResponse = httpRequest.responseText
    
    ' レスポンスからcountryコードを抽出
    countryCode = GetCountryCodeFromJson(jsonResponse)
    
    ' チェック(日本国内かどうか)
    If countryCode <> "JP" Then
        MsgBox "海外からのアクセスです。"
    Else
        MsgBox "日本国内からのアクセスです。"
    End If
End Sub

' JSONレスポンスから国コードを抽出する関数
Function GetCountryCodeFromJson(json As String) As String
    Dim startPos As Long
    Dim endPos As Long
    Dim countryCode As String
    
    ' "country"フィールドを検索
    startPos = InStr(json, """country"": """)
    If startPos > 0 Then
        startPos = startPos + Len("""country"": """)
        endPos = InStr(startPos, json, """")
        If endPos > startPos Then
            countryCode = Mid(json, startPos, endPos - startPos)
            GetCountryCodeFromJson = countryCode
            Exit Function
        End If
    End If
    
    ' 見つからない場合は空の文字列を返す
    GetCountryCodeFromJson = ""
End Function

上記のプログラムの流れです。

(1)XMLHTTPオブジェクトを使用してAPIリクエストを送信
ipinfo.ioのAPIを使用して、指定したIPアドレスの情報を取得します。
apiUrlでリクエストのURLを作成し、httpRequest.Open "GET"でHTTP GETリクエストを送信します。

(2)レスポンスを解析
レスポンスはJSON形式で返ってくるため、簡単にInStrなどのVBA関数を使用して国コード("country")を抽出します。

(3)結果をチェック
取得した国コードがJPであるかどうかを確認し、日本以外なら「海外からのアクセスです」というメッセージを表示します。

上記は、外部サービスを利用するのでどうしても費用がかかります。
ただ、かなりのアクセスがない限り(APIの利用がない限り)そこまで高い費用ではないので、常に最新のIPアドレスでチェックできるというメリット、開発が比較的容易というメリットが大きく、おすすめです。

費用を抑えたIPアドレスのチェック方法

どうしても費用をかけたくない場合

IPアドレス範囲データベースを利用して、各国のIPアドレス範囲を取得し、それに基づいて判断することも可能です。

IPアドレス範囲データの取得

MaxMindのGeoLite2データベース(無料版)をダウンロードし、そのデータベースを参照してVBAでIPアドレスをチェックする方法です。
データはCSVやSQLの形式で提供されているため、それをExcelにインポートして利用することができます。

IPアドレスの判定

チェックしたいIPアドレスが、データベースの範囲に属しているかどうかをVBAで確認します。

こちらにつきましては、以前サンプルを使った説明をさせていただいたのでサンプルは割愛しますが、無料でできる反面、デメリットが大きいです。
例えば、IPアドレスは日々新規で国内プロバイダなどに割り当てが行われていますが、無料のデータベースは必ずしも最新ではありません。
現在Nuro光は多く利用されていますが、サービス開始時期は、Nuroで使われているIPアドレスが国内と判定できない事象が長期間ありました。
同様に、固定IPアドレスなどを利用されている場合は、正しく判定されない場合があります。

まとめ

WEBサイト製作に携わる場合、いかに容易にバグなく信頼性のあるプログラム開発ができるかという部分が大切になります。こだわれば何でもできる、が私の持論ですが、上記のようなIPアドレスのチェック1つにしてもそれを専門に行う会社が提供しているAPIを利用したほうが正確で、導入も容易、バグも少なく済むということは言うまでもありません。
といいましても、私の場合は基本自作がメインですが。その場合は、いかに信頼性がアップできるかに力点をおきましょう。

-プログラム
-