IP归属地查询

来源:互联网 发布:单片机软件工程师要求 编辑:程序博客网 时间:2024/04/29 14:22

#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-03from tkinter import *import reimport urllibimport urllib.requestclass 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 dataListif __name__ == '__main__':    MWindow().mainloop()