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

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

2016-01-21 17:49 555 查看
本文章为小川先生原创,转载可以,请标明出处。

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

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:
break
dta = {}
dta['groupId'] = ''
dta['j_username'] = '1418140323'
dta['login'] = '登录'
dta['j_password'] = 'yourPassword'
dta['j_captcha'] = checkcode
dta = 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.')
break
else:
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, 超级课程表.

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



本文章为小川先生原创,转载可以,请标明出处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: