天天看點

Python讀取純真IP資料庫

一、擷取最新版IP位址資料庫qqwry.dat

    在windows機器上下載下傳解壓,點選setup.exe安裝,在安裝目錄下的qqwry.dat即是最新版ip資料庫。

二、IPLocator.py

    建立IPLocator.py檔案(見本文附件),内容如下:

<code>#! /usr/bin/env python</code>

<code># -*- coding: utf-8 -*-</code>

<code>""" IPLocator: locate IP in the QQWry.dat.</code>

<code>    </code><code>Usage:</code>

<code>        </code><code>python IPLocator.py &lt;ip&gt;</code>

<code>"""</code>

<code>import</code> <code>socket,string,struct,sys</code>

<code>class</code> <code>IPLocator :</code>

<code>    </code><code>def</code> <code>__init__( </code><code>self</code><code>, ipdbFile ):</code>

<code>        </code><code>self</code><code>.ipdb </code><code>=</code> <code>open</code><code>( ipdbFile, </code><code>"rb"</code> <code>)</code>

<code>        </code><code>str</code> <code>=</code> <code>self</code><code>.ipdb.read( </code><code>8</code> <code>)</code>

<code>        </code><code>(</code><code>self</code><code>.firstIndex,</code><code>self</code><code>.lastIndex) </code><code>=</code> <code>struct.unpack(</code><code>'II'</code><code>,</code><code>str</code><code>)</code>

<code>        </code><code>self</code><code>.indexCount </code><code>=</code> <code>(</code><code>self</code><code>.lastIndex </code><code>-</code> <code>self</code><code>.firstIndex)</code><code>/</code><code>7</code><code>+</code><code>1</code>

<code>        </code><code>print</code> <code>self</code><code>.getVersion(),</code><code>" 紀錄總數: %d 條 "</code><code>%</code><code>(</code><code>self</code><code>.indexCount)</code>

<code>    </code><code>def</code> <code>getVersion(</code><code>self</code><code>):</code>

<code>        </code><code>s </code><code>=</code> <code>self</code><code>.getIpAddr(</code><code>0xffffff00L</code><code>)</code>

<code>        </code><code>return</code> <code>s</code>

<code>    </code><code>def</code> <code>getAreaAddr(</code><code>self</code><code>,offset</code><code>=</code><code>0</code><code>):</code>

<code>        </code><code>if</code> <code>offset :</code>

<code>            </code><code>self</code><code>.ipdb.seek( offset )</code>

<code>        </code><code>str</code> <code>=</code> <code>self</code><code>.ipdb.read( </code><code>1</code> <code>)</code>

<code>        </code><code>(byte,) </code><code>=</code> <code>struct.unpack(</code><code>'B'</code><code>,</code><code>str</code><code>)</code>

<code>        </code><code>if</code> <code>byte </code><code>=</code><code>=</code> <code>0x01</code> <code>or</code> <code>byte </code><code>=</code><code>=</code> <code>0x02</code><code>:</code>

<code>            </code><code>p </code><code>=</code> <code>self</code><code>.getLong3()</code>

<code>            </code><code>if</code> <code>p:</code>

<code>                </code><code>return</code> <code>self</code><code>.getString( p )</code>

<code>            </code><code>else</code><code>:</code>

<code>                </code><code>return</code> <code>""</code>

<code>        </code><code>else</code><code>:</code>

<code>            </code><code>self</code><code>.ipdb.seek(</code><code>-</code><code>1</code><code>,</code><code>1</code><code>)</code>

<code>            </code><code>return</code> <code>self</code><code>.getString( offset )</code>

<code>    </code><code>def</code> <code>getAddr(</code><code>self</code><code>,offset,ip</code><code>=</code><code>0</code><code>):</code>

<code>        </code><code>self</code><code>.ipdb.seek( offset </code><code>+</code> <code>4</code><code>)</code>

<code>        </code><code>countryAddr </code><code>=</code> <code>""</code>

<code>        </code><code>areaAddr </code><code>=</code> <code>""</code>

<code>        </code><code>if</code> <code>byte </code><code>=</code><code>=</code> <code>0x01</code><code>:</code>

<code>            </code><code>countryOffset </code><code>=</code> <code>self</code><code>.getLong3()</code>

<code>            </code><code>self</code><code>.ipdb.seek( countryOffset )</code>

<code>            </code><code>str</code> <code>=</code> <code>self</code><code>.ipdb.read( </code><code>1</code> <code>)</code>

<code>            </code><code>(b,) </code><code>=</code> <code>struct.unpack(</code><code>'B'</code><code>,</code><code>str</code><code>)</code>

<code>            </code><code>if</code> <code>b </code><code>=</code><code>=</code> <code>0x02</code><code>:</code>

<code>                </code><code>countryAddr </code><code>=</code> <code>self</code><code>.getString( </code><code>self</code><code>.getLong3() )</code>

<code>                </code><code>self</code><code>.ipdb.seek( countryOffset </code><code>+</code> <code>4</code> <code>)</code>

<code>                </code><code>countryAddr </code><code>=</code> <code>self</code><code>.getString( countryOffset )</code>

<code>            </code><code>areaAddr </code><code>=</code> <code>self</code><code>.getAreaAddr()</code>

<code>        </code><code>elif</code> <code>byte </code><code>=</code><code>=</code> <code>0x02</code><code>:</code>

<code>            </code><code>countryAddr </code><code>=</code> <code>self</code><code>.getString( </code><code>self</code><code>.getLong3() )</code>

<code>            </code><code>areaAddr </code><code>=</code> <code>self</code><code>.getAreaAddr( offset </code><code>+</code> <code>8</code> <code>)</code>

<code>            </code><code>countryAddr </code><code>=</code> <code>self</code><code>.getString( offset </code><code>+</code> <code>4</code> <code>)</code>

<code>        </code><code>return</code> <code>countryAddr </code><code>+</code> <code>" "</code> <code>+</code> <code>areaAddr</code>

<code>    </code><code>def</code> <code>dump(</code><code>self</code><code>, first ,last ):</code>

<code>        </code><code>if</code> <code>last &gt; </code><code>self</code><code>.indexCount :</code>

<code>            </code><code>last </code><code>=</code> <code>self</code><code>.indexCount</code>

<code>        </code><code>for</code> <code>index </code><code>in</code> <code>range</code><code>(first,last):</code>

<code>            </code><code>offset </code><code>=</code> <code>self</code><code>.firstIndex </code><code>+</code> <code>index </code><code>*</code> <code>7</code>

<code>            </code><code>buf </code><code>=</code> <code>self</code><code>.ipdb.read( </code><code>7</code> <code>)</code>

<code>            </code><code>(ip,of1,of2) </code><code>=</code> <code>struct.unpack(</code><code>"IHB"</code><code>,buf)</code>

<code>            </code><code>address </code><code>=</code> <code>self</code><code>.getAddr( of1 </code><code>+</code> <code>(of2 &lt;&lt; </code><code>16</code><code>) )</code>

<code>            </code><code>#把GBK轉為utf-8</code>

<code>            </code><code>address </code><code>=</code> <code>unicode</code><code>(address,</code><code>'gbk'</code><code>).encode(</code><code>"utf-8"</code><code>)</code>

<code>            </code><code>print</code> <code>"%d\t%s\t%s"</code> <code>%</code><code>(index, </code><code>self</code><code>.ip2str(ip), \</code>

<code>                </code><code>address )</code>

<code>    </code><code>def</code> <code>setIpRange(</code><code>self</code><code>,index):</code>

<code>        </code><code>offset </code><code>=</code> <code>self</code><code>.firstIndex </code><code>+</code> <code>index </code><code>*</code> <code>7</code>

<code>        </code><code>self</code><code>.ipdb.seek( offset )</code>

<code>        </code><code>buf </code><code>=</code> <code>self</code><code>.ipdb.read( </code><code>7</code> <code>)</code>

<code>        </code><code>(</code><code>self</code><code>.curStartIp,of1,of2) </code><code>=</code> <code>struct.unpack(</code><code>"IHB"</code><code>,buf)</code>

