python 实现全球IP归属地查询工具


Posted in Python onDecember 18, 2020
# 写在前面,这篇文章的原创作者是Charles我只是在他这个程序的基础上边进行加工,另外有一些自己的改造
# 并都附上了注释和我自己的理解,这也是我一个学习的过程。
# 附上大佬的GitHub地址:https://github.com/CharlesPikachu/Tools

'''
Function:
  根据IP地址查其对应的地理信息
Author:
  Charles
微信公众号:
  Charles的皮卡丘
'''
import IPy
import time
import random
import hashlib
import argparse
import requests


headers = {
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}



def getaliIP(ip):
  # 这里使用ali的IP地址查询功能。
  # https://market.aliyun.com/products/?keywords=ip%E5%BD%92%E5%B1%9E%E5%9C%B0
  # 需要自己去这个网址注册账号,然后进行调用。
  # 这里我们先进行定义url
  host = 'https://ips.market.alicloudapi.com'
  path = '/iplocaltion'
  method = "GET"
  appcode = '填写你自己的xxx'
  url = host + path + '?ip=' + ip
  # 定义头部。
  headers = {"Authorization": 'APPCODE ' + appcode}
  try:
   # 进行获取调用结果。
   rep = requests.get(url, headers=headers)
  except:
   return 'url参数错误'
  # 判断是否调用成功。如果调用成功就接着进行下边的动作。
  httpStatusCode = rep.status_code
  if httpStatusCode == 200:
   # 转换成json格式
   data = rep.json()
   # 然后获取其中的参数。
   ''''
   # 是以下边这种格式进行返回的。
   {
     "code": 100,
     "message": "success",
     "ip": "110.188.234.66",
     "result": {
          "en_short": "CN", // 英文简称
     "en_name": "China", // 归属国家英文名称
   "nation": "中国", // 归属国家
   "province": "四川省", // 归属省份
   "city": "绵阳市", // 归属城市
   "district": "涪城区", // 归属县区
   "adcode": 510703, // 归属地编码
   "lat": 31.45498, // 经度
   "lng": 104.75708 // 维度
   }
   }'''
   result1 = data.get('result')
   city = result1['city']
   province = result1['province']
   nation = result1['nation']
   district = result1['district']
   latitude = result1['lat']
   longitude = result1['lng']
   # 返回我们需要的结果。
   result = '-' * 50 + '\n' + \
       '''[ali.com查询结果-IP]: %s\n经纬度: (%s, %s)\n国家: %s\n地区: %s\n城市: %s\n''' % (
       ip, longitude, latitude, nation, province, city) \
       + '-' * 50
  else:
   httpReason = rep.headers['X-Ca-Error-Message']
   if (httpStatusCode == 400 and httpReason == 'Invalid Param Location'):
     return "参数错误"
   elif (httpStatusCode == 400 and httpReason == 'Invalid AppCode'):
     return "AppCode错误"
   elif (httpStatusCode == 400 and httpReason == 'Invalid Url'):
     return "请求的 Method、Path 或者环境错误"
   elif (httpStatusCode == 403 and httpReason == 'Unauthorized'):
     return "服务未被授权(或URL和Path不正确)"
   elif (httpStatusCode == 403 and httpReason == 'Quota Exhausted'):
     return "套餐包次数用完"
   elif (httpStatusCode == 500):
     return "API网关错误"
   else:
     return "参数名错误 或 其他错误" + httpStatusCode + httpReason

  return result

'''淘宝API'''
def getTaobaoIP(ip):
  # 请求淘宝获取IP位置的API接口,但是现在有些不是很好用了。查不出来了。
  # 看了看接口需要进行传入秘钥
  url = 'http(s)://ips.market.alicloudapi.com/iplocaltion'
  # 使用get方法进行请求。
  res = requests.get(url+ip, headers=headers)
  # 然后进行解析参数。
  data = res.json().get('data')
  print(res.json)
  if data is None:
   return '[淘宝API查询结果-IP]: %s\n无效IP' % ip
  result = '-'*50 + '\n' + \
  '''[淘宝API查询结果-IP]: %s\n国家: %s\n地区: %s\n城市: %s\n''' % (ip, data.get('country'), data.get('region'), data.get('city')) \
  + '-'*50
  return result


