歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

用Python登錄Dr.com

如今一般的大學校園或者公寓都是通過客戶端來限制路由器使用,基本上都是Dr.com客戶端,有的是登錄樣式,有的是插件樣式。下面我們來說說Python定制自己的客戶端。

前提:isp得支持web登錄的方式。
 
說明:每個ISP的登錄頁面不一樣,不過我估計算法都是一樣的,於是解決方案應該也是相似的,只是表單的key可能不太一樣。

首先,分析登錄頁面。
 
頁面head鑲嵌了<script>標簽,所有的提交相關的腳本都在這裡。頁面關鍵部分是兩個表單:f1和f0。整個f0是看不見的,但是點擊f1的提交時,會直接調用f0的提交而不是提交自己。表單的table布局就不吐槽了...

部分HTML


01.<form name="f1" method="post" action="" onsubmit="return ee()"> 
02.<table border="0" width="100%" cellspacing="1" cellpadding="0" height="100%" class="f1"> 
03.... 
04.<tr> 
05.<td height="34" width="35%" align="right">賬號 Account </td><td height="34" width="64%"> <input name="DDDDD" type="text" maxlength="26" class="input-border"></td> 
06.</tr> 
07. 
08.<tr> 
09.<td height="32" width="35%" align="right">密碼 Password </td><td height="32" width="64%"> <input name="upass" type="password" maxlength="16" class="input-border"></td> 
10.</tr> 
11. 
12.<tr> 
13.<td height="57" width="35%"> </td><td height="57" width="64%"> <input type="submit" name="0MKKey" value="" onclick="cc(0)" class="login-b">  <input type="submit" name="" value="" onclick="reset();return false;"></td> 
14.</tr> 
15.... 
16.</form> 

這裡可以看見,點擊submit的時候,調用cc(0),提交的時候調用ee()函數

部分js:

01.function cc(ss) { 
02.  f0.R1.value = ss; 
03.} 
04. 
05.function ee() { 
06.  if (f1.DDDDD.value == "") { 
07.    alert("請輸入您的賬號 Please enter your account account number"); 
08.    return false; 
09.  } 
10.  f0.DDDDD.value = f1.DDDDD.value 
11.  if (ps == 0) { 
12.    f0.upass.value = xproc1(f1.upass.value); 
13.  } else { 
14.    tmpchar = pid + f1.upass.value + calg; 
15.    f0.upass.value = calcMD5(tmpchar) + calg + pid; 
16.    f0.R2.value = 1; 
17.  } 
18.  document.f0.submit(); 
19.  return false; 
20.} 

 顯然,點擊提交後,會對f0進行一系列賦值,如果沒有問題就會提交f0

f0:

01.<form name="f0" method="post" action=""><input type="hidden" name="DDDDD" value="0"><input type="hidden" name="upass" value="0"> 
02.<input type="hidden" name="R1" value="0"><input type="hidden" name="R2" value="0"><input type="hidden" name="para" value="00"> 
03.<input type="hidden" name="0MKKey" value="123456"> 
04.</form> 

 參考js裡的內容,用python的dict表示f0的話有如下的偽代碼:

01.f0={} 
02.f0["DDDDD"] = f1['DDDD'] 
03.f0["upass"] = calcMD5(pid + f1['upass'] + calg) + calg + pid; 
04.f0["R1"] = ss 
05.f0["R2"] = 1 
06.f0["para"] = 00 
07.f0["0MKKey"] = 123456 
 
其中 ss、pid、calg都是常量,f1['DDDD']、f1['upass']分別是用戶輸入的用戶名和密碼字符串

關鍵在於calcMD5的算法。
 
從函數名和函數本身來看,這個函數是MD5的一種實現。然而對js代碼進行移植的過程中出現了一些問題:js和python的移位操作表現不同。
 
既然整個f0[’upass’]字段除了用戶輸入的密碼以外,其它都是常量,完全可以用js計算出f0[’upass’],python中只要保存這個字符串就行了。

檢查cookies發現整個網頁沒有使用cookies。
 
登錄後跳轉到登出頁面,分析登出頁面發現,登出只需要訪問某個特定的網頁就行了。

於是整個思路很簡單,pos登錄服務器實現登錄,get指定網頁登出。實現代碼如下:

01.import sys 
02.from urllib import urlencode 
03.from urllib2 import urlopen 
04. 
05.username = "s10********" 
06.upass = "6696a3***********************************" 
07.LOGIN = "http://202.1**.***.***/" 
08.LOGOUT = "http://202.1**.***.***/F.htm" 
09. 
10.def post(url, data=None): 
11.    if data: 
12.        data = urlencode(data) 
13.    response = urlopen(url, data) 
14.    return response.read() 
15. 
16.def login(): 
17.    data={} 
18.    data["DDDDD"] = username 
19.    data["upass"] = upass 
20.    data["R1"] = 0 
21.    data["R2"] = 1 
22.    data["para"] = 00 
23.    data["0MKKey"] = 123456 
24.    post(LOGIN, data) 
25.    pass 
26. 
27.def logout(): 
28.    post(LOGOUT) 
29. 
30.def main(argv): 
31.    if argv[0] in ('login','in','i'): 
32.        login() 
33.    elif argv[0] in ('logout','out','o'): 
34.        logout() 
35.        pass 
36.    pass 
37. 
38.if __name__ == '__main__':   
39.    main(sys.argv[1:]); 

《Python核心編程 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm

《Python開發技術詳解》.( 周偉,宗傑).[高清PDF掃描版+隨書視頻+代碼] http://www.linuxidc.com/Linux/2013-11/92693.htm

Python腳本獲取Linux系統信息 http://www.linuxidc.com/Linux/2013-08/88531.htm

在Ubuntu下用Python搭建桌面算法交易研究環境 http://www.linuxidc.com/Linux/2013-11/92534.htm

Python 的詳細介紹:請點這裡
Python 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved