如何使用python2.7获取公共IP?

48

如何使用Python2.7获取公共IP?不是私有IP。


我同意这篇帖子是重复的 - 答案都一样。 - Alvin
7个回答

109

目前有几个选项:

  • ip.42.pl
  • jsonip.com
  • httpbin.org
  • ipify.org

以下是您可以利用上述每个选项的确切方式。

ip.42.pl

from urllib2 import urlopen
my_ip = urlopen('http://ip.42.pl/raw').read()

这是我找到的第一个选项。对于脚本来说非常方便,这里不需要进行JSON解析。

jsonip.com

from json import load
from urllib2 import urlopen

my_ip = load(urlopen('https://ipv4.jsonip.com'))['ip']

这个域名似乎唯一的目的就是返回一个JSON格式的IP地址。

httpbin.org

from json import load
from urllib2 import urlopen

my_ip = load(urlopen('http://httpbin.org/ip'))['origin']

httpbin.org是我经常向初级开发人员推荐的服务,用于测试他们的脚本/应用程序。

ipify.org

from json import load
from urllib2 import urlopen

my_ip = load(urlopen('https://api.ipify.org/?format=json'))['ip']

这项服务的优势在于没有限制(没有速率限制),基础设施也很强大(使用放置在 Heroku 上,考虑了高可用性),同时还支持 IPv4 和 IPv6。

编辑: 增加了 httpbin.org 作为可选项之一。

编辑: 感谢 kert 的提醒,我们增加了 ipify.org


3
我喜欢icanhazip.com这个网站,它直接显示你的原始IP地址,无需添加数组、格式等其他内容。 - anonymous
只是针对ipify.org补充说明:使用网址 https://api.ipify.org/?format=raw,您将获得明文IP,没有JSON无意义的内容。 - pepoluan
https://api.ident.me也可以使用,如果您想编写完整的代码示例,请回退到https://tnedi.me。 - Pierre Carrier

15

我喜欢使用requests库和http://ip.42.pl/raw

import requests
requests.get('http://ip.42.pl/raw').text

4
使用 requests 模块。
import requests

public_IP = requests.get("https://www.wikipedia.org").headers["X-Client-IP"]
print public_IP

1
不错!:) 我喜欢这个比随机ping某个网站更好。我想说它可能更脆弱,但我猜它比其他一些网站更有名气。只要他们不改变他们的头部操作方式... - digitalfoo

2

试试这个:

import ipgetter
import requests

IP = ipgetter.myip()
url = 'http://freegeoip.net/json/'+IP
r = requests.get(url)
js = r.json()
print 'IP Adress: '         +   js['ip']
print 'Country Code: '      +   js['country_code']
print 'Country Name: '      +   js['country_name']
print 'Region Code: '       +   js['region_code']
print 'Region Name: '       +   js['region_name']
print 'City Name: '         +   js['city']
print 'Zip code: '          +   js['zip_code']
print 'Time Zone: '         +   js['time_zone']
print 'Latitude: '          +   str(js['latitude'])
print 'Longitude: '         +   str(js['longitude'])

1
导入ipgetter; IP = ipgetter.myip()就足够了。 - Niko Pasanen
ipgetter目前还不支持IPv6,尽管IPv6已经庆祝了它的二十岁生日。 :( - qräbnö
截至2022年1月24日已经停止服务,请尝试使用以下链接:http://freegeoip.net/json/1.1.1.1,它将重定向到http://freegeoip.net/shutdown。 - Contango

1
在Python 2.7中,这只是两行代码。
>>> import requests
>>print requests.get("http://ipconfig.in/ip").text

1
请不要回复重复的问题。将它们标记为重复。这会使 SO 更有组织性。 - toliveira
如果包括 pip install requests,实际上只需要三行代码。 - OneCricketeer

1
你可以这样做:

import requests
print requests.get("http://ipecho.net/plain?").text

产生:
XX.XX.XXX.XXX

0

这是一种不必要通过互联网进行调用的方法:

如果这个方法不起作用,请告诉我,我可以更新答案(这个方法对我的约10个服务器有效)

from subprocess import check_output
out = check_output("/sbin/ifconfig | awk '/inet / { print $2 }' | sed 's/addr://'", shell=True)
[x for x in out.decode().split() if not x == "127.0.0.1" and 
                                    not (x.startswith("172") and x.endswith("0.1"))]
["x.x.x.x.x"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接