Help us understand the problem. What is going on with this article?

グローバルIP取得ツールを作ってみた

More than 3 years have passed since last update.

はじめに

コマンドラインからグローバルIPを取得したい場合、curl ifconfig.meとかcurl ip-net.infoあたりがよく紹介されています。ただ、これらのサイトは(特にifconfig.meは)しばしば繋がりにくい状態で、cronでの自動実行などを考えるとエラー処理含めいろいろ面倒です。
そこで複数のサイトを順次試行するツールを作ってみました。仮にいくつかのサイトか落ちていても、どこか1つでも繋がれば結果は表示されるようになっています。
念のためですが、あまり高頻度で使用しないようご注意ください。例えばmyexternalip.comの場合、30回/分でアクセス制限されるようです。多くても1回/時間程度が良いかと思います。

リンク

Download
Source

使い方

ダウンロードしたファイルをPATHの通った場所に展開してください。
使い方は以下のような感じです。

gip                    //プレーンテキスト出力
gip -s                 //プレーンテキスト出力(改行なし)
gip -j                 //JSON出力
gip -j --json-key addr //JSON出力(キー指定)

デフォルトで以下のサイトを使っています。
負荷分散のため試行順序はランダムです。また、ifconfig.meは特に繋がりにくいので外しました。

また、接続先をカスタマイズしたい場合、$HOME/.gip.tomlで上書き可能です。
$HOME/.gip.tomlがなかった場合のデフォルト値は以下のような感じなので、ここから追加・削除するのが楽です。

gip.toml
[[providers]]
    name    = "inet-ip.info"
    ptype   = "Plane"
    timeout = 1000
    url     = "http://inet-ip.info/ip"
[[providers]]
    name    = "myexternalip.com"
    ptype   = "Plane"
    timeout = 1000
    url     = "http://myexternalip.com/raw"
[[providers]]
    name    = "globalip.me"
    ptype   = "Plane"
    timeout = 1000
    url     = "http://globalip.me?ip"
[[providers]]
    name    = "ipify.org"
    ptype   = "Plane"
    timeout = 1000
    url     = "https://api.ipify.org"
[[providers]]
    name    = "httpbin.org"
    ptype   = "Json"
    timeout = 1000
    url     = "http://httpbin.org/ip"
    key     = ["origin"]

nameは適当な名前を、urlにGETするURLを入れてください。プレーンテキストで返ってくる場合はptypePlaneに、JSONで返ってくる場合はptypeJsonにした上で、keyにJSONオブジェクトのパスをTOMLの配列で設定できます。timeoutは各試行のタイムアウトをms単位で指定します。

dalance
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away