'''ip-api.com(很不准)'''
def getIpapiIP(ip):
  url = 'http://ip-api.com/json/'
  res = requests.get(url+ip, headers=headers)
  data = res.json()
  yd = youdao()
  city = yd.translate(data.get('city'))[0][0]['tgt']
  country = yd.translate(data.get('country'))[0][0]['tgt']
  region_name = yd.translate(data.get('regionName'))[0][0]['tgt']
  latitude = data.get('lat')
  longitude = data.get('lon')
  result = '-'*50 + '\n' + \
  '''[ip-api.com查询结果-IP]: %s\n经纬度: (%s, %s)\n国家: %s\n地区: %s\n城市: %s\n''' % (ip, longitude, latitude, country, region_name, city) \
  + '-'*50
  return result


'''ipstack.com'''
def getIpstackIP(ip):
  # 定义url
  url = 'http://api.ipstack.com/{}?access_key=1bdea4d0bf1c3bf35c4ba9456a357ce3'
  res = requests.get(url.format(ip), headers=headers)
  data = res.json()
  # 实例化一个有道翻译的类。
  yd = youdao()
  # 调用翻译函数。获取翻译的值。
  continent_name = yd.translate(data.get('continent_name'))[0][0]['tgt']
  country_name = yd.translate(data.get('country_name'))[0][0]['tgt']
  region_name = yd.translate(data.get('region_name'))[0][0]['tgt']
  city = yd.translate(data.get('city'))[0][0]['tgt']
  # 获取经纬度。
  latitude = data.get('latitude')
  longitude = data.get('longitude')
  result = '-'*50 + '\n' + \
  '''[ipstack.com查询结果-IP]: %s\n经纬度: (%s, %s)\n板块: %s\n国家: %s\n地区: %s\n城市: %s\n''' % (ip, longitude, latitude, continent_name, country_name, region_name, city) \
  + '-'*50
  return result


'''IP地址有效性验证'''
def isIP(ip):
  try:
   IPy.IP(ip)
   return True
  except:
   return False


'''
Function:
  有道翻译类,进行翻译上边我们查询结果的返回值。
'''
class youdao():
  def __init__(self):
   # 这里我们需要使用post方法进行调用接口。
   self.headers = {
     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
   }

   self.data = {
        'i': 'hello',
        'action': 'FY_BY_CLICKBUTTION',
        'bv': 'e2a78ed30c66e16a857c5b6486a1d326',
        'client': 'fanyideskweb',
        'doctype': 'json',
        'from': 'AUTO',
        'keyfrom': 'fanyi.web',
        'salt': '15532627491296',
        'sign': 'ee5b85b35c221d9be7437297600c66df',
        'smartresult': 'dict',
        'to': 'AUTO',
        'ts': '1553262749129',
        'typoResult': 'false',
        'version': '2.1'
        }
   # 有道翻译调用接口的url
   self.url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
   # http: // fanyi.youdao.com / translate?smartresult = dict & smartresult = rule & sessionFrom =
  # 进行翻译。
  def translate(self, word):
   # 先判断单词是否为空。
   if word is None:
     return [word]
   # 随机生成一个时间。
   t = str(time.time()*1000 + random.randint(1,10))
   t = str(time.time()*1000 + random.randint(1, 10))
   # 传入我们需要翻译的单词和其他参数。
   self.data['i'] = word
   self.data['salt'] = t
   sign = 'fanyideskweb' + word + t + '6x(ZHw]mwzX#u0V7@yfwK'
   # 这里需要哈希一下。
   self.data['sign'] = hashlib.md5(sign.encode('utf-8')).hexdigest()
   # 进行post方法调用接口,并获取我们需要的参数。
   res = requests.post(self.url, headers=self.headers, data=self.data)
   # 返回翻译的结果。
   return res.json()['translateResult']


'''主函数'''
def main(ip):
  separator = '*' * 30 + 'IPLocQuery' + '*' * 30
  # 首先判断IP地址是否合法。
  if isIP(ip):
   # 然后分别调用几个接口进行查询。
   print(separator)
   print(getaliIP(ip))
   print(getIpstackIP(ip))
   print(getIpapiIP(ip))
   print('*' * len(separator))
  else:
   print(separator + '\n[Error]: %s --> 无效IP地址...\n' % ip + '*' * len(separator))
  

if __name__ == '__main__':
  # 获取终端输入的入参。
  parser = argparse.ArgumentParser(description="Query geographic information based on IP address.")
  # 可选参数,代表着文件的名字,里边存放着IP之地。
  parser.add_argument('-f', dest='filename', help='File to be queried with one ip address per line')
  # 可选参数,代表着我们需要查询的IP地址。
  parser.add_argument('-ip', dest='ipaddress', help='Single ip address to be queried')
  args = parser.parse_args()
  # 获取终端输入的参数。
  ip = args.ipaddress
  filename = args.filename
  # 判断终端是否有进行输入参数。
  if ip:
   main(ip)
  if filename:
   with open(filename) as f:
     # 获取文件中的所有IP地址,存放成一个列表的形式。
     ips = [ip.strip('\n') for ip in f.readlines()]
   for ip in ips:
     main(ip)

以上就是python 实现全球IP归属地查询工具的详细内容,更多关于python ip归属地查询的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python获得linux下所有挂载点(mount points)的方法
Apr 29 Python
Python中map,reduce,filter和sorted函数的使用方法
Aug 17 Python
用Python编写简单的微博爬虫
Mar 04 Python
JSONLINT:python的json数据验证库实例解析
Nov 28 Python
python bmp转换为jpg 并删除原图的方法
Oct 25 Python
使用Python实现从各个子文件夹中复制指定文件的方法
Oct 25 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
Nov 25 Python
详解Python3 中的字符串格式化语法
Jan 15 Python
Python 读取xml数据,cv2裁剪图片实例
Mar 10 Python
Django 自定义权限管理系统详解(通过中间件认证)
Mar 11 Python
Python基于numpy模块实现回归预测
May 14 Python
Python使用jpype模块调用jar包过程解析
Jul 29 Python
MoviePy简介及Python视频剪辑自动化
Dec 18 #Python
Python非单向递归函数如何返回全部结果
Dec 18 #Python
python复合条件下的字典排序
Dec 18 #Python
python 监控服务器是否有人远程登录(详细思路+代码)
Dec 18 #Python
细说NumPy数组的四种乘法的使用
Dec 18 #Python
如何通过python检查文件是否被占用
Dec 18 #Python
python 实现端口扫描工具
Dec 18 #Python
You might like
浅析PHP原理之变量分离/引用(Variables Separation)
2013/08/09 PHP
PHP中常见的缓存技术实例分析
2015/09/23 PHP
PHP图像裁剪缩略裁切类源码及使用方法
2016/01/07 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
2012/12/27 Javascript
js文件Cookie存取值示例代码
2014/02/20 Javascript
JS交换变量的方法
2015/01/21 Javascript
JavaScript Length 属性的总结
2015/11/02 Javascript
JavaScript模块化开发之SeaJS
2015/12/13 Javascript
javascript函数命名的三种方式及区别介绍
2016/03/22 Javascript
JS触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器
2016/10/30 Javascript
JavaScript正则表达式exec/g实现多次循环用法示例
2017/01/17 Javascript
浅析bootstrap原理及优缺点
2017/03/19 Javascript
jquery 校验中国身份证号码实例详解
2017/04/11 jQuery
AngularJS 控制器 controller的详解
2017/10/17 Javascript
angularjs实现时间轴效果的示例代码
2017/11/29 Javascript
解决iView中时间控件选择的时间总是少一天的问题
2018/03/15 Javascript
详解Vue CLI3配置解析之css.extract
2018/09/14 Javascript
vue开发环境配置跨域的方法步骤
2019/01/16 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
2019/04/25 Javascript
JQuery animate动画应用示例
2019/05/14 jQuery
React精髓!一篇全概括小结(急速)
2019/05/23 Javascript
vue框架制作购物车小球动画效果实例代码
2019/09/26 Javascript
Vue CLI3移动端适配(px2rem或postcss-plugin-px2rem)
2020/04/27 Javascript
解决父组件将子组件作为弹窗调用只执行一次created的问题
2020/07/24 Javascript
[39:08]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第一场 12.12
2020/12/16 DOTA
tensorflow建立一个简单的神经网络的方法
2018/02/10 Python
python pandas读取csv后,获取列标签的方法
2018/11/12 Python
windows10下安装TensorFlow Object Detection API的步骤
2019/06/13 Python
简单了解python单例模式的几种写法
2019/07/01 Python
html5 canvas-2.用canvas制作一个猜字母的小游戏
2013/01/07 HTML / CSS
计算机专业自荐信
2013/10/14 职场文书
优秀员工事迹材料
2014/12/20 职场文书
会计做账心得体会
2016/01/22 职场文书
python面向对象版学生信息管理系统
2021/06/24 Python