坑爹的校园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下载
1 条评论
楼主可以帮忙看看我校的api为何不太一样呢