【问题标题】:How can I get the public IP using python2.7?如何使用 python2.7 获取公共 IP?
【发布时间】:2012-03-17 21:27:25
【问题描述】:

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

【问题讨论】:

标签: python ip


【解决方案1】:

目前有几种选择:

  • 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('http://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 添加到可用选项列表中。

编辑:添加ipify.org 感谢kert's note

【讨论】:

  • 我喜欢 icanhazip.com,它是一个只有你原始 IP 的完整网站;无需添加数组、格式等
  • 只是为 ipify.org 添加:使用 url https://api.ipify.org/?format=raw 您将获得明文 IP,没有 JSON 废话。
  • api.ident.me 也可以,如果你想写一个完整的代码示例,请回退到tnedi.me ;)
【解决方案2】:

我喜欢带有http://ip.42.pl/raw 的请求包

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

【讨论】:

    【解决方案3】:

    带有请求模块

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

    【讨论】:

    • 不错! :) 我喜欢 ping 一些随机站点。我想说它更脆弱,但我想它比其他一些网站更大。只要他们不改变他们的标题的运作方式......
    【解决方案4】:

    试试这个:

    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'])
    

    【讨论】:

    • 导入ipgetter; IP = ipgetter.myip() 就足够了。
    • ipgetter (还)不支持 IPv6,尽管 IPv6 已经迎来了它的二十岁生日。 :(
    • 于 2022-01-24 死亡,试试这个:freegeoip.net/json/1.1.1.1,它会重定向到 freegeoip.net/shutdown
    【解决方案5】:

    你可以这样做:

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

    生产:

    XX.XX.XXX.XXX
    

    【讨论】:

      【解决方案6】:

      在 python 2.7 中它只是 2 行代码。

      >>> import requests
      >>print requests.get("http://ipconfig.in/ip").text
      

      【讨论】:

      • 请不要回复重复的问题。将它们标记为重复。它使 SO 更有条理。
      • 如果包含pip install requests实际上是三行
      【解决方案7】:

      这是一种不必拨打互联网电话的方法:

      如果这不起作用,请告诉我,然后我可以更新答案(它适用于我的大约 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"]
      

      【讨论】:

        猜你喜欢
        • 2017-06-14
        • 1970-01-01
        • 2011-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-21
        • 2016-12-15
        相关资源
        最近更新 更多