暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用Flask实现简单的IP查询

生有可恋 2022-03-29
1167

网上有很多提供IP查询的站点,访问网站时会返回公网IP,这种功能的网站如何实现?

比如:

  • https://ifconfig.me/ip

  • http://icanhazip.com

  • http://xabc.io/p

  • http://whatismyip.akamai.com

访问这类站点时,会返回访问者的IP

我之前基于socket自己写了一个,但稳定性不足,经常崩溃。一个人用时还好,当并发量起来之后就会出错。

    #!python3

    import sys
    import socket

    HOST, 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 OK
    Connection: keep-alive
    Content-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_end
    try:
    client_connection.sendall(http_response.encode())
    except:
    pass
    client_connection.close()
    except:
    pass

    执行时将端口号传给程序

      python3 ./getIP.py  80

      虽然程序也能工作,但无法保证不出错。后来尝试使用 Flask 模块搭建查IP的服务,测试之后发现还是第三方模块提供的web服务稳定,不仅反应快速,并且不管怎么刷,页面都不会崩。代码如下:

        #! python3
        from flask import Flask
        from flask import request
        import sys

        app = Flask(__name__)

        @app.route('/')
        def ip():
        headers = request.headers
        ip = request.remote_addr
        wrap = '''
        <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 + ip
        ip = ip + wrap_end
        return ip


        if __name__ == "__main__":
        app.run(host="0.0.0.0", port=sys.argv[1])

        如果不需要样式表,只想提供简单的IP信息,可以把 wrap 去掉,直接返回 ip 即可。因为调用了第三方模块,使用前需要先安装Flask模块。程序调用与上一版相同,端口通过参数传进去。

          python3 -m pip install Flask
          python3 ./newGetIP.py  80

          文章转载自生有可恋,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论