#urllib:HTTP API请求
##re:IP格式验证、返回结果提取
tkinter:界面布局、样式
## IP定位,根据盛大IP查询API所编写
## anthor:YanZhenwei(yanzhenwei1101@qq.com)
## Create version: V1.0Beta01 2012-03-02
## Last Update:2012-03-03
from tkinter import *
import re
import urllib
import urllib.request
class MWindow(Frame):
def __init__(self):
Frame.__init__(self)
self.master.title('IPSearch')
self.master.geometry('650x400')
self.pack(side = TOP,expand = YES,fill = BOTH)
ipVar = StringVar()
res = {}
res['result'] = StringVar()
res['country'] = StringVar()
res['city'] = StringVar()
res['sp'] = StringVar()
# top Frame
topF = self.createFrame(self,TOP)
inL = self.createLabel(topF,TOP,'请输入IP地址:')
ipE = self.createEntry(topF,TOP,ipVar)
resL = self.createLabel(topF,TOP,'查询结果:')
resE = self.createEntry(topF,TOP,res['result'])
#mid Frame
midF = self.createFrame(self,TOP)
conL = self.createLabel(midF,LEFT,'省')
conE = self.createEntry(midF,LEFT,res['country'])
citL = self.createLabel(midF,LEFT,'市')
citE = self.createEntry(midF,LEFT,res['city'])
conL = self.createLabel(midF,LEFT,'运营商')
spE = self.createEntry(midF,LEFT,res['sp'])
#bottom Frame
botF = self.createFrame(self,TOP)
searchB = Button(botF,text = 'search',
command = lambda ipVar = ipVar,res = res:self.IpSearch(ipVar,res))
searchB.pack(side = TOP,expand = YES,fill = BOTH)
def createFrame(self,parent,side):
f = Frame(parent)
f.pack(side = side,expand = YES,fill = BOTH)
return f
def createLabel(self,parent,side,text):
l = Label(parent,text = text)
l.pack(side = side,expand = YES)
return l
def createEntry(self,parent,side,textvariable):
e = Entry(parent,relief = SUNKEN,textvariable = textvariable,width = 20)
e.pack(side = side,expand = NO)
return e
def IpSearch(self,ipVar,res):
ipRex = '((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))'
ip = ipVar.get()
tmp = re.findall(re.compile(ipRex),ip)
if not tmp:
res['result'].set('ip格式错误,请重新输入')
return
data = IpS().search(ip)
if data['result'] == '1':
data['result'] = '该IP所在位置如下'
else:
data['result'] = '找不到相关信息'
res['result'].set(data['result'])
res['country'].set(data['country'])
res['city'].set(data['city'])
res['sp'].set(data['sp'])
class IpS():
def __init__(self):
self.apiurl = 'http://ipquery.sdo.com/getipinfo.php?ip='
def search(self,ip):
headers = ('User-Agent','Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1')
opener = urllib.request.build_opener()
opener.addheaders = [headers]
data = opener.open(self.apiurl+ip).read()
data = data.decode('UTF-8')
dataList = {}
patterns = '<result>([0-9])</result>'
dataList['result'] = re.findall(re.compile(patterns),data)[0]
patterns = '<country>([^x00-xff]+)</country>'
dataList['country'] = re.findall(re.compile(patterns),data)[0]
patterns = '<city>([^x00-xff]+)</city>'
dataList['city'] = re.findall(re.compile(patterns),data)[0]
patterns = '<sp>([^x00-xff]+)</sp>'
dataList['sp'] = re.findall(re.compile(patterns),data)[0]
return dataList
if __name__ == '__main__':
MWindow().mainloop()