114

マシンの現在の外部 IP を取得するためのより良い方法を探しています #... 以下は機能しますが、情報を収集するために外部サイトに依存したくありません ... Mac OS にバンドルされている標準の Python 2.5.1 ライブラリの使用に制限されていますX 10.5.x

import os
import urllib2

def check_in():

    fqn = os.uname()[1]
    ext_ip = urllib2.urlopen('http://whatismyip.org').read()
    print ("Asset: %s " % fqn, "Checking in from IP#: %s " % ext_ip)
4

29 に答える 29

135

http://ipify.orgが気に入りました。API を使用するための Python コードも提供しています。

# This example requires the requests library be installed.  You can learn more
# about the Requests library here: http://docs.python-requests.org/en/latest/
from requests import get

ip = get('https://api.ipify.org').content.decode('utf8')
print('My public IP address is: {}'.format(ip))
于 2016-03-24T16:44:21.530 に答える
44

外部 IP を取得するルーターの背後にいる場合は、残念ながら外部サービスを使用する以外に選択肢はありません。ルーター自体に何らかのクエリ インターフェイスがある場合は、それを使用できますが、ソリューションは非常に環境に固有であり、信頼性が低くなります。

于 2010-02-22T14:41:19.480 に答える
35

UPnP プロトコルを使用して、ルーターにこの情報を問い合わせる必要があります。最も重要なことは、これが外部サービスに依存していないことです。これは、この質問に対する他のすべての回答が示唆しているようです。

これを行うことができる miniupnp と呼ばれる Python ライブラリがあります。たとえば、miniupnpc/testupnpigd.pyを参照してください。

pip install miniupnpc

彼らの例に基づいて、次のようなことができるはずです:

import miniupnpc

u = miniupnpc.UPnP()
u.discoverdelay = 200
u.discover()
u.selectigd()
print('external ip address: {}'.format(u.externalipaddress()))
于 2016-12-29T18:08:29.690 に答える
8

試す:

import requests 
ip = requests.get('http://ipinfo.io/json').json()['ip']

これが役立つことを願っています

于 2020-08-07T18:15:34.887 に答える
7

これを Python3 で実行するのと同じくらい簡単です。

import os

externalIP  = os.popen('curl -s ifconfig.me').readline()
print(externalIP)
于 2019-03-02T11:21:45.287 に答える
6

外部ソースの信頼性が低すぎると思われる場合は、いくつかの異なるサービスをプールできます。ほとんどの IP ルックアップ ページでは、html をスクレイピングする必要がありますが、サイトのヒット数を減らすために、あなたのようなスクリプト用の無駄のないページを作成しているページもいくつかあります。

于 2010-02-22T14:52:17.627 に答える
4

覚えやすいので、IPGrab を使用します。

# This example requires the requests library be installed.  You can learn more
# about the Requests library here: http://docs.python-requests.org/en/latest/
from requests import get

ip = get('http://ipgrab.io').text
print('My public IP address is: {}'.format(ip))
于 2021-01-04T15:00:22.830 に答える
2

ここでこの質問に関する他のほとんどの回答を試してみたところ、使用されているサービスのほとんどが1つを除いて機能していないことがわかりました.

このトリックを実行して、最小限の情報のみをダウンロードするスクリプトを次に示します。

#!/usr/bin/env python

import urllib
import re

def get_external_ip():
    site = urllib.urlopen("http://checkip.dyndns.org/").read()
    grab = re.findall('([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)', site)
    address = grab[0]
    return address

if __name__ == '__main__':
  print( get_external_ip() )
于 2013-06-05T23:18:58.930 に答える
2

Linux のみのソリューション。

Linux システムでは、Python を使用してシェルでコマンドを実行できます。私はそれが誰かを助けるかもしれないと思う.

このようなもの (「dig/drill」が OS で動作していると仮定)

import os 
command = "dig TXT +short o-o.myaddr.l.google.com @ns1.google.com | awk -F\'\"\' '{print $2}' " 
ip = os.system(command)

Arch ユーザーの場合は、「dig」を「drill」に置き換えてください。

于 2019-08-05T14:51:39.003 に答える
1

マシンがファイアウォールである場合、ソリューションは非常に賢明なものです。代替手段は、ファイアウォールのタイプに大きく依存するファイアウォールにクエリを実行できることです (可能な場合)。

于 2010-02-22T14:39:45.223 に答える
1

Python 2.7 .6 および 2.7.13 での 作業

import urllib2  
req = urllib2.Request('http://icanhazip.com', data=None)  
response = urllib2.urlopen(req, timeout=5)  
print(response.read())
于 2018-03-26T17:40:36.883 に答える
0

このスクリプトを使用します:

import urllib, json

data = json.loads(urllib.urlopen("http://ip.jsontest.com/").read())
print data["ip"]

json なし:

import urllib, re

data = re.search('"([0-9.]*)"', urllib.urlopen("http://ip.jsontest.com/").read()).group(1)
print data
于 2016-02-29T18:37:05.040 に答える
0
ipWebCode = urllib.request.urlopen("http://ip.nefsc.noaa.gov").read().decode("utf8")
ipWebCode=ipWebCode.split("color=red> ")
ipWebCode = ipWebCode[1]
ipWebCode = ipWebCode.split("</font>")
externalIp = ipWebCode[0]

これは私が別のプログラムのために書いた短いスニペットです。その秘訣は、HTML を分析するのが苦痛にならないように、十分に単純な Web サイトを見つけることでした。

于 2013-02-05T03:23:00.540 に答える
0

一般化されたアプリケーションではなく、自分自身のために書いているだけの場合は、ルーターのセットアップ ページでアドレスを見つけて、そのページの html からスクレイピングできる場合があります。これは、SMCルーターでうまく機能しました。1回の読み取りと1回の単純なRE検索で、見つけました。

これを行う上で特に関心があったのは、家を離れているときに自宅の IP アドレスを知らせて、VNC 経由で家に戻れるようにすることでした。さらに数行の Python で、外部からアクセスできるようにアドレスを Dropbox に保存し、変更があった場合はメールで通知します。起動時とその後1時間に1回発生するようにスケジュールしました。

于 2014-05-04T21:39:18.440 に答える
0

別の代替スクリプトを次に示します。

def track_ip():
   """
   Returns Dict with the following keys:
   - ip
   - latlong
   - country
   - city
   - user-agent
   """

   conn = httplib.HTTPConnection("www.trackip.net")
   conn.request("GET", "/ip?json")
   resp = conn.getresponse()
   print resp.status, resp.reason

   if resp.status == 200:
       ip = json.loads(resp.read())
   else:
       print 'Connection Error: %s' % resp.reason

   conn.close()
   return ip

編集: httplib と json をインポートすることを忘れないでください

于 2014-01-19T12:59:44.740 に答える