网上有很多提供IP查询的站点,访问网站时会返回公网IP,这种功能的网站如何实现?
比如:
https://ifconfig.me/ip
http://icanhazip.com
http://xabc.io/p
http://whatismyip.akamai.com
访问这类站点时,会返回访问者的IP

我之前基于socket自己写了一个,但稳定性不足,经常崩溃。一个人用时还好,当并发量起来之后就会出错。
#!python3import sysimport socketHOST, PORT = '', int(sys.argv[1])listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)listen_socket.bind((HOST, PORT))listen_socket.listen(20)while True:try:client_connection, client_address = listen_socket.accept()request = client_connection.recv(2048)http_response = """HTTP/1.1 200 OKConnection: keep-aliveContent-Type: text/html<html lang="en"><head><title>ip address response</title><style>div{ font-size:12px}#big{ font-size:120px}</style></head><body><div id="big">"""http_end = '''</div></body></html>'''http_response = http_response + client_address[0]http_response = http_response + http_endtry:client_connection.sendall(http_response.encode())except:passclient_connection.close()except:pass
执行时将端口号传给程序
python3 ./getIP.py 80
虽然程序也能工作,但无法保证不出错。后来尝试使用 Flask 模块搭建查IP的服务,测试之后发现还是第三方模块提供的web服务稳定,不仅反应快速,并且不管怎么刷,页面都不会崩。代码如下:
#! python3from flask import Flaskfrom flask import requestimport sysapp = Flask(__name__)@app.route('/')def ip():headers = request.headersip = request.remote_addrwrap = '''<html lang="en"><head><title>ip address response</title><style>div{ font-size:12px}#big{ font-size:120px}</style></head><body><div id="big">'''wrap_end = '''</div></body></html>'''ip = wrap + ipip = ip + wrap_endreturn ipif __name__ == "__main__":app.run(host="0.0.0.0", port=sys.argv[1])
如果不需要样式表,只想提供简单的IP信息,可以把 wrap 去掉,直接返回 ip 即可。因为调用了第三方模块,使用前需要先安装Flask模块。程序调用与上一版相同,端口通过参数传进去。
python3 -m pip install Flaskpython3 ./newGetIP.py 80
文章转载自生有可恋,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




