鼻子亲了脸

校园网GiWiFi模拟登陆
坑爹的校园GiWiFi每个月要24元不限时长,然而每天半夜还自己掉线,登陆的APP更是臃肿,手动写了个GiWiFi...
扫描右侧二维码阅读全文
22
2017/11

校园网GiWiFi模拟登陆

坑爹的校园GiWiFi每个月要24元不限时长,然而每天半夜还自己掉线,登陆的APP更是臃肿,手动写了个GiWiFi登陆Python脚本

先分析了电脑网页登陆过程,都是打开网页自动跳转http://172.21.1.1:8062/redirect(校园网网关加端口和/redirect)

再进行307跳转到登陆页面,输入账号密码就可以登陆了,中间进行一次post请求和一次get请求。

1. 使用环境

使用环境:Python2.x.x版本 Python 3.x.x
2017.11.28更新 Python 3.x.x版本

2. 加载lib

import urllib,urllib.request,urllib.parse,urllib.response,json,sys,time,os
#此处是所有需要的库,后面不在带上

3. 初次请求

首先直接进行get请求然后获取到登陆页面的链接,登陆页面的链接中有发送post请求的大部分参数,简直大快人心

defget_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
returnipaddress.geturl()

然后进行解析URL中的参数,将其转换为JSON数据进行解析出来

4. 初始化JSON

#传入上面获取的URL 返回json数据
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数据进行解析

5. 解析参数

#初始化JSON
urljson=json.loads(json.dumps(qs(get_rel_url())))
#GiWiFi网关地址
defget_gw_address():
returnurljson['gw_address']
#本机MAC地址
defget_local_mac():
returnurljson['mac']
#本机IP地址
defget_local_ip():
returnurljson['ip']
#GiWiFi的AP MAC地址
defget_gw_mac():
returnurljson['apmac']
#GiWiFi的登陆网关端口
defget_gw_port():
returnurljson['gw_port']
#GiWiFi AP的SSID
defget_gw_ssid():
returnurljson['gw_id']

6. 填充数据

在对登陆时进行抓取数据包,根据抓到的数据进行填充数据包

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'
        };

7. 模拟登陆

模拟登陆,发送数据包,其中返回的JSON数据有携带登陆秘钥的地址,获取后直接使用地址发起GET请求,返回登陆状态数据

deflogin():
data=urllib.parse.urlencode(json_data).encode(encoding='UTF-8')
#POST发送登陆数据
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数据进行解析
auth_json=json.loads(login_json.read())
auth_url=auth_json['info']
        #对解析到的地址继续发起GET请求并获取登陆状态
end_login_status=urllib.request.urlopen(auth_url)
returnend_login_status#返回登陆状态数据

8. 解析返回数据

将返回的登陆数据进行解析,检测登陆状态auth_state是否2,为2则登陆成功,就可以上网了

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自动重启,让其检测是否在线,如果在线就隔一会再检测,掉线就进行登陆

9. 检测登陆状态

#获取登陆状态的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']
#解析登陆状态
end_status=json.loads(get_json)['auth_state']
#如果为2显示已经登陆
ifend_status==2:
print('Login_Status:',get_login_status())

10. 掉线自动登陆

#循环检测是否在线
while1>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']
        #登陆状态不为2进行登陆
ifend_status!=2:
    print('Start login GiWiFi ......')
    login()
    print('Login_Status:',get_login_status())
        #睡眠1S
time.sleep(1)

以上为Python2.x版本的脚本,如果需要Python3.x版本的请前往Github下载

Last modification:March 18th, 2019 at 04:47 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment