如何在Python中获取套接字的外部IP?

时间:2008-09-12 04:21:51

标签: python sockets

当我在套接字对象上调用socket.getsockname()时,它会返回机器内部IP和端口的元组。但是,我想检索我的外部IP。这样做最便宜,最有效的方式是什么?

9 个答案:

答案 0 :(得分:8)

如果没有外部服务器的合作,这是不可能的,因为您和另一台计算机之间可能存在任意数量的NAT。如果它是自定义协议,您可以要求其他系统报告它所连接的地址。

答案 1 :(得分:5)

我能想到的唯一可以保证给你的方法就是点击http://whatismyip.com/这样的服务来获得它。

答案 2 :(得分:3)

https://github.com/bobeirasa/mini-scripts/blob/master/externalip.py

'''
Finds your external IP address
'''

import urllib
import re

def get_ip():
    group = re.compile(u'(?P<ip>\d+\.\d+\.\d+\.\d+)').search(urllib.URLopener().open('http://jsonip.com/').read()).groupdict()
    return group['ip']

if __name__ == '__main__':
    print get_ip()

答案 3 :(得分:1)

导入套接字

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.connect(( “msn.com”,80))

s.getsockname()

答案 4 :(得分:1)

print (urllib.urlopen('http://automation.whatismyip.com/n09230945.asp').read())

答案 5 :(得分:1)

您需要使用外部系统来执行此操作。

DuckDuckGo的IP答案将为您提供您想要的内容以及JSON!

import requests

def detect_public_ip():
    try:
        # Use a get request for api.duckduckgo.com
        raw = requests.get('https://api.duckduckgo.com/?q=ip&format=json')
        # load the request as json, look for Answer.
        # split on spaces, find the 5th index ( as it starts at 0 ), which is the IP address
        answer = raw.json()["Answer"].split()[4]
    # if there are any connection issues, error out
    except Exception as e:
        return 'Error: {0}'.format(e)
    # otherwise, return answer
    else:
        return answer

public_ip = detect_public_ip()
print(public_ip)

答案 6 :(得分:0)

使用http://whatismyip.com

来源中建议的地址
import urllib
def get_my_ip_address():
    whatismyip = 'http://www.whatismyip.com/automation/n09230945.asp'
    return urllib.urlopen(whatismyip).readlines()[0]

答案 7 :(得分:0)


您需要连接到外部服务器并从响应中获取公用IP


喜欢

   import requests

   myPublic_IP = requests.get("http://wtfismyip.com/text").text.strip()

   print("\n[+] My Public IP: "+ myPublic_IP+"\n")

答案 8 :(得分:0)

获取公网IP最简单的方法就是使用这个

import requests

IP = requests.get('https://api.ipify.org/').text
print(f'Your IP is: {IP}')