#!/usr/bin/env /usr/bin/python
# coding: utf-8
 

# Blog: http://willson.sinaapp.com/2012/01/ip地址批量查询-python版.html
'''用Python脚本查询纯真IP库
 
QQWry.Dat的格式如下:
 
+----------+
|  文件头  |  (8字节)
+----------+
|  记录区  | (不定长)
+----------+
|  索引区  | (大小由文件头决定)
+----------+
 
文件头:4字节开始索引偏移值+4字节结尾索引偏移值
 
记录区: 每条IP记录格式 ==> IP地址[国家信息][地区信息]
 
   对于国家记录,可以有三种表示方式:
 
       字符串形式(IP记录第5字节不等于0x01和0x02的情况),
       重定向模式1(第5字节为0x01),则接下来3字节为国家信息存储地的偏移值
       重定向模式(第5字节为0x02),
 
   对于地区记录,可以有两种表示方式: 字符串形式和重定向
 
   最后一条规则:重定向模式1的国家记录后不能跟地区记录
 
索引区: 每条索引记录格式 ==> 4字节起始IP地址 + 3字节指向IP记录的偏移值
 
   索引区的IP和它指向的记录区一条记录中的IP构成一个IP范围。查询信息是这个
   范围内IP的信息
 
'''
 
import sys
import socket
from struct import pack, unpack
 
class IPInfo(object):
    '''QQWry.Dat数据库查询功能集合
    '''
    def __init__(self, dbname):
        ''' 初始化类,读取数据库内容为一个字符串,
        通过开始8字节确定数据库的索引信息'''
 
        self.dbname = dbname
        # f = file(dbname, 'r')
 
        # Demon注:在Windows下用'r'会有问题,会把\r\n转换成\n
        # 详见http://demon.tw/programming/python-open-mode.html
        # 还有Python文档中不提倡用file函数来打开文件,推荐用open
        f = open(dbname, 'rb')
 
        self.img = f.read()
        f.close()
 
        # QQWry.Dat文件的开始8字节是索引信息,前4字节是开始索引的偏移值,
        # 后4字节是结束索引的偏移值。
        # (self.firstIndex, self.lastIndex) = unpack('II', self.img[:8])
 
        # Demon注:unpack默认使用的endian是和机器有关的
        # Intel x86和AMD64(x86-64)是little-endian
        # Motorola 68000和PowerPC G5是big-endian
        # 而纯真数据库全部采用了little-endian字节序
        # 所以在某些big-endian的机器上原代码会出错
        (self.firstIndex, self.lastIndex) = unpack(' 
  


使用方法:


sh get_ip.sh  iplist.txt  会生成一个ipaddress.txt

保证本目录下有 QQWry.Dat ip纯真文件,可以上网下载一个最新的文件库。