27

私はルーターの背後にいます。パブリック IP を検出するための簡単なコマンドが必要です (私の IP をグーグル検索して結果をクリックするのではなく)

このための標準プロトコルはありますか? STUN について聞いたことがありますが、どのように使用すればよいかわかりません。

PS私はそれを行うための短いpythonスクリプトを書くことを計画しています

4

16 に答える 16

17

私はhttp://automation.whatismyip.com/n09230945.aspに接続するプログラムを作成しました。 これは、Dで記述されており、他の誰かにあなたのIPがおそらく最も信頼できる方法であると思われることを教えてもらいます。

/*
    Get my IP address
*/


import tango.net.http.HttpGet;
import tango.io.Stdout;

void main()
{
      try
      {
          auto page = new HttpGet ("http://automation.whatismyip.com/n09230945.asp");
          Stdout(cast(char[])page.read);
      }
      catch(Exception ex)
      {
          Stdout("An exception occurred");
      }
}

Pythonコードの編集は次のようになります。

from urllib import urlopen
print urlopen('http://automation.whatismyip.com/n09230945.asp').read()
于 2009-03-05T03:26:16.660 に答える
12

私はipify.orgが好きです:

  • 無料で使用できます(プログラムでも使用でき、大量のトラフィックでも許可されます)
  • 応答にはゴミのない IP アドレスのみが含まれます (解析の必要はありません)。
  • JSON で応答を要求することもできます
  • IPv4 と IPv6 の両方で動作します
  • クラウドでホストされています
  • それはオープンソースです
$ curl api.ipify.org
167.220.196.42

$ curl "api.ipify.org?format=json"
{"ip":"167.220.196.42"}
于 2016-02-10T14:00:15.983 に答える
11

www.whatsmyip.org をターゲットにするのは失礼です。彼らはページでそれをしないように嘆願します。

ターゲットと同じレベルの NAT にあるシステムのみが同じ IP を認識します。たとえば、アプリケーションが複数の NAT レイヤーの背後にある場合があります (これは、IP が過剰に存在する米国から離れるにつれて、より多く発生します)。

STUN は確かに最良の方法です。一般に、アプリケーションが要求できる場所で (STUN) サーバーを実行することを計画する必要があります。他の人のサーバーをハードコーディングしないでください。rfc5389 で説明されているように、いくつかの特定のメッセージを送信するようにコーディングする必要があります。

よく読んで、関連するリンクをお勧めします。 http://www.ietf.org/html.charters/behave-charter.html

IPv6 と Teredo を調べて、常に IPv6 にアクセスできるようにすることをお勧めします。(Microsoft Vista ではこれが非常に簡単になっていると聞いています)

于 2009-03-05T04:30:19.907 に答える
7

何人かの人々が述べたように、STUNは確かに適切な解決策です。

pynatPythonモジュールを使用したコード例を次に示します。

>>> import pynat
>>> pynat.get_ip_info()
('UDP Firewall', '192.0.2.2', 54320)
于 2009-03-09T21:54:33.890 に答える
7

これをやりたいときはいつでも、whatismyip.orgをスクレイピングします。サイトにアクセスすると、プレーン テキストのパブリック IP が表示されます。簡潔でシンプル。

スクリプトでそのサイトにアクセスし、IP を読み取るだけです。

投稿でこれをほのめかしていたかどうかはわかりませんが、自分のコンピューターからパブリック IP を取得することはできません。外部ソースから取得する必要があります。

2013 年編集: このサイトはテキストではなく画像を返すようになったため、この目的には役に立ちません。

于 2009-03-05T03:20:57.000 に答える
6

編集: curlmyip.com は利用できなくなりました。(maxywb に感謝)

元の投稿:

この投稿を書いている時点で、curlmyip.com は動作します。コマンドラインから:

curl curlmyip.com

これはサードパーティの Web サイトであり、数年後には利用可能になる場合と利用できない場合があります。しかし、当分の間、それは非常に単純で要点のように思えます。

