校园网GiWiFi模拟登陆
坑爹的校園GiWiFi每個月要24元不限時長,然而每天半夜還自己掉線,登陸的APP更是臃腫,手動寫了個GiWiFi登陸Python腳本
先分析了電腦網(wǎng)頁登陸過程,都是打開網(wǎng)頁自動跳轉http://172.21.1.1:8062/redirect(校園網(wǎng)網(wǎng)關加端口和/redirect)
再進行307跳轉到登陸頁面,輸入賬號密碼就可以登陸了,中間進行一次post請求和一次get請求。
使用環(huán)境:Python2.7.4版本
| 1 2 | import urllib , urllib . request , urllib . parse , urllib . response , json , sys , time , os #此處是所有需要的庫,后面不在帶上 |
首先直接進行get請求然后獲取到登陸頁面的鏈接,登陸頁面的鏈接中有發(fā)送post請求的大部分參數(shù),簡直大快人心
| 1 2 3 4 5 6 | def get_rel_url ( ) : req = urllib . request . Request ( "http://172.21.1.1:8062/redirect" ) req . add_header ( 'User-Agent' , 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0' ) ipaddress = urllib . request . urlopen ( req ) ???????? #返回登陸頁面的URl return ipaddress . geturl ( ) |
然后進行解析URL中的參數(shù),將其轉換為JSON數(shù)據(jù)進行解析出來
| 1 2 3 4 5 | #傳入上面獲取的URL 返回json數(shù)據(jù) def qs ( url ) : ???? query = urllib . parse . urlparse ( url ) . query ???? rs_json = dict ( [ ( k , v [ 0 ] ) for k , v in urllib . parse . parse_qs ( query ) . items ( ) ] ) ???? return rs_json |
初始化json數(shù)據(jù)進行解析
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #初始化JSON urljson = json . loads ( json . dumps ( qs ( get_rel_url ( ) ) ) ) #GiWiFi網(wǎng)關地址 def get_gw_address ( ) : return urljson [ 'gw_address' ] #本機MAC地址 def get_local_mac ( ) : return urljson [ 'mac' ] #本機IP地址 def get_local_ip ( ) : return urljson [ 'ip' ] #GiWiFi的AP MAC地址 def get_gw_mac ( ) : return urljson [ 'apmac' ] #GiWiFi的登陸網(wǎng)關端口 def get_gw_port ( ) : return urljson [ 'gw_port' ] #GiWiFi AP的SSID def get_gw_ssid ( ) : return urljson [ 'gw_id' ] |
在對登陸時進行抓取數(shù)據(jù)包,根據(jù)抓到的數(shù)據(jù)進行填充數(shù)據(jù)包
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | login_phone = "賬號" login_password = "密碼" json_data = { 'gw_id' : '' + get_gw_ssid ( ) + '' , 'gw_address' : '' + get_gw_address ( ) + '' , 'gw_port' : '' + get_gw_port ( ) + '' , 'url' : 'http://www.baidu.com' , 'ip' : '' + get_local_ip ( ) + '' , 'mac' : '' + get_local_mac ( ) + '' , 'apinfo' : '' , 'btype' : 'pc' , 'PHPSESSID' : '' , 'olduser' : '0' , 'page_time' : '' + str ( int ( time . time ( ) ) ) + '' , 'lastaccessurl' : '' , 'user_agent' : '' , 'devicemode' : '' , 'access_type' : '0' , 'station_sn' : '2851320eb741' , 'client_mac' : '' + get_gw_mac ( ) + '' , 'online_time' : '0' , 'logout_reason' : '7' , 'contact_phone' : '400-038-5858' , 'suggest_phone' : '400-038-5858' , 'station_cloud' : 'login.gwifi.com.cn' , 'acsign' : '800ec48e04be9a2ea9804ce64648887e' , 'name' : '' + login_phone + '' , 'password' : '' + login_password + '' , 'service_type' : '1' } |
模擬登陸,發(fā)送數(shù)據(jù)包,其中返回的JSON數(shù)據(jù)有攜帶登陸秘鑰的地址,獲取后直接使用地址發(fā)起GET請求,返回登陸狀態(tài)數(shù)據(jù)
| 1 2 3 4 5 6 7 8 9 10 11 12 | def login ( ) : data = urllib . parse . urlencode ( json_data ) . encode ( encoding = 'UTF-8' ) #POST發(fā)送登陸數(shù)據(jù) req = urllib . request . Request ( 'http://login.gwifi.com.cn/cmps/admin.php/api/loginaction?round=308' ) login_json = urllib . request . urlopen ( req , data = data ) #對返回的JSON數(shù)據(jù)進行解析 auth_json = json . loads ( login_json . read ( ) ) auth_url = auth_json [ 'info' ] ???????? #對解析到的地址繼續(xù)發(fā)起GET請求并獲取登陸狀態(tài) end_login_status = urllib . request . urlopen ( auth_url ) return end_login_status #返回登陸狀態(tài)數(shù)據(jù) |
將返回的登陸數(shù)據(jù)進行解析,檢測登陸狀態(tài)auth_state是否2,為2則登陸成功,就可以上網(wǎng)了
| 1 2 3 4 5 6 7 8 9 | def get_login_status ( ) : wifi_status_json = urllib . request . urlopen ( "http://" + get_gw_address ( ) + ":" + get_gw_port ( ) + "/wifidog/get_auth_state?ip=" + get_local_ip ( ) ) status_json = json . loads ( wifi_status_json . read ( ) ) [ 'data' ] auth_status = json . loads ( status_json ) [ 'auth_state' ] if auth_status == 2 : status = "GiWiFi online" else : status = "GiWiFi offline" return status |
為了防止賬號掉線或者半夜GiWiFi AP自動重啟,讓其檢測是否在線,如果在線就隔一會再檢測,掉線就進行登陸
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #獲取登陸狀態(tài)的JSON get_json = json . loads ( urllib . request . urlopen ( "http://" + get_gw_address ( ) + ":" + get_gw_port ( ) + "/wifidog/get_auth_state?ip=" + get_local_ip ( ) ) . read ( ) ) [ 'data' ] #解析登陸狀態(tài) end_status = json . loads ( get_json ) [ 'auth_state' ] #如果為2顯示已經登陸 if end_status == 2 : print ( 'Login_Status:' , get_login_status ( ) ) #循環(huán)檢測是否在線 while 1 > 0 : get_json = json . loads ( urllib . request . urlopen ( "http://" + get_gw_address ( ) + ":" + get_gw_port ( ) + "/wifidog/get_auth_state?ip=" + get_local_ip ( ) ) . read ( ) ) [ 'data' ] end_status = json . loads ( get_json ) [ 'auth_state' ] ???????? #登陸狀態(tài)不為2進行登陸 if end_status != 2 : ???? print ( 'Start login GiWiFi ......' ) ???? login ( ) ???? print ( 'Login_Status:' , get_login_status ( ) ) ???????? #睡眠1S time . sleep ( 1 ) |
以上為Python2.x版本的腳本,如果需要Python3.x版本的請前往 ?原文出處 下載
總結
以上是生活随笔為你收集整理的校园网GiWiFi模拟登陆的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 语音唤醒论文待看
- 下一篇: 在Linux系统中的安装cpolar内网