app.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import ipdb, ipaddress, requests, json
  2. from flask import Flask, request, render_template, jsonify
  3. from socket import gethostbyname
  4. db = ipdb.BaseStation("qqwry.ipdb")
  5. app = Flask(__name__)
  6. def iplocated(ip):
  7. city = db.find(ip, "CN")
  8. return ip + " @" + city[0] + city[1] + city[2] + city[3] + "\n"
  9. def getcity(ip):
  10. city = db.find(ip, "CN")
  11. return city[2] + '市'
  12. def getip():
  13. ip = request.remote_addr
  14. try:
  15. _ip = request.headers["X-Real-IP"]
  16. if _ip is not None:
  17. ip = _ip
  18. except Exception as e:
  19. print(e)
  20. return ip
  21. def is_Mozilla():
  22. # Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36
  23. ua = request.headers["User-Agent"]
  24. if (ua.find("Mozilla") != -1):
  25. return True
  26. else:
  27. return False
  28. ## 百度免费的 IP 普通定位 API 接口
  29. def ip2bdgps(ip):
  30. url = 'https://api.map.baidu.com/location/ip?ak=>>>百度AK码<<<&coor=bd09ll&ip=' + ip
  31. try:
  32. r = requests.get(url)
  33. data = r.json()
  34. except :
  35. return
  36. if data['status'] != 0 :
  37. return (116.39564504, 39.92998578 , data['status']) # 查不到返回 北京 x,y
  38. else:
  39. x = data['content']['point']['x']
  40. y = data['content']['point']['y']
  41. return (x, y, data['status'], data)
  42. ## 免费的高德 IP定位 API 接口
  43. def ip2gdgps(ip):
  44. url = 'http://iploc.market.alicloudapi.com/v3/ip?ip=' + ip
  45. headers = {"Authorization":"APPCODE <<<IP定位APPCODE>>>" ,"Content-Type":"application/json; charset=utf-8" }
  46. try:
  47. r = requests.get(url=url , headers=headers)
  48. data = r.json()
  49. except :
  50. return
  51. # print(data)
  52. if data['status'] != '1':
  53. return (116.39564504, 39.92998578 , data['status']) # 查不到返回 北京 x,y
  54. elif data['rectangle']:
  55. rectangle = data['rectangle'] # '119.5281601,28.9855063;119.7682178,29.16913797'
  56. arry = rectangle.replace(';', ',').split(',')
  57. x = (float(arry[0]) + float(arry[2])) / 2.0
  58. y = (float(arry[1]) + float(arry[3])) / 2.0
  59. return (x, y, data['status'], data)
  60. return (116.39564504, 39.92998578 , data['status']) # 查不到返回 北京 x,y
  61. @app.route("/")
  62. def hello():
  63. ip = getip()
  64. if is_Mozilla():
  65. return ip + render_template('hello.html', ip=ip) + "\n\n" + request.headers["User-Agent"]
  66. else:
  67. return ip
  68. @app.route("/ip/maps/")
  69. def maps():
  70. ip = getip()
  71. # bdgps = ip2bdgps(ip) # 百度地图 IP 定位 API 比较慢 ,换用 免费 高德定位
  72. bdgps = ip2gdgps(ip)
  73. return render_template('maps.html', bdgps=bdgps)
  74. @app.route("/ip/bdmaps/")
  75. def bdmaps():
  76. ip = getip()
  77. bdgps = ip2bdgps(ip) # 百度地图 IP 定位 API 比较慢
  78. return render_template('maps.html', bdgps=bdgps)
  79. @app.route("/ip/")
  80. @app.route("/ip/<ipaddr>")
  81. def show_ip(ipaddr=None):
  82. # ip 地址为空获得浏览器客户端IP
  83. if ipaddr is None:
  84. ip = getip()
  85. ipaddr = iplocated(ip)
  86. if is_Mozilla():
  87. return render_template('hello.html', ip=ip, ipaddr=ipaddr, city=getcity(ip))
  88. else:
  89. return ip
  90. else:
  91. ip = ipaddr
  92. # ip地址 从纯真IP数据库 搜索城市定位
  93. try:
  94. ipaddress.ip_address(ip).is_global
  95. ipaddr = iplocated(ip)
  96. except:
  97. try:
  98. ip = gethostbyname(ip) # 域名反解析得到的IP
  99. ipaddr = iplocated(ip)
  100. except Exception as e:
  101. print(e)
  102. return ipaddr
  103. if __name__ == '__main__':
  104. app.run(host='0.0.0.0', debug=True)
  105. # export FLASK_ENV=development # 调试模式: 修改代码不用重启服务
  106. # flask run --host=0.0.0.0 # 监听所有公开的 IP