來所裏一年了,終於有了一臺電腦,是小樂師兄淘汰給我的,很開心,因爲用它編程智商有加成。但是問題就來了,我平時人在懷柔啊,怎麼才能用所裏的電腦搞科研呢?遠程自然是很簡單的,但是所裏每天晚上三天鍾會可恥地斷一次網,而且斷網必須要登錄才能重連,爲了不麻煩師兄,同時也讓我週末回來顯得很忙的樣子,我開始鼓搗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)