Python认为我是不同的IP

标签 python ip

我正在尝试设置一个显示访问者 IP 的页面。我尝试过的所有方法都显示与我的计算机的 IP 不同的 IP。我试过:

  1. 向上查找http://www.whatismyip.com/automation/n09230945.asp

  2. 使用socket.getaddrinfo(socket.gethostname(), None)[0][4][0]

如何找到访问者的真实IP?

最佳答案

使用低级网络接口(interface),您实际上获得了运行 python 解释器的服务器的地址:

socket.gethostname():返回一个字符串,其中包含当前正在执行 Python 解释器的计算机的主机名。

使用低级网络接口(interface)获取客户端 IP

"socket.accept() 接受连接。套接字必须绑定(bind)到一个地址并监听连接。返回值是一对 (conn, 地址),其中 conn 是可用于发送的新套接字对象并在连接上接收数据,address是连接另一端socket绑定(bind)的地址。"

# Echo server program
import socket

HOST = ''                 # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: break
    conn.send(data)
conn.close()

More info on the low level network interface

从 HTTP header 获取客户端 IP(如果提供 html)

REMOTE_ADDR 是包含客户端 IP 地址的 header ,您应该首先检查它。

如果您的访问者通过代理,您还应该检查 HTTP_X_FORWARDED header 。请注意,HTTP_X_FORWARDED 是一个数组,可以包含多个逗号分隔值,具体取决于代理的数量。

另请注意,您可能已通过 NAT ( Network Address Translation )。如果您的 IP 是内部 IP(10.x.x.x 或 192.168.x.x 等),那么您肯定位于 NAT 路由器后面,只有您的外部 IP 会暴露给网站。

这是一个小的 C# 代码片段,显示了确定客户端 IP 的过程,逻辑很容易转换为 Python,并且服务器 header 是相同的:

string clientIp = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if( !string.IsNullOrEmpty(clientIp) ) {
    string[] forwardedIps = clientIp.Split( new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries );
    clientIp = forwardedIps[forwardedIps.Length - 1];
} else {
    clientIp = context.Request.ServerVariables["REMOTE_ADDR"];
}

关于Python认为我是不同的IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2630371/

相关文章:

ruby-on-rails - Heroku 地理定位 >> 始终返回 "Seattle, WA"

python - Mechanize 你不同的ip

python - 使用多索引的新列将 pandas 数据框按列表分解为多行

Python Pandas 条件更新

python - 缺少 1 个必需的位置参数 : 'msg'

python-如何爬过__VIEWSTATE

python - 为什么嵌套函数比非嵌套函数慢这么多?

php - 在自治系统编号 (ASN) 中获取 IP

c# - nslookup 和 GetHostEntry 有什么区别?

linux - 为 MPI 集群编辑/etc/hosts