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:[email protected]')
        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:[email protected]')
        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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章