2020年7月4日土曜日

Excel関数を利用してグローバルIPの国コードを追加する

みんな大好きMicrosoft Excelですが、実はWEBサイトから情報を持ってくることができる、WEBSERVICE関数というのがあるんです。Excel 2013以降であれば利用できるので、最近のサポートされているExcelであれば問題なく利用できると思います。

この関数を利用すれば、例えば「接続元グローバルIPアドレスを返すAPI(グローバルIP単体)」と組み合わせると、自分のグローバルIPをExcelを利用して確認することができます。

=WEBSERVICE("https://api.suama.onl/v1/ip")

なお、インターネットに接続できない環境だったり、WEBプロキシ環境の場合はExcelがインターネット接続できないため、エラーになってしまいます。

さて、この関数を利用し、グローバルIPの一覧に国コードを追加するシートを作成してみましょう。

まず、A列にグローバルIPが入力されているシートを用意します。

次に、「グローバルIPアドレスの国を確認して返すAPI」を利用してA列に入力されているグローバルIPの国情報を確認する関数をB列に入力します。
このAPIではhttps://api.suama.onl/v1/ip-country?ipaddr=1.1.1.1というように確認したいグローバルIPを引数にしますので、この引数部分にA列を指定し、引数以外の部分と結合させます。それをWEBSERVICE関数に入れ込むわけです。
というわけで、B1に入力する関数は以下のようになります。

=WEBSERVICE(CONCATENATE("https://api.suama.onl/v1/ip-country?ipaddr=",A1))

実際にやってみると、こんな感じです。

これだと、情報は取れているのですが、よく分からないですよね?これは結果がJSON形式で返ってきているため、そのままだと読みにくいからです。

これがXML形式であれば、FILTERXML関数というXML形式のデータから必要な項目を抽出するための関数があるのですが、残念ながらJSON形式にはそういったものが用意されていないようです。最近はXML形式よりもJSON形式の方が流行っているので、マイクロソフトさんにはぜひJSON形式用の関数をご用意頂きたいところです。(何でもかんでも関数でやるな、ということかもしれませんが)

仕方がないので、検索やら文字抽出やらの古き良きExcel関数テクニックを駆使し、今回は国コードを抽出します。詳細は省きますが、B1に入力する関数は以下のようになります。

=MID(WEBSERVICE(CONCATENATE("https://api.suama.onl/v1/ip-country?ipaddr=",A1)),FIND("countrycode",WEBSERVICE(CONCATENATE("https://api.suama.onl/v1/ip-country?ipaddr=",A1)))+14,2)

うまく動作すると、国コードが表示されます。
※グローバルIPが大量にある場合、WebAPIの問合せに時間がかかる場合があります。

ファイアウォールのログなどでどこの国からアタックされているのかを確認したいとき、サクッとプログラムを組んでできれば良いのですが、誰でもできるわけではないかと思います。この方法であれば、Excel関数を多少知っている方であれば利用できますので、ハードルが低くなってなかなか良いかな、と思います。

興味の湧いた方は、ぜひお試しください。