产品主页
Git版本代码说明
Git仓库: https://github.com/Fly-MZX/RainClassroom-Assistant
本次Git开源版本的代码为V1.0-Beta版本的代码,至于为什么没有开源最新版本的代码:
由于本人在2020-07-03这天重装系统,误将开发文档盘不可逆格式化,导致所有迭代版本的源代码丢失!
所幸的是:该版本在初期与朋友交流时,发过文档,聊天记录留存了下来。
该版本特别说明:
- 代码冗余,耦合度高,初期仅为了追求核心功能的实现。未进行任何重构优化!
- 挂机签到功能写了一半
- 新版考试系统未兼容
- 所有API均在Ykt类的属性方法里
- 授权机制依然采用本地授权
- 登录仅有Email登录
- 截止目前2020年7月30日,有些API可能已经失效,请自行测试
- 变量的命名尽量采用标准英文命名,所以应该可以做到阅读即顾名思义
项目综述
- 本项目采用 Python 开发
- 版本截止目前为止迭代了5个大版本(2020-06-20)
- 项目功能:1.挂机签到;2.课件答题;3.直播答题;4.考试答题(兼容新旧版本考试系统)
- 其他配合语言:PHP(后端私有API)JS(油猴脚本版)
- 项目呈现形式:exe(功能最完整)Js脚本版
开源说明
- 暂时不会放出全部源代码
- 一步步开源思路及分享开发过程中的一些经验
- 在完全开源之前,我会提交所有BUG到XXX
- 此项目开源协议遵从 GNU Affero General Public License v3.0
- 通过复制本项目用于其他用途产生的其他问题均由复制传播者自行承担,与飞跃无关
一、模拟登录
2020年6月18日 今天来开源登录功能模块的实现。有人就要问了,为什么要实现登录功能呢?凭手动抓取cookie不也能达到,爬取的目的嘛。是的确实可以,但是这样比较麻烦,而且还不能进行会话保持进行下一步操作,这对于需要登录验证后才能进行数据爬取的爬虫来说非常不友好。(至于什么是会话保持,我会在后期专门出一篇文章的来介绍 cookie session token类的)
分析雨课堂登录界面
首页 https://www.yuketang.cn/web
打开界面就会看到第一个登录方式:扫码登录。显然是微信扫码登录。此种方式我可以提前告诉:这是基于Websocket通信的登录方式,那么模拟这种登录方式的,是有一定的难度的,难度来自于你得去学Websocket的相关知识,还要去学习Python的Websocket相关库。所以这种登录方式你们后期自己去尝试挑战完成吧。
直接按照图中第二种方式:
点击后,可以看到还有三种登录方式,种类还挺多。经过抓包分析,其中【手机登录】和【邮箱登录】对密码进行了加密。嗯,没错遇到了常见的返爬机制,同时这也是雨课堂考虑保护用户隐私信息的措施。
下面我们就开始通过抓包进行登录分析:
常见的抓包工具有: Fiddler,Httpwatch等。其实我们的开发者工具就带有抓包工具:在相应页面 按F12 就可以看到以下页面:
刷新一下就可以看到相应的请求等,而且还可以查看请求的类型,分类查看。但是对于本次的请求抓包我们必须用抓包工具,因为登录成功后会重定向(302)所以前边的请求会被淹没。我用的是 Fiddler
点击发送请求后右边截获到请求
登录验证网址:https://www.yuketang.cn/pc/login/verify_pwd_login/
点击查看请求后,发现请求体内的pwd(password)参数的内容被加密了,没错加密了,已经不是我输入的123456了,这就为我们的实现增加了点难度。来思考,既然他是加密后传输,那么他就肯定是在前端进行加密完成的。那就让我们去找找吧!
在登录界面直接搜索【邮箱登录】哦豁,这不来了嘛,发现了吗login_js,看来登录有关的配置都在这里了。
打开js直接搜索pwd发现 B.encrypt(n.pwd),真相越来越近了,调用了B.encrypt对密码进行加密。再来看看B.encrypt的原理是什么。
上下翻阅,找到了B函数是怎么来的了。而且它用了一个密钥,ok重点来了,这是采取哪种加密方式呢。很明显采用了公钥加密,那么那就是RSA非对称式加密算法了。
好了至此加密登录原理分析完毕,整理下登录逻辑:
- 加载登陆页面;
- 服务器返回公钥、login.js 及加密js;
- 把密码通过上述三个东西加密后和用户名等一些东西传至后端进行验证,如果成功,就响应登录成功,不然响应登陆失败。
代码实现:登录函数(cookie持久化登录)
import base64,time,msvcrt
import requests,json,re,lxml
import urllib,websockets,asyncio
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
from http import cookiejar
from bs4 import BeautifulSoup as bsp
def crack_pwd(self):
"""密码加密"""
key = "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCQBaPX7crEH6/jS4hRD7lZrsFRIdfwEhH30onFnrnWxiRATzP9WEneXJEZHopmzudkNS5bDp51SCnBUGGgfL/sUUrlrhV2xnTSe1jRl924ejV5rkVkiii85jp9G8eJrJN6klHs0PfYfp4EVJ8688qpi5iETtg+q4ITocyEyD1+7wIDAQAB\n-----END PUBLIC KEY-----"
rsakey = RSA.importKey(key)
cipher = Cipher_pkcs1_v1_5.new(rsakey) # 生成对象
cipher_text = base64.b64encode(cipher.encrypt(self.pwd.encode(encoding="utf-8"))) # 对传递进来的用户名或密码字符串加密
value = cipher_text.decode('utf8') # 将加密获取到的bytes类型密文解码成str类型
return value
def login(self,load_cookies:bool=True):
"""Email登录"""
if load_cookies and self.load_cookies():
print("检查登录信息中")
if self.check_login():
print("登录成功")
return True
print('登录信息已过期')
self._check_user_pass()
data = {
'type':'E',
'name':self.name,
'pwd':self.crack_pwd()
}
length = len(data)
js_data = json.dumps(data)
r = self.session.post(url=self.email_login_url,data=js_data,headers = self.headers)
status = r.json()
#if status['success'] == True:
#print('登录成功')
if self.check_login():
print('登录成功')
return True
print('登录失败')
return False
def load_cookies(self):
"""
读取cookies文件加载到session
:return:bool
"""
try:
self.session.cookies.load(ignore_discard = True)
return True
except FileNotFoundError:
return False
def check_login(self):
"""
检查登录状态,访问登录页面出现跳转则是已经登录,
如登录成功保存当前cookies
:return: bool
"""
login_url = 'https://www.yuketang.cn/v2/api/web/userinfo'
resp = self.session.get(login_url,allow_redirects = False)
if resp.status_code == 200:
self.session.cookies.save()
return True
return False
def _check_user_pass(self):
"""
检查用户名和密码是否已输入,若无则手动输入
"""
if not self.name:
self.name = input('请输入正确的邮箱:')
if not self.pwd:
self.pwd = input('请输入密码:')
到此雨课堂加密比较完整的登录代码,总共用了5个函数模块,至于二维码登录,那就劳烦各位了。代码有什么不懂的地方可以留言交流。
用不了了
@陌凡 QQ群也没有了
@陌凡 支持作者大佬,倒卖SB玩意,还是希望能早日再用上,谢谢作者大佬了!!
@陌凡 可惜了,支持作者大佬
@陌凡 现在还有群吗,请问为什么我在ppt里面答题匹配不来脚本呀
@陌凡 支持大佬 希望早日恢复 倒卖狗死妈
@陌凡 大佬还有群 可以交流下吗
站长真的不是一般人。虽然不了解,但通过浅浅的观察我感觉真的是通过自己的做到了如今的成就真的厉害。作为一个比站长小几岁的我来说,真的是感觉这个成就真的不错。希望可以和站长做朋友,进一步了解站长。
站长 请问什么时候能使用这个软件啊
大佬,什么时候能用?
真心求一个方法,有的人也希望可以分享一下,可以有偿
雨课堂发布的在线考试,点击考试会转至学堂在线网址考xuetangx,没法用这个查呀
刚来不太了解情况,弱弱问一句可能开源吗
大佬 油猴上新发布那脚本 怎么也下了?
同是程序猿 大佬辛苦了
你好,这个脚本打开旧试卷的时候,长时间“正在加载, 请稍后”,请问是bug吗?
那个人举报了你的 然后自己发了个没法用的 点开雨课堂电脑直接卡的不行
想知道大佬是自己有题库还是调用的雨课堂bug得到的答案, 如果是bug可以说分享吗, 如果是自己的题库那大佬哪来的这么多精力搜集题目而且还是用爱发电
大佬那个盗版的也被举报了,能再发一下吗?
@水太凉 大佬什么时候可以再发一下呢
明天就考试了,现在一个解决办法都莫得QAQ希望大佬早日恢复
跪求大佬分享软件,绝对保证仅仅是自用!
跪求大佬软件,自用!
楼下有思路的话建个群呗?
群也解散了,
@孤独患者 大佬们还有路子吗?有的话私聊,有偿。
大佬给个机会,救救孩子QAQ今晚还一科
大佬求软件啊
QAQ已申请我,求放啊。
给站长点赞,看到qq群发了github然后过来的,计算机我是只学了一点c,不太看得懂,站长给了这个制作的思路,分享自己的成果,属实不易。过段时间准备专心研究研究,看看能不能弄明白一些。