于 2013-05-22T17:57:52.287 に答える
3

最も簡単な方法は、ネットワークの外部にあるサーバーに問い合わせることです。

覚えておくべきことの1つは、宛先が異なれば、住所も異なる可能性があるということです。ルータはマルチホームである可能性があります。そして実際、そこから問題が始まります。

于 2009-03-05T03:22:34.970 に答える
3

外部 IP を取得するには、特別なホスト名「myip.opendns.com」を使用して、opendns サーバーへの dns クエリを作成できます。

from subprocess import check_output

ip = check_output(["dig", "+short", "@resolver1.opendns.com",
                   "myip.opendns.com"]).decode().strip()

Windows では、 を試すことができますnslookup

Python stdlib には、カスタム DNS サーバーを指定できる dns モジュールはありません。DNS クエリを作成するために、 Twistedなどのサードパーティ ライブラリを使用できます。

from twisted.internet     import task # $ pip install twisted
from twisted.names.client import Resolver
from twisted.python.util  import println

def main(reactor):
    opendns_resolvers = [("208.67.222.222", 53), ("208.67.220.220", 53)]
    resolver = Resolver(servers=opendns_resolvers, reactor=reactor)
    # use magical hostname to get our public ip
    return resolver.getHostByName('myip.opendns.com').addCallback(println)
task.react(main)

dnspythonこれはlibraryを使用した場合と同じです:

import dns.resolver # $ pip install dnspython

resolver = dns.resolver.Resolver(configure=False)
resolver.nameservers = ["208.67.222.222", "208.67.220.220"]
print(resolver.query('myip.opendns.com')[0])

libraryasyncioを使用したバリアントは次のとおりです。aiodns

$ pipenv install aiodns
$ pipenv run python -m asyncio
...
>>> import asyncio
>>> import aiodns  # pip install aiodns
>>> resolver = aiodns.DNSResolver()
>>> resolver.nameservers = "208.67.222.222", "208.67.220.220"
>>> await resolver.query("myip.opendns.com", "A")
[<ares_query_a_result> host=192.0.2.2, ttl=0]

IPv6 アドレスを取得するには:

>>> resolver.nameservers = "2620:119:35::35", "2620:119:53::53"
>>> await resolver.query("myip.opendns.com", "AAAA")
于 2014-02-27T17:22:34.870 に答える
3

ネットワークのゲートウェイで UpNp サーバーが実行されている場合、ゲートウェイと通信して外部 IP アドレスを要求できます。

于 2009-03-05T03:52:25.833 に答える
0

Duck Duck Go は、 https ://duckduckgo.com/api の独自のページに従って、API への無料アクセスを提供します 。

IP アドレスが必要な場合にヒットする URL は次のとおりです: http://api.duckduckgo.com/?q=my+ip&format=json

これは JSON オブジェクトを返します。このAnswer属性には、IP アドレスを含む人間が判読できる文字列が含まれています。例:

{
    ...
    "Answer": "Your IP address is ww.xx.yyy.zzz in <a href=\"http://open.mapquest.com/?q=aaaaa(bbbbb)\">aaaaa(bbbbb)</a>"
    ...
}

split()[4]この文字列が変更されないことが安全な仮定であると思われる場合、または定期的に修正する必要がある場合は、を使用してその文字列から IP アドレスを抽出できます。

または、より将来性のある方法が必要な場合は、返されたすべてをループしてsplit()、IP アドレスである最初の項目を返すことができます。IP アドレスの検証については、こちらを参照してください: Python で IP アドレスを検証するには?

于 2015-11-16T20:10:49.977 に答える
-1

別の生意気な方法: ルーターにDynDNSの Web IP を更新するオプションがある場合、次のような方法で独自の IP を取得できます。

IP=`resolveip -s myalias.dyndns-home.com`
于 2011-03-04T21:13:42.287 に答える