我正在尝试设置一个显示访问者 IP 的页面。我尝试过的所有方法都显示与我的计算机的 IP 不同的 IP。我试过:
使用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/