<code>        </code><code>self</code><code>.curEndIpOffset </code><code>=</code> <code>of1 </code><code>+</code> <code>(of2 &lt;&lt; </code><code>16</code><code>)</code>

<code>        </code><code>self</code><code>.ipdb.seek( </code><code>self</code><code>.curEndIpOffset )</code>

<code>        </code><code>buf </code><code>=</code> <code>self</code><code>.ipdb.read( </code><code>4</code> <code>)</code>

<code>        </code><code>(</code><code>self</code><code>.curEndIp,) </code><code>=</code> <code>struct.unpack(</code><code>"I"</code><code>,buf)</code>

<code>    </code><code>def</code> <code>getIpAddr(</code><code>self</code><code>,ip):</code>

<code>        </code><code>L </code><code>=</code> <code>0</code>

<code>        </code><code>R </code><code>=</code> <code>self</code><code>.indexCount </code><code>-</code> <code>1</code>

<code>        </code><code>while</code> <code>L &lt; R</code><code>-</code><code>1</code><code>:</code>

<code>            </code><code>M </code><code>=</code> <code>(L </code><code>+</code> <code>R) </code><code>/</code> <code>2</code>

<code>            </code><code>self</code><code>.setIpRange(M)</code>

<code>            </code><code>if</code> <code>ip </code><code>=</code><code>=</code> <code>self</code><code>.curStartIp:</code>

<code>                </code><code>L </code><code>=</code> <code>M</code>

<code>                </code><code>break</code>

<code>            </code><code>if</code> <code>ip &gt; </code><code>self</code><code>.curStartIp:</code>

<code>                </code><code>R </code><code>=</code> <code>M</code>

<code>        </code><code>self</code><code>.setIpRange( L )</code>

<code>        </code><code>#version information,255.255.255.X,urgy but useful</code>

<code>        </code><code>if</code> <code>ip&amp;</code><code>0xffffff00L</code> <code>=</code><code>=</code> <code>0xffffff00L</code><code>:</code>

<code>            </code><code>self</code><code>.setIpRange( R )</code>

<code>        </code><code>if</code> <code>self</code><code>.curStartIp &lt;</code><code>=</code> <code>ip &lt;</code><code>=</code> <code>self</code><code>.curEndIp:</code>

<code>            </code><code>address </code><code>=</code> <code>self</code><code>.getAddr( </code><code>self</code><code>.curEndIpOffset )</code>

<code>            </code><code>address </code><code>=</code> <code>"未找到該IP的位址"</code>

<code>        </code><code>return</code> <code>address</code>

<code>    </code><code>def</code> <code>getIpRange(</code><code>self</code><code>,ip):</code>

<code>        </code><code>self</code><code>.getIpAddr(ip)</code>

<code>        </code><code>range</code> <code>=</code> <code>self</code><code>.ip2str(</code><code>self</code><code>.curStartIp) </code><code>+</code> <code>' - '</code> <code>\</code>

<code>            </code><code>+</code> <code>self</code><code>.ip2str(</code><code>self</code><code>.curEndIp)</code>

<code>        </code><code>return</code> <code>range</code>

<code>    </code><code>def</code> <code>getString(</code><code>self</code><code>,offset </code><code>=</code> <code>0</code><code>):</code>

<code>        </code><code>str</code> <code>=</code> <code>""</code>

<code>        </code><code>ch </code><code>=</code> <code>self</code><code>.ipdb.read( </code><code>1</code> <code>)</code>

<code>        </code><code>(byte,) </code><code>=</code> <code>struct.unpack(</code><code>'B'</code><code>,ch)</code>

<code>        </code><code>while</code> <code>byte !</code><code>=</code> <code>0</code><code>:</code>

<code>            </code><code>str</code> <code>=</code> <code>str</code> <code>+</code> <code>ch</code>

<code>            </code><code>ch </code><code>=</code> <code>self</code><code>.ipdb.read( </code><code>1</code> <code>)</code>

