设为首页 收藏本站
查看: 827|回复: 0

[经验分享] 给Asus WL500G Deluxe无线路由器日志文件添加IP地址地理位置信息的Python小程序

[复制链接]

尚未签到

发表于 2015-4-26 06:13:59 | 显示全部楼层 |阅读模式
Python在不温不火的发展了10年后,突然火起来了,原因是蟒父Guido van Rossum加入了google,而google又迫切希望拥有一门可以和Sun、IBM的Java,MS的C#比肩的下一代语言,看起来python很有潜力成为这样一门语言。于是,作为独立IT爱好者,同时,也是一个非常想去google拿高工资的我,在“智廉”网上看到google招人要求后,决定好好学学python。

我学习过Perl,同Perl的格言There's More Than One Way to Do It不同,Python的格言是There should be one-- and preferably only one --obvious way to do it. 很难说哪种哲学正确,但Python的易读易用性比Perl的确好一些。

华硕的WL500GD无线路由器可以外接一个移动硬盘兼做FTP服务器,我去年10月入手一台后,在WL500GD上7x24小时一直运行FTP服务,FTP和其他服务一起,通过http://192.168.1.1/的浏览器界面可以设置管理路由器。当然也包括检查FTP的访问情况,如下图所示:
DSC0000.gif
无疑这样通过浏览器访问需要多次点击,较麻烦,而且光看IP很难估计出访客来自哪里,通常还要通过http://www.ip138.com/可以查询IP地址来自哪里,剪贴复制的操作也不可少,趁着学习Python,我决定写一个漂亮点的程序,一次解决这些问题。

仔细分析一下,这个小小的Python程序还真运用了不少技术,通过urllib2模块提交IP数据并抓取结果页面,抓取需要HTTP基本验证才能访问的页面(访问路由器日志),通过sgmllib模块来分析抓取下来的html页面,取得需要的信息,通过anydbm模块缓存IP地址地理位置信息,通过正则表达式和string的一些访问处理文本……

好了,如果你恰巧也有一部华硕的WL500G的话,不妨试试这个程序,其他无线路由的原理相同,但需要略为修改:


DSC0001.gif DSC0002.gif Check_WL500GD_FTP_Log.py
DSC0003.gif import urllib, urllib2, sgmllib, anydbm, re

class LogsParser(sgmllib.SGMLParser):
    def __init__(self):
        sgmllib.SGMLParser.__init__(self)
        self.in_textarea = False
        self.log = ""
    def start_textarea(self, attributes):
        for name, value in attributes:
            if name == 'class' and value == 'content_log_td' :
                self.in_textarea = True               
                return
    def end_textarea(self) :
        self.in_textarea = False
        return
    def handle_data(self, data) :
        if self.in_textarea == True :
            self.log += data
        return

class LocationParser(sgmllib.SGMLParser):
    def __init__(self):
        sgmllib.SGMLParser.__init__(self)
        self.in_location = False
        self.location_info = ""
    def start_ul(self, attributes) :
        for name, value in attributes:
            if name == 'class' and value == 'ul1' :
                self.in_location = True
    def end_ul(self) :
        self.in_location = False
        return
    def handle_data(self, data) :
        if self.in_location == True :
            self.location_info += data
        return
   
def Get_Logs() :
    # create a password manager
    password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
    # Add the username and password.
    # If we knew the realm, we could use it instead of ``None``.
    top_level_url = "http://192.168.1.1/"
    password_mgr.add_password(None, top_level_url, "admin", "password") # Change password to fit your router
    handler = urllib2.HTTPBasicAuthHandler(password_mgr)
    # create "opener" (OpenerDirector instance)
    opener = urllib2.build_opener(handler)
    # use the opener to fetch a URL
    opener.open(top_level_url)
    # Install the opener.
    # Now all calls to urllib2.urlopen use our opener.
    urllib2.install_opener(opener)

    p = LogsParser( )
    f = urllib2.urlopen("http://192.168.1.1/Main_LogStatus_Content.asp")
    data = f.read()
    if not data:
        return
    p.feed(data)
    p.close()
    f.close()
    return p.log.split('\n')

def Get_Location_from_IP138(ip) :
    l = LocationParser()
    submit_data = {'ip' : '127.0.0.1', 'action' : '2' }
    submit_data['ip']=ip
    f=urllib2.urlopen("http://www.ip138.com/ips8.asp", urllib.urlencode(submit_data))
    data = f.read()
    if not data:
        return
    l.feed(data)
    l.close()
    f.close()
    ipinfo = l.location_info
    return ipinfo[ipinfo.rindex("查询结果3:")+11:]

class Location() :
    def __init__(self) :
        self.ip_db = anydbm.open('ip_location_cache.dbm', 'c')
        self.ip_match = re.compile(r'\d+\.\d+\.\d+\.\d+')
    def __del__(self) :
        self.ip_db.close()
    def info(self, ip) :
        if self.ip_match.match(ip,1) != None :
            if self.ip_db.has_key(ip) == 0 :  # no IP info in cache
                self.ip_db[ip] = Get_Location_from_IP138(ip)
            return self.ip_db[ip]
        return ""

logs = Get_Logs()
loc = Location()
for line in logs :
    if line.strip() != "" :
        print line, loc.info(line[line.rindex(' ')+1:])
raw_input()

这个程序在CPython下运行通过,对于Web浏览器界面的运行结果如下:
Jun 25 02:43:53  FTP server: user anonymous logged in from 219.129.83.12 广东省韶关市 电信ADSL
Jun 25 02:43:53  FTP server: user anonymous logged in from 219.129.83.12 广东省韶关市 电信ADSL
Jun 25 03:08:58  ntp client: time is synchronized to time.nist.gov  
Jun 25 05:09:04  ntp client: time is synchronized to time.nist.gov  
Jun 25 07:09:09  ntp client: time is synchronized to time.nist.gov  
Jun 25 08:48:11  FTP server: user anonymous logged in from 219.146.252.21 山东省青岛市 广电网
Jun 25 08:48:44  FTP server: user anonymous logged in from 219.146.252.21 山东省青岛市 广电网
Jun 25 08:58:28  FTP server: user anonymous quit by session timeout
Jun 25 09:09:09  ntp client: time is synchronized to time.nist.gov  
Jun 25 09:41:20  FTP server: user anonymous logged in from 222.244.8.189 湖南省长沙市 (宁乡县)电信
Jun 25 09:41:22  FTP server: user anonymous logged in from 222.244.8.189 湖南省长沙市 (宁乡县)电信Python有趣么?嗯,Cool DSC0004.gif

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-60630-1-1.html 上篇帖子: 转载 python每次读入文件一行的问题(血的教训啊) 下篇帖子: Thread pool in python
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表