Python 利用 IP 地理库生成随机天朝 IP

首先从 MaxMind 下载一份按照国家分类的 IP 数据库 (csv 格式)。

数据库截图

首先要做的是把里面所有的国内 IP 段提取出来;手动打开 LocationsBlocks-IPv4 文件看了下,得知在 Blocks-IPv4 文件内,第一列是 IP 段,第二列是地理 ID;而在 Locations 内,天朝的地理 ID 为 1814991

虽然说这些列的序号可能会根据以后更新而打乱,但是目前来看 MaxMind 不会经常调整这个列的序号。毕竟我们用的是个 Quick & Dirty 的解决方案,更新起来也是挺方便的。

提取出来后需要写出到一个可被随机访问的文件(数据库?)内。一个简单的格式就是将每个 IP 段打包为 5 个字节 (IP 占 4 个,掩码占 1 个),随机抽取的时候可以直接定位到需要的位置。最后在文件开始处标记共有多少项,连获取文件大小都可以省掉。

获取到我们自己的国内 IP 段大全后,就可以写一个通用的 IP 地址生成器了。

因为 IP 其实讲白了就是一个 4 字节的数字,而掩码则可以视为这个段的大小。为了简化计算,直接将 IP 地址作为一个整数来运算即可;段开始地址加上 rand(0, size - 1) 就得到一个 IP 了。

在实际实验中,偶尔有时候会发生生成的 IP 不能通过网易的检测的情况。因此,需要加入一个主动连接网易服务器进行检测的函数。在这里是利用的网页版 API;为了不增加复杂度,我选择事先在浏览器对提交数据进行加密,然后在 Python 内直接传输。若是生成的 IP 不行,那就再生成一个。

在测试的时候能发现,虽然 MaxMind 提供的地理数据库与网易检测用的地理数据库兼容不是特别的完美,几乎每 3 次有一次失败。当然因为是随机抽样检测,这个数据并不能代表整个数据库,但这个成功率也是足够用来作为我们自动更新构造 IP 的小程序了。

最后为了方便一次性生成可用的文件,给程序加上两个参数:其一为输入文件路径,将其的所有 <ip> 都替换为随机生成的一个国内 IP;其二为输出文件路径,将替换后的文件内容写入。


项目文件下载(包括 MaxMind 2017.04.04 版 csv 数据库):

v2:梦姬储存


v1,使用新版 Python 会提示解析出错,仅供存档用途。

Post your comments here