【发布时间】:2012-03-17 21:27:25
【问题描述】:
如何使用python2.7获取公网IP?不是私有 IP。
【问题讨论】:
-
我同意这篇文章是重复的——反正答案都是一样的
如何使用python2.7获取公网IP?不是私有 IP。
【问题讨论】:
目前有几种选择:
以下是您可以利用上述各项的具体方法。
from urllib2 import urlopen
my_ip = urlopen('http://ip.42.pl/raw').read()
这是我找到的第一个选项。脚本很方便,这里不需要JSON解析。
from json import load
from urllib2 import urlopen
my_ip = load(urlopen('http://jsonip.com'))['ip']
看起来这个域的唯一目的是以 JSON 格式返回 IP 地址。
from json import load
from urllib2 import urlopen
my_ip = load(urlopen('http://httpbin.org/ip'))['origin']
httpbin.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 添加到可用选项列表中。
编辑:添加ipify.org 感谢kert's note。
【讨论】:
https://api.ipify.org/?format=raw 您将获得明文 IP,没有 JSON 废话。
我喜欢带有http://ip.42.pl/raw 的请求包
import requests
requests.get('http://ip.42.pl/raw').text
【讨论】:
带有请求模块
import requests
public_IP = requests.get("https://www.wikipedia.org").headers["X-Client-IP"]
print public_IP
【讨论】:
试试这个:
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'])
【讨论】:
你可以这样做:
import requests
print requests.get("http://ipecho.net/plain?").text
生产:
XX.XX.XXX.XXX
【讨论】:
在 python 2.7 中它只是 2 行代码。
>>> import requests
>>print requests.get("http://ipconfig.in/ip").text
【讨论】:
pip install requests实际上是三行
这是一种不必拨打互联网电话的方法:
如果这不起作用,请告诉我,然后我可以更新答案(它适用于我的大约 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"]
【讨论】: