Python 实现断网自动重连

来所里一年了,终于有了一台电脑,是小乐师兄淘汰给我的,很开心,因为用它编程智商有加成。但是问题就来了,我平时人在怀柔啊,怎么才能用所里的电脑搞科研呢?远程自然是很简单的,但是所里每天晚上三天钟会可耻地断一次网,而且断网必须要登录才能重连,为了不麻烦师兄,同时也让我周末回来显得很忙的样子,我开始鼓捣Python自动联网。

扯远了...道理很简单,就是每隔一段时间ping一下百度,判断网络状态,没有联网的话,就模仿浏览器发一条Post给服务器。

先从最基本的功能说起: 发送Post给服务器。这里你需要知道你登录的时候到底发送了什么,大概看一下登录页面的代码:
 function do_login()
 { 	
 	var uname=document.form1.uname.value;
 	var pass=document.form1.pass.value;
 	if(uname=="")
 	{
 		alert("请填写用户名");
 		document.form1.uname.focus();
 		return;
 	}
 	
 	if(pass=="")
 	{
 		alert("请填写密码");
 		document.form1.pass.focus();
 		return;
 	}
 	//密码md5加密传送
 	var pass1=hex_md5(pass);
 	var pass2=pass1.substr(8,16);
 	
 	var drop=(document.form1.drop.checked==true)?1:0;
 	var data="username="+uname+"&password="+pass2+"&drop="+drop+"&type=1&n=100";

 	var con=postData("/cgi-bin/do_login", "post", data);
 	//alert(con); 
 	var p=/^[\d]+$/;
 	if(p.test(con))
 	{
 		document.form1.uid.value=con;
 		if(document.form1.save_me.checked) //写COOKIE
 		{
 			setCookie("srun_login",uname+"|"+pass);
 		}
 		else
 		{
 			delCookie("srun_login");
 		}
 		if(location.search != "")
 		{
 			window.open("login.html"+location.search+","+con+","+uname,"user_login","width=428,height=296"); 	
 		}
 		else
 		{
 			window.open("login.html?"+location.search+","+con+","+uname,"user_login","width=428,height=296");
 		}
 		setTimeout("jump_to(url)", 1000);	
 		return;
 	}	
 	switch(con)
 	{
 			
 	} 	
 }
可以发现,
var data="username="+uname+"&password="+pass2+"&drop="+drop+"&type=1&n=100";

这一句,就是Post的内容了,当然密码是MD5加密过后的,这个随便找找也没有问题的

接下来是 检测网络是否连接,我采用Ping百度的办法,毕竟这是百度最大的功能之一,网上参考一下别人的代码,自己写了一个:
def ping(user,password):
        fnull = open(os.devnull, 'w')
        return1 = subprocess.call('ping 61.135.169.125', shell = True, stdout = fnull, stderr = fnull)
        if return1:
                print_ts('Internet not connected!')
                print_ts('Connecting now...')
                postLogin('http://159.226.39.22/cgi-bin/do_login',user,password)
                ping(user,password)
        else:
                print_ts('Internet connected!')
        fnull.close()

最后是定时运行,需要用到Python的time模块
def print_ts(message):
        print "[%s] %s"%(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), message)
def run(interval,user,password):
        print_ts("-"*50)
        print_ts ('Copyright (c) Huntley')
        print_ts ('Email:zhangzihao@ict.ac.cn')
        print_ts ('')
        print_ts("Check the Internet every %s seconds."%interval)
        print_ts("-"*50)
        while True:
                try:
                        time_remaining = interval-time.time()%interval
                        time.sleep(time_remaining)
                        print_ts("Checking Internet connection...")
                        ping(user,password)
                        print_ts("Next check will start after %s seconds"%interval)
                except Exception, e:
                        print e


最后,附一下完整代码
#!/usr/bin/env python
#coding=utf8

import urllib
import urllib2
import hashlib
import subprocess
import os
import time

def getPass(password):
        pass1 = hashlib.md5()
        pass1.update(password)
        pass2 = pass1.hexdigest()
        return pass2[8:24]

def postLogin(url,user,password):
        pass2 = getPass(password)
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393'}
        post_data = {'username':user,'password':pass2,'drop':'0','type':'1','n':'100'}
        post_data = urllib.urlencode(post_data)
        req = urllib2.Request(url, post_data, headers)
        response = urllib2.urlopen(req)

def ping(user,password):
        fnull = open(os.devnull, 'w')
        return1 = subprocess.call('ping 61.135.169.125', shell = True, stdout = fnull, stderr = fnull)
        if return1:
                print_ts('Internet not connected!')
                print_ts('Connecting now...')
                postLogin('http://159.226.39.22/cgi-bin/do_login',user,password)
                ping(user,password)
        else:
                print_ts('Internet connected!')
        fnull.close()

def print_ts(message):
        print "[%s] %s"%(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), message)
def run(interval,user,password):
        print_ts("-"*50)
        print_ts ('Copyright (c) Huntley')
        print_ts ('Email:zhangzihao@ict.ac.cn')
        print_ts ('')
        print_ts("Check the Internet every %s seconds."%interval)
        print_ts("-"*50)
        while True:
                try:
                        time_remaining = interval-time.time()%interval
                        time.sleep(time_remaining)
                        print_ts("Checking Internet connection...")
                        ping(user,password)
                        print_ts("Next check will start after %s seconds"%interval)
                except Exception, e:
                        print e

# 设置联网检查时间间隔
interval = 600
# 设置用户名
user = 'TYPE YOUR USERNAME HERE'
# 设置密码
password = 'TYPE YOUR PASSWORD HERE'
# 运行
run(interval,user,password)

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值