前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python批量化获取ip地址归属地

Python批量化获取ip地址归属地

作者头像
yulate
发布2023-05-02 11:22:02
1.3K0
发布2023-05-02 11:22:02
举报

前言

今天碰到个需求,拿nuclei扫出的洞需要判断一下是哪些国家的目标,这总不能手工一个个去看吧,好几千个目标一个个看那简直蠢到不行,既然这样就拿python写一个脚本来自动化判断咯。

实现

ip2region: https://github.com/lionsoul2014/ip2region

主要实现方法是通过开源的ip2region库,这个库可以准确的识别IP地址的归属地

代码中的from ip2Region import Ip2Region可能会爆红,忽略即可。

代码语言:javascript
复制
# -*- coding:utf-8 -*-
import re
import socket
import time
from urllib.parse import urlparse

import xlwt
from ip2Region import Ip2Region

def testSearch(ip_s):
    dbFile = "./ip2region.db"
    searcher = Ip2Region(dbFile)
    try:
        print("开始检测:", (ip_s))
        sTime = time.time() * 1000
        data = searcher.binarySearch(ip_s)
        # elif algorithm == "memory":
        #     data = searcher.memorySearch(line)
        # else:
        #     data = searcher.btreeSearch(line)
        eTime = time.time() * 1000
        ip_info = ("%s|%s|%s" % (ip_s, data["city_id"], data["region"].decode('utf-8')))
        print("检测完成:" + ip_info)
        return ip_info

    except Exception as e:
        print("[Error]: %s" % e)
    searcher.close()

def all_in():
    row_id = 1
    book = xlwt.Workbook()
    sheet = book.add_sheet('sheet')
    title = ['源ip', '国家', '省市', '运营商']
    print("正在提取ip")
    patternIp()
    print("正在提取域名")
    patterDomain()
    for col in range(len(title)):
        sheet.write(0, col, title[col])
    with open('ip.txt', 'r') as file:
        for line in file.readlines():
            ip = line.strip()
            try:
                data = testSearch(ip)
                ct = data.split('|')[2].strip()
                pv = data.split('|')[4].strip()
                city = data.split('|')[5].strip()
                yys = data.split('|')[6].strip()
                if ct == "0":
                    print("地址库中未找到对应的IP归属地,请更新地址库或者确定ip准确性!")
                    sheet.write(row_id, 0, ip)
                    sheet.write(row_id, 1, "/")
                    sheet.write(row_id, 2, "/")
                    sheet.write(row_id, 3, "/")
                    row_id += 1
                else:
                    if pv == "0":
                        print("省市查询为空!")
                        sheet.write(row_id, 0, ip)
                        sheet.write(row_id, 1, ct)
                        sheet.write(row_id, 2, "/")
                        sheet.write(row_id, 3, "/")
                        row_id += 1
                    else:
                        if city == "0":
                            sheet.write(row_id, 0, ip)
                            sheet.write(row_id, 1, ct)
                            sheet.write(row_id, 2, pv + "-" + "///")
                            sheet.write(row_id, 3, "/")
                            row_id += 1
                        else:
                            if yys == "0":
                                sheet.write(row_id, 0, ip)
                                sheet.write(row_id, 1, ct)
                                sheet.write(row_id, 2, pv + "-" + city)
                                sheet.write(row_id, 3, "/")
                                row_id += 1
                            else:
                                sheet.write(row_id, 0, ip)
                                sheet.write(row_id, 1, ct)
                                sheet.write(row_id, 2, pv + "-" + city)
                                sheet.write(row_id, 3, yys)
                                row_id += 1
            except Exception as e:
                print("[Error]: %s" % e)
                sheet.write(row_id, 0, ip)
                sheet.write(row_id, 1, "检测异常,请手动检测!")
                row_id += 1
    book.save('score.xls')

def patternIp():
    reg = r"\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
    with open('wso2-upload.txt', 'r') as f:
        ipList = re.findall(reg, f.read())

    with open('ip.txt', "w") as i:
        for ip in ipList:
            i.write(ip + "\n")

def domain2Ip(domain):
    global address
    try:
        time.sleep(0.1)
        address = socket.getaddrinfo(domain, 'http')
    except Exception as e:
        print(e)
    return address[0][4][0]

def patterDomain():
    reg = 'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+'
    with open('wso2-upload.txt', 'r') as f:
        urlList = re.findall(reg, f.read())

    with open("ip.txt", "w") as i:
        for u in urlList:
            i.write(domain2Ip(get_domain(u)) + "\n")

def get_domain(url):
    o = urlparse(url)
    domain = o.hostname
    return domain

if __name__ == "__main__":
    all_in()
    # patternIp()
    # print(domain2Ip("www.baidu.com"))
    # print(get_domain("https://www.baidu.com"))
    # patterDomain()

项目目录结构:

效果

浏览量: 265

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-5-07 1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 实现
  • 效果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档