Python登录大连交通大学教务在线实现成绩查询

来源:互联网 发布:ug4.0编程刀路下载 编辑:程序博客网 时间:2024/04/27 18:37

本文章为小川先生原创,转载可以,请标明出处。

每次听说出成绩了, 然后就急急忙忙上教务, 点开网站, 输入帐号, 密码, 验证码, 然后还要点好多次才能看到成绩. 然而作为一个懒癌晚期患者, 这是没有办法忍受的. 那好吧, 自己写个工具好了.

Idea 1. POST登录教务, 然后查成绩

python3.4

先登录好吧. 我这里使用的是Chrome浏览器和自带的调试工具, 按F12就可呼出.

上教务咯.(jw.djtu.edu.cn)

按F12, 然后点Network, 然后输入帐号密码验证码, 然后点登录. 好的, 然后你就会看到下面的Network窗口一直冒出数据. 滚轮滑到最上边. 这里看到有一个POST请求.


点进去.


这个URL提示我们了, 这是一个security_check, 应该就是向服务器提交我们的帐号密码, 把窗口往下拖.


不小心看到浏览器偷偷提交的数据了, 哈

第一个参数groupId, 我也不知道干啥的, 可能跟教务的权限控制有关? 哎呀, 不小心泄漏太多- –

第二个参数j_username, 用户名, 不解释

第三个参数login, 应该是说明行为的, 不管, 照抄

第四个参数j_password, 密码, 明文!!!

第五个参数j_captcha, 咋一看, 这一堆数字啥玩意儿啊, 唉, 怎么好像是我刚才输入的验证码.

既然参数都搞懂了, 那就用postman(Chrome 插件)试试吧, 哈哈


填入URL, 这个就是刚才抓包时显示的Request URL.

User-Agent也在刚才抓的那个包里, 在Request Headers里. 很多网站用UA判断网络请求是人发起的, 还是机器发起的. 比如python默认的UA就是python 3.4/ , 还有就是一些客户端识别, 以前很常见的那种软件, 用它发微博就显示来自iPhone, 也是这个原理, 就是发微博的时候, 使用iPhone默认的UA.


选择第二个,x-www-from-urlencoded. 这是默认的表单提交方式.

如图所示, 填入必要参数, 对了, 验证码的话….直接看浏览器里教务的图片吧, 然后填在这里

点Send.


唉嘛, 这是咋回事, 参数应该都是对的啊~~~, 好吧, 要不试试interceptor, 兴许跟cookies有关.

装好后, 在postman的右上角开启它, 再点Send, 唉, 怎么就好使了.


其实是interceptor使用了chrome浏览器的 Cookie, 所以提交就好使了.

为啥带上cookie就好使了呢, 这邪门.

其实是这样的, 你的浏览器加载验证码的时候, 服务器会给你一个JESSIONID, 用于作为用户的临时识别代码, 所以他能判断你获取到了哪张验证码, 所以才能判断验证码是否正确.

盗取别人的cookie的话, 差不多相当于盗取了他用户的临时使用权, 这就是为啥你点了一些奇怪的链接之后, 你的qq或者其它的帐号就被盗了. (恶意网页代码扒你的保存在电脑上的cookie, 然后用他去提交数据)

好了, 瞎BB了那么多, 该上主题了.

当然, 咱这个方法还是要输入验证码的, 所以先自动获取验证码的图片, 然后人眼识别, 然后输入验证码. 登录成功.

先获取验证码:

开F12调试, 多点几次验证码, 就能看出规律了.

http://jw.djtu.edu.cn/academic/getCaptcha.do?0.06245193560607731

后面的一堆数字其实就是随机数.

Python有个random模块.

里面有个random.random()方法

返回一个[0,1)的小数

>>>random.random()0.6363492206638173>>>random.random()0.8982103132246348>>>random.random()0.20045321977485753>>>random.random()0.18511221787593868


python3获取验证码, 并写到本地目录的jwpost.jpg文件, 而且返回cookie值:

def getCheckcode(cookie=None):url = 'http://jw.djtu.edu.cn/academic/getCaptcha.do?' + str(random.random())res = superxc.xcUrlopen(url, ck=cookie)with open('jwpost.jpg', 'wb') as f:f.write(res.read())if cookie==None:ck = res.info()['Set-Cookie']ck = ck[0:ck.find(';')]return ck


superxc是我自己的一个库, 里面的xcUrlopen:

def xcUrlopen(url, data=None, ck=None):req = urllib.request.Request(url, data)req.add_header('User-Agent', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36')if ck!=None:req.add_header('Cookie', ck)res = urllib.request.urlopen(req)return res


urllib.request.Request()创建一个Request对象, data必须是已经编码过的.

req.add_header()添加协议头UA

xcUrlopen返回一个Request对象, 可以像文件对象, 使用read()之类的方法

Python实现教务在线登录:

def xcLogin(cookie):url = 'http://jw.djtu.edu.cn/academic/j_acegi_security_check'while True:while True:sys.stdout.write('Code:')sys.stdout.flush()os.system('eog jwpost.jpg')checkcode = input()if checkcode=='-1':getCheckcode(cookie)else:breakdta = {}dta['groupId'] = ''dta['j_username'] = '1418140323'dta['login'] = '登录'dta['j_password'] = 'yourPassword'dta['j_captcha'] = checkcodedta = urllib.parse.urlencode(dta).encode('utf-8')res = superxc.xcUrlopen(url, dta, cookie)s = res.read().decode('gbk')if s.find('验证码不正确')!=-1:print('Error checkcode')getCheckcode(cookie)elif s.find('密码不匹配')!=-1:print('Wrong password')exit()elif s.find('不支持框架')!=-1:print('Login success.')breakelse:print('Unknow erro.')exit()


os.system() 是执行命令. eog jwpost.jpg 就是调用ubuntu默认的图片查看器打开验证码图片.

为什么上面用sys.stdout.write()呢, 因为直接用input(“Code:”)的话, 验证码弹出的时候, 命令行界面是不显示’Code:’的, 要等验证码图片被关闭后才能显示, 不友善, 所以改成这sys.stdout.write()

被要求输入验证码时, 可以输入-1, 表示验证码太模糊, 请求再来一张.

表单数据必须编码后才能提交, 表单数据是不是看着像dict, 没错, 就是它.

urllib.parse.urlencode(dta) 把dict编码成可提交数据,

楼上.encode(‘utf-8’) 服务器交换数据默认使用utf-8编码

好了, 现在你应该会使用python登录教务在线了, 查询成绩嘛, 再来一个GET就好了.

Idea 2. 超级课程表成绩查询

手机打开超级课程表, 然后点成绩查询.

然后右上角, 使用Safari打开, 然后复制URL到电脑上, 用浏览器打开.

URL差不多是这样的

http://112.124.54.19/Score/score.html?schoolIdentity=7937305C7B2C414514D8431493656089&identity=***bu gei kan***

identity好像是个人身份识别码

scholIdentity是学校识别码, 如果你跟我一样, 那么咱应该是校友, 握手- –

Idea 3. 大交助手成绩查询

微信关注大交助手, 绑定后, 它会给你分配一个openid, 用作用户身份识别.

你点成绩查询, 照样在Safari打开.

URL是类似这样的

http://djzs.vipsinaapp.com/chengji.php?openid=**bu gei kan**

如果openid不写的话, 好像直接返回大交助手作者的成绩信息- –

喂, 喂, 这网址咋一看, 像SAE的, 一个post直接查成绩, 不用帐号密码验证码. 当然了, 帐号是否安全, 不好说. 哈哈

再次膜拜这位大神.

作者水平有限, 大家一起学习.哈哈

更多关于Python爬虫教程, 自行doodle.

最后的最后, 展示下我写的成绩查询, 基于Idea 2, 超级课程表.

再次声明, 海燕是个坑货- –


本文章为小川先生原创,转载可以,请标明出处。

2 0
原创粉丝点击