您的位置:首页 > 编程语言 > Python开发

用Python做有趣的事儿——模拟登陆学校教务系统

2017-08-29 21:43 459 查看
电赛结束后,好好休息了几天,心里有痒了起来,好久没动过Python了,上次动她已经是4月份左右,因为参加一个互联网+的比赛,用python写了一个微信公众号的后台(改天有空也更上来,呵呵,只怕是猴年马月了,没办法,我就是一个懒bi)。

——————————————————————————————————

这一篇先写下,用python做模拟登陆教务系统。

HTTP,说白了就是用Post,Get获取信息。选课,咱们得先登录学校的教务系统啊,所以用谷歌浏览器观察当我们登录教务系统的时候,网页干了什么。在登录页面,按F12,打开开发者工具,然后账号随便输入,密码您也freestyle,验证码我觉得可以。

我们发现当我们登录的时候,网页带着数据Post了一下,我们只要模仿这个Post,就可以登录啦,是不是特别简单。

但是我们发现,有验证码啊,这个就是用来鉴别登录的用户是人还是机器人。这个识别验证码,大家可以用python的图像处理的一些第三方处理试试,我是直接把图片提取出来,然后人工输入的。

也就是说,我们获取了验证码后,再把账号,密码,验证码给Post上去。一来一去,我们就访问了两次服务器,但是我们得让服务器知道这两次访问都是来自同一个ip的,否则验证码就变了,我们也就不能成功Post了。这个时候,cookies就帮了大忙,她可以帮助我们使得两次访问是同一个会话,怎么保持cookies,Python的第三方库requerts可就十分强大了,session = requests.session(),就可以帮助我们建立一个会话,保持会话信息。

好了,废话不多说了,直接上。

我用的Python3.5,一开始用的Python3.6,可是不能打包成exe文件,就退回了Pyhton3.5。编辑器用的Pycharm,个人观点这是一款非常棒的编辑器。

首先,安装需要的第三方库。BeautifulSoup(和正则一起用,还不是爽歪歪)、requests(让HTTP服务于人类)和PIL(图像处理的一个第三方,我用它把扒取的验证码打开,然后人工输入)。如果你安装的Python3,也就自动安装了pip(用pip不是更简单吗?)

三个第三方的pip下载方法:pip install beautifulsoup4

pip install requests

pip install Pillow

以我们学校的教务系统为例(还别说,学校不咋地,教务系统还挺正规)。打开开发者工具,点击Network,然后账号,密码,验证码瞎打点登录,就会在右边看见在登录的时候发生了什么。


找到一个跟登录有关的.do文件,选择headers,会看到她往一个网址(Request URL,这个url暂定义为post_url)post了一下,请求表头(Requests Headers)也在这里,里面就有咱需要的cookies,需要关注一点Referer,这里必须从Referer一栏的网址跳到这里才行。大家可以先试下不跳会怎么样,因为每个教务系统都是不一样的,不需要跳转的,就直接Post就好了。

下拉会看到在Post的数据,分别是账号,密码,验证码,其他的可能会有别的参数,应该只有 这三个是变得。我只需要在Post的时候将数据也带上就行了。不得不说,Python3的第三方库requests实在强大,甚至暴力,又有点小清新

。 点击Preview,然后挨个选择Name下的文件,找到出现验证码的一个。像下图。

再点回Headers可以看到登录的时候验证码是怎么来的,Requests URL就是我们要获取验证码而Get的url,只取红线的部分(暂定义为yzm_url)即可,后面就是唬人的。在表头那块我们可以看到Referer是loginAction.do的url。

所以思路就来了,我们可以先访问post_url,拿到cookies后,利用session保持会话,访问yzm_url,获得验证码后,再将账号、密码和验证码Post到post_url。至此我们就可以模拟登陆教务系统了。

下面直接贴核心代码了(支持开源)

session = requests.session()  # 建立会话,保持会话信息,cookies
r = session.get(post_url)
cookies = r.headers['Set-Cookie']  # 获取cookies
cookies = cookies.strip('; path=/')  # 删除指定字符,这里是由于 我学
#校的教务系统在cookies加了干扰数据。
yam_headers = {
'Accept': 'image/webp,image/apng,image/*,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Connection': 'keep-alive',
'Cookie': cookies,
'Host': '************'
'Referer':'*************'
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36'
}
#这是获取验证码的表头,这里的链接通google浏览器的开发者工具,按照前面说的去找。
yamdata = session.get(yzm_url, headers=yam_headers)  # 获取验证码
tempIm = BytesIO(yamdata.content)  # 将数据流放入tempIm以字节的形式
im = Image.open(tempIm)  # 转换为图片的形式
im.show()  # 展示验证码
Code = input('Please Enter Code:')
logindata['v_yzm'] = Code
login_headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'Content-Length': '37',
'Content-Type': 'application/x-www-form-urlencoded',
'Cookie': '',
'Host': '***********'
'Origin': '*********'
'Referer': '***********'
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36'
}
login_headers['Cookie'] = cookies
d = session.post(post_url, data=logindata, headers=login_headers)#将账号,密码,验证码和表头Post上去,然后我们可以用过BeautifulSoup或者正则表达式,抓取d.text有用的信息,判断是否登录成功。


我们成功模拟登陆教务系统后,就可以做一些我我们想做的事情了,例如抢课。模拟登陆搞明白了,抢课也就很简单了,就是Get或者Post的而已,我浪费了很多时间和代码在处理文本信息上。因为每个学校的教务系统不一样,所以就不贴代码了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: