首先,这篇不完全原创,是参照崔庆才的博客中的一片文章《自己动手实现山东大学QLSC_STU无线网络掉线后自动重连》:http://cuiqingcai.com/2083.html
这里推荐一下崔庆才的个人博客:http://cuiqingcai.com/ 非常不错能够学到很多东西。
看完,这篇博客之后,我发现我学校的无线网也是类似的,结合之前看过崔大大的爬虫练习一下,发现学校的SCUT可以更加简单。
1.首先,连接scut之后,打开登录认证界面,可以看到要输入账号和密码(统一认证的那个账号密码),然后用chrome的开发者工具点开network那个,用来捕捉网络请求响应
2.之后,点击登录之后,点击header,观察得到我们需要的数据------表单数据,主要查看Form Data中的内容
3.然后知道我们需要post_data的数据内容有哪些了
(post的data列表如下)
其中最重要的几个数据需要我们自己去填写,wlanuserip无线上网的ipv4的地址,这个时候这个无线网分配的,userid登录的用户名,passwd登录的密码(想不到华工登录的密码竟然没有进行什么加密,感觉很容易被盗)
简单分析之后,代码的结构跟崔大大的写的是差不多的,主要注意python3中urllib是将python2中urllib和urllib2合并到一起,和一些字符串和字节的关系即可。(header信息中还有一个refer信息不可缺失,否则会被认为非法接入)
现在,直接贴上我的代码,关于各部分,有相应解释,结推荐的博客,应该很容易看懂。
#coding:utf-8
#将其修改成适应python3.X编译
import urllib#python3中已经将urllib和urllib2合并在一起了
#import urllib2
from urllib import parse,request
import socket
import types
import time
import re
import os
import subprocess
class SCUTWIFI:
def __init__(self):
#自己填写自己的账号和密码
self.userid = 'xxxxxx'
self.passwd = 'xxxxxx'
#华工无线网的网段,不知道不同的区会不会不一样,还是全校都是这样
self.ip_pre = '172.27'
def login(self):
#这里先判断,连接上SCUT之后,能不能上网(因为一天只要登录过一次,就够,应该是这样)
isconnect = self.isConnect()
if not isconnect:
print ('Scut可以上网了!不需要去认证登录!')
else:
print('发现scut还暂时不能上网...')
print ('正在认证华工无线网.....')
wlanuserip = self.getIP()
print ('无线上网的地址%s'%str(wlanuserip))
data={
'wlanuserip':wlanuserip,
'wlanacname':'AC-master',
'chal_id':'',
'chal_vector':'',
'auth_type':'PAP',
'seq_id':'',
'req_id':'',
'wlanacIp':'192.168.104.252',
'ssid':'scut',
'vlan':'',
'mac':'',
'message':'',
'bank_acct':'',
'isCookies':'',
'listpasscode':'0',
'listgetpass':'1',
'getpasstype':'0',
'randstr':'5254',
'domain':'',
'version':'0',
'authkey':'123456',
'isRadiusProxy':'false',
'usertype':'',
'url':'',
'isHaveNotice':'0',
'times':'0',
'weizhi':'0',
'smsid':'0',
'act':'',
'freeuser':'',
'freepasswd':'',
'logintype':'0',
'templatetype':'1',
'tname':'0',
'terminalType':'',
'is189':'0',
'viewusertime':'1',
'group_id':'',
'portaltype':'',
'portalpageid':'',
'viewlogin':'1',
'listfreeauth':'0',
'checkterminal':'true',
'userid':self.userid,
'passwd':self.passwd
}
#消息头
headers={
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',
'Host':'202.38.193.207',
'Origin':'http://202.38.193.207',
'Referer':'http://202.38.193.207/portalReceiveAction.do?wlanacname=AC-master&wlanuserip=172.27.194.70&wlanacname=AC-master&ssid=scut'
}
#1
post_data = parse.urlencode(data).encode()
login_url = 'http://202.38.193.207/portalAuthAction.do'
req = request.Request(login_url,post_data,headers)
respon = request.urlopen(req)
content = respon.read().decode('gbk')
self.getResultLogin(content)
def getResultLogin(self,content):
if u'上网期间请不要关闭此窗口' in content:
print ('登陆成功!')
else:
print ('登陆失败!' )
#获取本机无线上网的IP
def getIP(self):
local_iP = socket.gethostbyname(socket.gethostname())
if self.ip_pre in str(local_iP):
return str(local_iP)
ip_lists = socket.gethostbyname_ex(socket.gethostname())
for ip_list in ip_lists:
if isinstance(ip_list, list):
for i in ip_list:
if self.ip_pre in str(i):
return str(i)
elif isinstance(ip_list,str):
if self.ip_pre in ip_list:
return ip_list
def isConnect(self):
#判断是不是已经连接上SCUT
denull = open(os.devnull,'w')
result = subprocess.call('ping www.baidu.com',shell=True,stdout=denull,stderr=denull)
#关闭设备
denull.close()
#0代表着连接上网络,1代表没有连接上
return result
def main(self):
print ('欢迎使用LEE的Wlan简易登录系统')
#self.userid = input('请输入账号:')
#self.passwd = input('请输入密码:')
#self.login()
while True:
#通过是否分配上网的IP地址判断是否连接上SCUT,如果没有会print出127.0.0.1
nowIP = self.getIP()
print (nowIP)
if not nowIP:
print ('还未连接scut!')
else :
print ('已连接scut')
self.login()
return False#登陆上就退出程序
ScutLogin = SCUTWIFI()
ScutLogin.main()
最后,博主第一次写博客,不太会写,代码也是写的不是很好,希望大家能给建议,一起学习进步,(希望不喜勿喷!!!)