<code>            </code><code>(byte,) </code><code>=</code> <code>struct.unpack(</code><code>'B'</code><code>,ch)</code>

<code>        </code><code>return</code> <code>str</code>

<code>    </code><code>def</code> <code>ip2str(</code><code>self</code><code>,ip):</code>

<code>        </code><code>return</code> <code>str</code><code>(ip&gt;&gt;</code><code>24</code><code>)</code><code>+</code><code>'.'</code><code>+</code><code>str</code><code>((ip&gt;&gt;</code><code>16</code><code>)&amp;</code><code>0xffL</code><code>)</code><code>+</code><code>'.'</code> <code>\</code>

<code>            </code><code>+</code><code>str</code><code>((ip&gt;&gt;</code><code>8</code><code>)&amp;</code><code>0xffL</code><code>)</code><code>+</code><code>'.'</code><code>+</code><code>str</code><code>(ip&amp;</code><code>0xffL</code><code>)</code>

<code>    </code><code>def</code> <code>str2ip(</code><code>self</code><code>,s):</code>

<code>        </code><code>(ip,) </code><code>=</code> <code>struct.unpack(</code><code>'I'</code><code>,socket.inet_aton(s))</code>

<code>        </code><code>return</code> <code>((ip&gt;&gt;</code><code>24</code><code>)&amp;</code><code>0xffL</code><code>)|((ip&amp;</code><code>0xffL</code><code>)&lt;&lt;</code><code>24</code><code>) \</code>

<code>            </code><code>|((ip&gt;&gt;</code><code>8</code><code>)&amp;</code><code>0xff00L</code><code>)|((ip&amp;</code><code>0xff00L</code><code>)&lt;&lt;</code><code>8</code><code>)</code>

<code>    </code><code>def</code> <code>getLong3(</code><code>self</code><code>,offset </code><code>=</code> <code>0</code><code>):</code>

<code>        </code><code>str</code> <code>=</code> <code>self</code><code>.ipdb.read(</code><code>3</code><code>)</code>

<code>        </code><code>(a,b) </code><code>=</code> <code>struct.unpack(</code><code>'HB'</code><code>,</code><code>str</code><code>)</code>

<code>        </code><code>return</code> <code>(b &lt;&lt; </code><code>16</code><code>) </code><code>+</code> <code>a</code>

<code>#Demo</code>

<code>def</code> <code>main():</code>

<code>    </code><code>IPL </code><code>=</code> <code>IPLocator( </code><code>"qqwry.dat"</code> <code>)</code>

<code>    </code><code>ip </code><code>=</code> <code>""</code>

<code>    </code><code>if</code> <code>len</code><code>(sys.argv) !</code><code>=</code> <code>2</code><code>:</code>

<code>        </code><code>print</code> <code>'Usage: python IPLocator.py &lt;IP&gt;'</code>

<code>        </code><code>return</code>

<code>    </code><code>else</code><code>:</code>

<code>        </code><code>ip </code><code>=</code> <code>sys.argv[</code><code>1</code><code>]</code>

<code>    </code><code>address </code><code>=</code> <code>IPL.getIpAddr( IPL.str2ip(ip) )</code>

<code>    </code><code>range</code> <code>=</code> <code>IPL.getIpRange( IPL.str2ip(ip) )</code>

<code>    </code><code>print</code> <code>"此IP %s 屬于 %s\n所在網段: %s"</code> <code>%</code> <code>(ip,address, </code><code>range</code><code>)</code>

<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>"__main__"</code> <code>:</code>

<code>    </code><code>main()</code>

    把qqwry.dat放到和IPLocator.py同一目錄,使用方法如下(請參考IPLocator.py中的Demo):

<a href="http://s3.51cto.com/wyfs02/M02/56/B6/wKiom1SKxheTBaiIAAOTHHV72tE754.jpg" target="_blank"></a>

<a href="http://down.51cto.com/data/2365189" target="_blank">附件:http://down.51cto.com/data/2365189</a>

本文轉自 張斌_青島 51CTO部落格,原文連結:http://blog.51cto.com/qicheng0211/1589442