From 2b0903583a35057d6e9a33aa1773acb0fbf6632a Mon Sep 17 00:00:00 2001 From: logend Date: Tue, 22 Dec 2020 15:11:20 +0800 Subject: [PATCH 1/9] fix bug and add new course --- main.py | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 83 insertions(+), 5 deletions(-) diff --git a/main.py b/main.py index 350f656..cad3c4a 100644 --- a/main.py +++ b/main.py @@ -4,7 +4,7 @@ import os # 兼容文件系统 import random -tenantCode = '10422' # 院校ID +tenantCode = '4143010830' # 院校ID def main(): @@ -31,7 +31,7 @@ def main(): # 请求课程完成进度 try: - getProgressResponse = WeiBanAPI.getProgress(loginResponse['data']['preUserProjectId'], + getProgressResponse = WeiBanAPI.getProgress(loginResponse['data']['normalUserProjectId'], tenantCode) print('课程总数:' + str(getProgressResponse['data']['requiredNum']) + '\n' + '完成课程:' + str(getProgressResponse['data']['requiredFinishedNum']) + '\n' @@ -43,7 +43,7 @@ def main(): # 请求课程列表 try: - getListCourseResponse = WeiBanAPI.getListCourse(loginResponse['data']['preUserProjectId'], + getListCourseResponse = WeiBanAPI.getListCourse(loginResponse['data']['normalUserProjectId'], '3', tenantCode) except BaseException: @@ -53,7 +53,7 @@ def main(): for i in getListCourseResponse['data']: print('\n----章节码:' + i['categoryCode'] + '章节内容:' + i['categoryName']) - NowClass = WeiBanAPI.GetList(loginResponse['data']['preUserProjectId'], + NowClass = WeiBanAPI.GetList(loginResponse['data']['normalUserProjectId'], i['categoryCode'], '3', tenantCode, @@ -65,9 +65,87 @@ def main(): print('已完成') else: print('发送完成请求') - WeiBanAPI.doStudy(loginResponse['data']['preUserProjectId'], j['resourceId'], tenantCode) + WeiBanAPI.doStudy(loginResponse['data']['normalUserProjectId'], j['resourceId'], tenantCode) WeiBanAPI.finishCourse(j['userCourseId'], tenantCode) + print("✔✔✔必修课已完成✔✔✔") + #选修课 + print("匹配课程开始!") + try: + getProgressResponse = WeiBanAPI.getProgress(loginResponse['data']['normalUserProjectId'], + tenantCode) + print('课程总数:' + str(getProgressResponse['data']['requiredNum']) + '\n' + + '完成课程:' + str(getProgressResponse['data']['requiredFinishedNum']) + '\n' + + '结束时间' + str(getProgressResponse['data']['endTime']) + '\n' + + '剩余天数' + str(getProgressResponse['data']['lastDays']) + ) + except BaseException: + print('解析课程进度失败,将尝试继续运行,请注意运行异常') + + # 请求课程列表 + try: + getListCourseResponse = WeiBanAPI.getListCourse(loginResponse['data']['normalUserProjectId'], + '1', + tenantCode) + except BaseException: + print('请求课程列表失败') + + print('解析课程列表并发送完成请求') + + for i in getListCourseResponse['data']: + print('\n----章节码:' + i['categoryCode'] + '章节内容:' + i['categoryName']) + NowClass = WeiBanAPI.GetList(loginResponse['data']['normalUserProjectId'], + i['categoryCode'], + '1', + tenantCode, + '') + for j in NowClass['data']: + print('课程内容:' + j['resourceName'] + '\nuserCourseId:' + j['userCourseId']) + + if (j['finished'] == 1): + print('已完成') + else: + print('发送完成请求') + WeiBanAPI.doStudy(loginResponse['data']['normalUserProjectId'], j['resourceId'], tenantCode) + WeiBanAPI.finishCourse(j['userCourseId'], tenantCode) + print("✔✔✔匹配课已完成✔✔✔") + print("选修课开始!") + try: + getProgressResponse = WeiBanAPI.getProgress(loginResponse['data']['normalUserProjectId'], + tenantCode) + print('课程总数:' + str(getProgressResponse['data']['requiredNum']) + '\n' + + '完成课程:' + str(getProgressResponse['data']['requiredFinishedNum']) + '\n' + + '结束时间' + str(getProgressResponse['data']['endTime']) + '\n' + + '剩余天数' + str(getProgressResponse['data']['lastDays']) + ) + except BaseException: + print('解析课程进度失败,将尝试继续运行,请注意运行异常') + + # 请求课程列表 + try: + getListCourseResponse = WeiBanAPI.getListCourse(loginResponse['data']['normalUserProjectId'], + '2', + tenantCode) + except BaseException: + print('请求课程列表失败') + print('解析课程列表并发送完成请求') + for i in getListCourseResponse['data']: + print('\n----章节码:' + i['categoryCode'] + '章节内容:' + i['categoryName']) + NowClass = WeiBanAPI.GetList(loginResponse['data']['normalUserProjectId'], + i['categoryCode'], + '2', + tenantCode, + '') + for j in NowClass['data']: + print('课程内容:' + j['resourceName'] + '\nuserCourseId:' + j['userCourseId']) + + if (j['finished'] == 1): + print('已完成') + else: + print('发送完成请求') + WeiBanAPI.doStudy(loginResponse['data']['normalUserProjectId'], j['resourceId'], tenantCode) + WeiBanAPI.finishCourse(j['userCourseId'], tenantCode) + print("✔✔✔选修课已完成✔✔✔") if __name__ == '__main__': main() From 5faf56191170c480f045716019d4f0ac6012bebb Mon Sep 17 00:00:00 2001 From: logend Date: Tue, 22 Dec 2020 15:28:27 +0800 Subject: [PATCH 2/9] supplement readme.md --- README.md | 9 ++++++--- main.py | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6ef9d0e..5d5611c 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,16 @@ update:2020.10.19 原项目作者已停止维护该项目[原项目地址](https://github.com/WeiYuanStudio/AutoWeiBan) 由我接手更新了一些API接口和优化了原项目运行效率 - +##更新 +修复报错,加入匹配课程、选修的课程学习 ## 使用方法 -1. 首先需要在运行设备上安装Python3运行环境 - +1. 首先需要在运行设备上安装Python3运行环境和requests库 +`pip intall requests` 2. 接着打开命令行操作界面,CD(Change Directory)到该脚本的目录下 3. 最后执行`python main.py` 或者 `python3 main.py`即可开始运行该脚本,按照指示使用即可。 ## 使用时请在main.py中将院校码修改为自己学校的院校码 +####补充:院校码可以在浏览器开发者工具中找到,如图 +![1.png](https://i.loli.net/2020/12/22/43JENwBjQIHiFqh.png) diff --git a/main.py b/main.py index cad3c4a..83e1b2c 100644 --- a/main.py +++ b/main.py @@ -4,7 +4,7 @@ import os # 兼容文件系统 import random -tenantCode = '4143010830' # 院校ID +tenantCode = '233333' # 院校ID def main(): From 4e4e4f540b961da09b63ee8c75e949f35231a044 Mon Sep 17 00:00:00 2001 From: 96368a <61831019+96368a@users.noreply.github.com> Date: Tue, 22 Dec 2020 15:33:38 +0800 Subject: [PATCH 3/9] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5d5611c..47fef13 100644 --- a/README.md +++ b/README.md @@ -14,5 +14,5 @@ update:2020.10.19 3. 最后执行`python main.py` 或者 `python3 main.py`即可开始运行该脚本,按照指示使用即可。 ## 使用时请在main.py中将院校码修改为自己学校的院校码 -####补充:院校码可以在浏览器开发者工具中找到,如图 +####补充:院校码可以在浏览器开发者工具中找到,如图 ![1.png](https://i.loli.net/2020/12/22/43JENwBjQIHiFqh.png) From 03cbbf065d15c724697c64f544d1d4aa91dc6ed4 Mon Sep 17 00:00:00 2001 From: 96368a <61831019+96368a@users.noreply.github.com> Date: Tue, 22 Dec 2020 15:35:56 +0800 Subject: [PATCH 4/9] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 47fef13..8e203bf 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,11 @@ update:2020.10.19 用requests库重写了一遍API库,大大提高了运行效率 +update:2020.12.22 +修复报错,加入匹配课程、选修的课程学习 原项目作者已停止维护该项目[原项目地址](https://github.com/WeiYuanStudio/AutoWeiBan) 由我接手更新了一些API接口和优化了原项目运行效率 -##更新 -修复报错,加入匹配课程、选修的课程学习 + ## 使用方法 1. 首先需要在运行设备上安装Python3运行环境和requests库 From f439acd641eb8dec4cf4d5c87b686b0c0c1c7350 Mon Sep 17 00:00:00 2001 From: 96368a <61831019+96368a@users.noreply.github.com> Date: Tue, 22 Dec 2020 15:36:17 +0800 Subject: [PATCH 5/9] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8e203bf..f54f95c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -update:2020.10.19 -用requests库重写了一遍API库,大大提高了运行效率 -update:2020.12.22 -修复报错,加入匹配课程、选修的课程学习 +update:2020.10.19 +用requests库重写了一遍API库,大大提高了运行效率 +update:2020.12.22 +修复报错,加入匹配课程、选修的课程学习 原项目作者已停止维护该项目[原项目地址](https://github.com/WeiYuanStudio/AutoWeiBan) 由我接手更新了一些API接口和优化了原项目运行效率 From 4a0501d55a6bae8cba60462da40e610dcead1016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E6=9C=AB?= Date: Sat, 10 Apr 2021 17:42:04 +0800 Subject: [PATCH 6/9] =?UTF-8?q?=E5=A2=9E=E5=8A=A02021=E6=98=A5=E5=AD=A3?= =?UTF-8?q?=E8=AF=BE=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 24 +++++---- WeiBanAPI.py | 12 +++++ __pycache__/WeiBanAPI.cpython-39.pyc | Bin 0 -> 4132 bytes main_2021-4.py | 73 +++++++++++++++++++++++++++ main.py => old/main_2020.10.py | 0 5 files changed, 100 insertions(+), 9 deletions(-) create mode 100644 __pycache__/WeiBanAPI.cpython-39.pyc create mode 100644 main_2021-4.py rename main.py => old/main_2020.10.py (100%) diff --git a/README.md b/README.md index f54f95c..dbadaa6 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,25 @@ -update:2020.10.19 -用requests库重写了一遍API库,大大提高了运行效率 -update:2020.12.22 -修复报错,加入匹配课程、选修的课程学习 +# 说明 +> 本脚本为安全微伴辅助学习脚本,嗯,懂得都懂 + +> 本项目Fork自[该项目](https://github.com/WeiYuanStudio/AutoWeiBan) + -原项目作者已停止维护该项目[原项目地址](https://github.com/WeiYuanStudio/AutoWeiBan) -由我接手更新了一些API接口和优化了原项目运行效率 ## 使用方法 1. 首先需要在运行设备上安装Python3运行环境和requests库 `pip intall requests` -2. 接着打开命令行操作界面,CD(Change Directory)到该脚本的目录下 - -3. 最后执行`python main.py` 或者 `python3 main.py`即可开始运行该脚本,按照指示使用即可。 +2. 使用python自带的IDLE编辑运行目录下的main.py +3. 依据脚本提示二维码登录即可 ## 使用时请在main.py中将院校码修改为自己学校的院校码 ####补充:院校码可以在浏览器开发者工具中找到,如图 ![1.png](https://i.loli.net/2020/12/22/43JENwBjQIHiFqh.png) + +#### 更新日志: +> 2021.4.10 +增加2021春季课程 +旧脚本移至old文件夹 +2020.12.22 +fork[该项目](https://github.com/WeiYuanStudio/AutoWeiBan) +修复报错,加入匹配课程、选修的课程学习 \ No newline at end of file diff --git a/WeiBanAPI.py b/WeiBanAPI.py index 3b75ea3..3c825a1 100644 --- a/WeiBanAPI.py +++ b/WeiBanAPI.py @@ -31,6 +31,7 @@ loginStatusURL = 'https://weiban.mycourse.cn/pharos/login/barCodeWebAutoLogin.do' # 用于二维码登录刷新登录状态 +getStudyTaskURL = 'https://weiban.mycourse.cn/pharos/index/getStudyTask.do' # 二维码登录 def qrLogin(): @@ -41,6 +42,8 @@ def qrLogin(): responseText = getLoginStatus(qrCodeID) responseJSON = json.loads(responseText) if responseJSON['code'] == '0': + responseInfo = getStudyTask(responseJSON['data']['userId'],responseJSON['data']['tenantCode']) + responseJSON['data']['normalUserProjectId']=responseInfo['data']['userProjectId'] return responseJSON else: print('未登录,等待后5s刷新') @@ -48,6 +51,15 @@ def qrLogin(): except KeyboardInterrupt: print('用户中止程序运行') +def getStudyTask(userId, tenantCode): + print('开始请求最新课程: ') + param = { + 'userId': userId, + 'tenantCode': tenantCode + } + req = requests.post(url=getStudyTaskURL, data=param) + responseJSON = json.loads(req.text) + return responseJSON # 获取学生信息 def getStuInfo(userId, tenantCode): diff --git a/__pycache__/WeiBanAPI.cpython-39.pyc b/__pycache__/WeiBanAPI.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffc22784745238c6b0bb12992aadc9bfe66e202b GIT binary patch literal 4132 zcmb_f-ESOM6`wm_J6^B9^5xk1a+9{OlzNRwT53$GYXdR_6XHaHktG=Ko!D#d&aCgf z+h)yLDg>m4rX)fX2`LXYFVvvWA|VB}rM&Vt%qz8>Jn>${$M4*+H*4&~RAN?h?!7bj z+_}GVe&^h?K}Sc{z%{b4`2A-N8phvf(0Z8|yo6i+6@nX_m5mDX8Kb^gHhojKmT&3S z_HErdzN1^$ce&+faC_YL+qmOrx$C#{jGyD4-@)7bPM-Cbe1JcJ z_5?r8&!9cYpX5)WJ;lu_BmeXRpfU0+ajJok;p78`;nL|jrK)ncP>b4rCy9{ zcs*E*3TF!Cc(xQR4LxQ~buJLGOedytkjG1f{WU7}!fdD}qN_0}ys*DQRmAgQQ5ED| z{OSb}&x%k=QXSb}wI)N6!YY(YQjG;FoQ*}Dw1+>rc4{B!KKF@qua=^coTG1^-Cs`| zz952#PgH{0khIS2uhoK6sv6e-zq-F#`mxzCdN~kdF%R`8MO5^J|F8yye#7;bqRLK)YMWn*bx zv4(M-Ei+}VSPizymd%FASs&tc!4$r-F|shS`;4ug(`Q^am#v1SpS#WHnGwvmVoVvz z;ofz`ymD7EyloY|Mem9c_1lK>>OW-${V*p>bG~at<`A+2qO5%~v5T-_!iEx?2P#Nh z^2!8HvMP*%NRfe)4tfR>6QS|yU=)i=P`=#yuyz9QHtzg(^H=Y$|M{)Ie{gg2?v3>i zf3kl2XXoVl>-RQ(`R)S;Gipa6Hh=N<#_RV!`qSNwyT9Ii`;GPYZr%UO?fa`Y^KD5R z%=zt$`lFrbYIjVjK-FYo&&xPUoN^p+ndDl{juatEkxFb;s)UIn%VAhedcG0XXW~Hc ziAaS))T%0PC*ESpm~lUcc&x^e3@?S(RMH%Med=4258qL^uNk5jd;a(G4o5sJJ>k8sW3gBHpi-%HcGzXsjGac|Ht8RElP&uY{$SgJ|@^#9+0aWEO=6 z^%T~WWDJA3rfGUC%W|xr9m2?C-RO%xyem>}-@eFx#3;?CA#@aSJ^8a?G#EGUn9HVO z^QN+hGjD<|%3g6A*1QXT*$o@swkK=-&|ClDwe{b;asQor8-MuG#+}#ToBQv42uBPL zteGN%34%zwW+qlml!c3aJ|lY2B%TNtYoS!|Mm3fy>1uVu<%{PJKO$8Z3bVEFcThby1^GuVO|8nh4G6uc-{~Loo+iHxIm>X}syYc4l z1zAcQgV+Kuh~eTSM3M#U$)FPMKr9C6{Szd10@KrxBZy6-c)b@sqQj%{eHw4IlbLq1 zF^|LnC!5;I)`|@$J548BlX+9L(Kg77DFU};^AuOx2hwf;d8bA9G%aw3#2)@i+FKU- zCML-ogwg7?PhniN=;_u)TxwGIGZ+vmAYpeb&^5(nX?}K5kR1)#)sS5cIn&6bkW+Ugx#Ct4K&eqQx1HD#Xt>+QL{P%N z2XZe({tR~Wa2@ek8b00znXjd5&S0uM0HIw?_?h_+H=`{;7 zwUjxJT*b{^qha+L$X&=+%7OD;%5M6cvO(%3N5@d=(h08J_A&eN8WYE{E`roVrf&5eijRS@0Fm8G?!BUzk)f}x>gL09kkCP zgNw6xTExBMB3@`KP%2Y~Vk@A%vQ~i_o;D{1)wejJI%WbHj)&!-eu+*qmx`*m;%BI( zL+()eK+hNtUnvEu6h|!?M{k!BTSBD0sI_UOIvzHs<4u{SE(3N$oXfmt-TVppuBtox77b5ah&Fu$Br`n zyhya$zASW_>6xO6qfRYRotma*R2evOaP-VuIy;FkVovI5y9GdJnX2ftY$FH*n1$SZ zm?l$%4uQbf>s zE$Da?l=KDVJstKsv@{j9b@l%D3{G#P67yO)e39%g={w|`e%7PUb~mWo%K3! I+vvCb2X(XV)&Kwi literal 0 HcmV?d00001 diff --git a/main_2021-4.py b/main_2021-4.py new file mode 100644 index 0000000..6b722a3 --- /dev/null +++ b/main_2021-4.py @@ -0,0 +1,73 @@ +import WeiBanAPI +import json +import time # time.sleep延时 +import os # 兼容文件系统 +import random + +tenantCode = '23333' # 院校ID + + +def main(): + loginResponse = WeiBanAPI.qrLogin() + + try: + print('登录成功,userName:' + loginResponse['data']['userName']) + except BaseException: + print('登录失败') + print(loginResponse) # TODO: 这里的loginResponse调用没有考虑网络错误等问题 + exit(0) + + # 请求解析并打印用户信息 + try: + print('请求用户信息') + stuInfoResponse = WeiBanAPI.getStuInfo(loginResponse['data']['userId'], + tenantCode) + print('用户信息:' + stuInfoResponse['data']['realName'] + '\n' + + stuInfoResponse['data']['orgName'] + + stuInfoResponse['data']['specialtyName'] + ) + except BaseException: + print('解析用户信息失败,将尝试继续运行,请注意运行异常') + + # 请求课程完成进度 + try: + getProgressResponse = WeiBanAPI.getProgress(loginResponse['data']['normalUserProjectId'], + tenantCode) + print('课程总数:' + str(getProgressResponse['data']['requiredNum']) + '\n' + + '完成课程:' + str(getProgressResponse['data']['requiredFinishedNum']) + '\n' + + '结束时间' + str(getProgressResponse['data']['endTime']) + '\n' + + '剩余天数' + str(getProgressResponse['data']['lastDays']) + ) + except BaseException: + print('解析课程进度失败,将尝试继续运行,请注意运行异常') + + # 请求课程列表 + try: + getListCourseResponse = WeiBanAPI.getListCourse(loginResponse['data']['normalUserProjectId'], + '3', + tenantCode) + except BaseException: + print('请求课程列表失败') + + print('解析课程列表并发送完成请求') + + for i in getListCourseResponse['data']: + print('\n----章节码:' + i['categoryCode'] + '章节内容:' + i['categoryName']) + NowClass = WeiBanAPI.GetList(loginResponse['data']['normalUserProjectId'], + i['categoryCode'], + '3', + tenantCode, + '') + for j in NowClass['data']: + print('课程内容:' + j['resourceName'] + '\nuserCourseId:' + j['userCourseId']) + + if (j['finished'] == 1): + print('已完成') + else: + print('发送完成请求') + WeiBanAPI.doStudy(loginResponse['data']['normalUserProjectId'], j['resourceId'], tenantCode) + WeiBanAPI.finishCourse(j['userCourseId'], tenantCode) + print("✔✔✔必修课已完成✔✔✔") + +if __name__ == '__main__': + main() diff --git a/main.py b/old/main_2020.10.py similarity index 100% rename from main.py rename to old/main_2020.10.py From 6c55d1f74ea8c60b83482d199eabbef61325091b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E6=9C=AB?= Date: Sat, 10 Apr 2021 17:45:35 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E5=A2=9E=E5=8A=A02021=E6=98=A5=E5=AD=A3?= =?UTF-8?q?=E8=AF=BE=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index dbadaa6..437e8ba 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,11 @@ #### 更新日志: > 2021.4.10 增加2021春季课程 + 旧脚本移至old文件夹 + 2020.12.22 + fork[该项目](https://github.com/WeiYuanStudio/AutoWeiBan) + 修复报错,加入匹配课程、选修的课程学习 \ No newline at end of file From 275cc92485198abe2eb891888a379400cf7cdfdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E6=9C=AB?= Date: Sat, 10 Apr 2021 17:47:58 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E5=A2=9E=E5=8A=A02021=E6=98=A5=E5=AD=A3?= =?UTF-8?q?=E8=AF=BE=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/WeiBanAPI.cpython-39.pyc | Bin 4132 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 __pycache__/WeiBanAPI.cpython-39.pyc diff --git a/__pycache__/WeiBanAPI.cpython-39.pyc b/__pycache__/WeiBanAPI.cpython-39.pyc deleted file mode 100644 index ffc22784745238c6b0bb12992aadc9bfe66e202b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4132 zcmb_f-ESOM6`wm_J6^B9^5xk1a+9{OlzNRwT53$GYXdR_6XHaHktG=Ko!D#d&aCgf z+h)yLDg>m4rX)fX2`LXYFVvvWA|VB}rM&Vt%qz8>Jn>${$M4*+H*4&~RAN?h?!7bj z+_}GVe&^h?K}Sc{z%{b4`2A-N8phvf(0Z8|yo6i+6@nX_m5mDX8Kb^gHhojKmT&3S z_HErdzN1^$ce&+faC_YL+qmOrx$C#{jGyD4-@)7bPM-Cbe1JcJ z_5?r8&!9cYpX5)WJ;lu_BmeXRpfU0+ajJok;p78`;nL|jrK)ncP>b4rCy9{ zcs*E*3TF!Cc(xQR4LxQ~buJLGOedytkjG1f{WU7}!fdD}qN_0}ys*DQRmAgQQ5ED| z{OSb}&x%k=QXSb}wI)N6!YY(YQjG;FoQ*}Dw1+>rc4{B!KKF@qua=^coTG1^-Cs`| zz952#PgH{0khIS2uhoK6sv6e-zq-F#`mxzCdN~kdF%R`8MO5^J|F8yye#7;bqRLK)YMWn*bx zv4(M-Ei+}VSPizymd%FASs&tc!4$r-F|shS`;4ug(`Q^am#v1SpS#WHnGwvmVoVvz z;ofz`ymD7EyloY|Mem9c_1lK>>OW-${V*p>bG~at<`A+2qO5%~v5T-_!iEx?2P#Nh z^2!8HvMP*%NRfe)4tfR>6QS|yU=)i=P`=#yuyz9QHtzg(^H=Y$|M{)Ie{gg2?v3>i zf3kl2XXoVl>-RQ(`R)S;Gipa6Hh=N<#_RV!`qSNwyT9Ii`;GPYZr%UO?fa`Y^KD5R z%=zt$`lFrbYIjVjK-FYo&&xPUoN^p+ndDl{juatEkxFb;s)UIn%VAhedcG0XXW~Hc ziAaS))T%0PC*ESpm~lUcc&x^e3@?S(RMH%Med=4258qL^uNk5jd;a(G4o5sJJ>k8sW3gBHpi-%HcGzXsjGac|Ht8RElP&uY{$SgJ|@^#9+0aWEO=6 z^%T~WWDJA3rfGUC%W|xr9m2?C-RO%xyem>}-@eFx#3;?CA#@aSJ^8a?G#EGUn9HVO z^QN+hGjD<|%3g6A*1QXT*$o@swkK=-&|ClDwe{b;asQor8-MuG#+}#ToBQv42uBPL zteGN%34%zwW+qlml!c3aJ|lY2B%TNtYoS!|Mm3fy>1uVu<%{PJKO$8Z3bVEFcThby1^GuVO|8nh4G6uc-{~Loo+iHxIm>X}syYc4l z1zAcQgV+Kuh~eTSM3M#U$)FPMKr9C6{Szd10@KrxBZy6-c)b@sqQj%{eHw4IlbLq1 zF^|LnC!5;I)`|@$J548BlX+9L(Kg77DFU};^AuOx2hwf;d8bA9G%aw3#2)@i+FKU- zCML-ogwg7?PhniN=;_u)TxwGIGZ+vmAYpeb&^5(nX?}K5kR1)#)sS5cIn&6bkW+Ugx#Ct4K&eqQx1HD#Xt>+QL{P%N z2XZe({tR~Wa2@ek8b00znXjd5&S0uM0HIw?_?h_+H=`{;7 zwUjxJT*b{^qha+L$X&=+%7OD;%5M6cvO(%3N5@d=(h08J_A&eN8WYE{E`roVrf&5eijRS@0Fm8G?!BUzk)f}x>gL09kkCP zgNw6xTExBMB3@`KP%2Y~Vk@A%vQ~i_o;D{1)wejJI%WbHj)&!-eu+*qmx`*m;%BI( zL+()eK+hNtUnvEu6h|!?M{k!BTSBD0sI_UOIvzHs<4u{SE(3N$oXfmt-TVppuBtox77b5ah&Fu$Br`n zyhya$zASW_>6xO6qfRYRotma*R2evOaP-VuIy;FkVovI5y9GdJnX2ftY$FH*n1$SZ zm?l$%4uQbf>s zE$Da?l=KDVJstKsv@{j9b@l%D3{G#P67yO)e39%g={w|`e%7PUb~mWo%K3! I+vvCb2X(XV)&Kwi From 343b3e2e114abc5c9d09d530b9e687651e002b63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E6=9C=AB?= Date: Tue, 26 Oct 2021 19:41:05 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=F0=9F=A4=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 + WeiBanAPI.py | 306 ++++++++++++++------------- main.py | 75 +++++++ main_2021-4.py => old/main_2021-4.py | 0 4 files changed, 234 insertions(+), 151 deletions(-) create mode 100644 main.py rename main_2021-4.py => old/main_2021-4.py (100%) diff --git a/README.md b/README.md index 437e8ba..2f7a08e 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,10 @@ ![1.png](https://i.loli.net/2020/12/22/43JENwBjQIHiFqh.png) #### 更新日志: +> 2021.10.26 +修复请求接口,更改请求延迟 +(安全微伴疑似检测请求间隔) + > 2021.4.10 增加2021春季课程 diff --git a/WeiBanAPI.py b/WeiBanAPI.py index 3c825a1..a1d3e3c 100644 --- a/WeiBanAPI.py +++ b/WeiBanAPI.py @@ -1,151 +1,155 @@ -from urllib import parse -import json -import random -import time -import requests -import os - -baseDelayTime = 1 # 基础延时秒数 - -randomDelayDeviation = 1 # 叠加随机延时差 - -getCookiesURL = 'https://weiban.mycourse.cn/#/login' # 请求Cookies URL - -loginURL = 'https://weiban.mycourse.cn/pharos/login/login.do' # 登录请求 URL - -getNameURL = 'https://weiban.mycourse.cn/pharos/my/getInfo.do' # 请求姓名 URL - -getProgressURL = 'https://weiban.mycourse.cn/pharos/project/showProgress.do' # 请求进度 URL - -getListCourseURL = 'https://weiban.mycourse.cn/pharos/usercourse/listCategory.do' # 请求课程种类 URL - -getListURL = 'https://weiban.mycourse.cn/pharos/usercourse/listCourse.do' # 请求课程列表URL - -finishCourseURL = 'https://weiban.mycourse.cn/pharos/usercourse/finish.do' # 请求完成课程URL - -getRandImageURL = 'https://weiban.mycourse.cn/pharos/login/randImage.do' # 验证码URL - -doStudyURL = 'https://weiban.mycourse.cn/pharos/usercourse/study.do' # 学习课程URL - -genQRCodeURL = 'https://weiban.mycourse.cn/pharos/login/genBarCodeImageAndCacheUuid.do' # 获取验证码以及验证码ID URL - -loginStatusURL = 'https://weiban.mycourse.cn/pharos/login/barCodeWebAutoLogin.do' # 用于二维码登录刷新登录状态 - -getStudyTaskURL = 'https://weiban.mycourse.cn/pharos/index/getStudyTask.do' - -# 二维码登录 -def qrLogin(): - qrCodeID = getQRCode() - - try: - while True: - responseText = getLoginStatus(qrCodeID) - responseJSON = json.loads(responseText) - if responseJSON['code'] == '0': - responseInfo = getStudyTask(responseJSON['data']['userId'],responseJSON['data']['tenantCode']) - responseJSON['data']['normalUserProjectId']=responseInfo['data']['userProjectId'] - return responseJSON - else: - print('未登录,等待后5s刷新') - time.sleep(5) - except KeyboardInterrupt: - print('用户中止程序运行') - -def getStudyTask(userId, tenantCode): - print('开始请求最新课程: ') - param = { - 'userId': userId, - 'tenantCode': tenantCode - } - req = requests.post(url=getStudyTaskURL, data=param) - responseJSON = json.loads(req.text) - return responseJSON - -# 获取学生信息 -def getStuInfo(userId, tenantCode): - print('开始请求用户数据') - param = { - 'userId': userId, - 'tenantCode': tenantCode - } - req = requests.post(url=getNameURL, data=param) - responseJSON = json.loads(req.text) - return responseJSON - - -# 获取课程进度 -def getProgress(userProjectId, tenantCode): - param = { - 'userProjectId': userProjectId, - 'tenantCode': tenantCode - } - req = requests.post(url=getProgressURL, data=param) - responseJSON = json.loads(req.text) - return responseJSON - - -# 获取课程列表 -def getListCourse(userProjectId, chooseType, tenantCode): - param = { - 'userProjectId': userProjectId, - 'chooseType': chooseType, - 'tenantCode': tenantCode, - } - req = requests.post(url=getListCourseURL, data=param) - responseJSON = json.loads(req.text) - return responseJSON - -def GetList(userProjectId, categoryCode ,chooseType, tenantCode, name): - param = { - 'userProjectId': userProjectId, - 'categoryCode': categoryCode, - 'chooseType': chooseType, - 'tenantCode': tenantCode, - 'name': name - } - req = requests.post(url=getListURL, data=param) - responseJSON = json.loads(req.text) - return responseJSON - -# 完成课程请求 -def finishCourse(userCourseId, tenantCode): - param = { - 'userCourseId': userCourseId, - 'tenantCode': tenantCode, - } - url_values = parse.urlencode(param) # GET请求URL参数 - req = requests.get(url=finishCourseURL + '?' + url_values) - print(req.text) - - -def getRandomTime(): - return baseDelayTime + random.randint(0, randomDelayDeviation) - - -def doStudy(userProjectId, userCourseId, tenantCode): - param = { - 'userProjectId': userProjectId, - 'courseId': userCourseId, - 'tenantCode': tenantCode - } - req = requests.post(url=doStudyURL, data=param) - print(req.text) - return - - -# 获取并返回QRCode 链接以及 QRCode ID -def getQRCode(): - req = requests.post(url=genQRCodeURL) - responseJSON = json.loads(req.text) - print('请扫描二维码登录') - os.system('explorer {}'.format(responseJSON['data']['imagePath'])) - return responseJSON['data']['barCodeCacheUserId'] - - -# 用于二维码登录,刷新是否已经成功登录 -def getLoginStatus(qrCodeID): - param = { - 'barCodeCacheUserId': qrCodeID - } - req = requests.post(url=loginStatusURL, data=param) - return req.text +from urllib import parse +import json +import random +import time +import requests +import os + +baseDelayTime = 20 # 基础延时秒数 + +randomDelayDeviation = 20 # 叠加随机延时差 + +getCookiesURL = 'https://weiban.mycourse.cn/#/login' # 请求Cookies URL + +loginURL = 'https://weiban.mycourse.cn/pharos/login/login.do' # 登录请求 URL + +getNameURL = 'https://weiban.mycourse.cn/pharos/my/getInfo.do' # 请求姓名 URL + +getProgressURL = 'https://weiban.mycourse.cn/pharos/project/showProgress.do' # 请求进度 URL + +getListCourseURL = 'https://weiban.mycourse.cn/pharos/usercourse/listCategory.do' # 请求课程种类 URL + +getListURL = 'https://weiban.mycourse.cn/pharos/usercourse/listCourse.do' # 请求课程列表URL + +finishCourseURL = 'https://weiban.mycourse.cn/pharos/usercourse/finish.do' # 请求完成课程URL + +getRandImageURL = 'https://weiban.mycourse.cn/pharos/login/randImage.do' # 验证码URL + +doStudyURL = 'https://weiban.mycourse.cn/pharos/usercourse/study.do' # 学习课程URL + +genQRCodeURL = 'https://weiban.mycourse.cn/pharos/login/genBarCodeImageAndCacheUuid.do' # 获取验证码以及验证码ID URL + +loginStatusURL = 'https://weiban.mycourse.cn/pharos/login/barCodeWebAutoLogin.do' # 用于二维码登录刷新登录状态 + +getStudyTaskURL = 'https://weiban.mycourse.cn/pharos/index/getStudyTask.do' + +# 二维码登录 +def qrLogin(): + qrCodeID = getQRCode() + + try: + while True: + responseText = getLoginStatus(qrCodeID) + responseJSON = json.loads(responseText) + if responseJSON['code'] == '0': + responseInfo = getStudyTask(responseJSON['data']['userId'],responseJSON['data']['tenantCode']) + responseJSON['data']['normalUserProjectId']=responseInfo['data']['userProjectId'] + return responseJSON + else: + print('未登录,等待后5s刷新') + time.sleep(5) + except KeyboardInterrupt: + print('用户中止程序运行') + +def getStudyTask(userId, tenantCode): + print('开始请求最新课程: ') + param = { + 'userId': userId, + 'tenantCode': tenantCode + } + req = requests.post(url=getStudyTaskURL, data=param) + responseJSON = json.loads(req.text) + return responseJSON + +# 获取学生信息 +def getStuInfo(userId, tenantCode): + print('开始请求用户数据') + param = { + 'userId': userId, + 'tenantCode': tenantCode + } + req = requests.post(url=getNameURL, data=param) + responseJSON = json.loads(req.text) + return responseJSON + + +# 获取课程进度 +def getProgress(userProjectId, tenantCode): + param = { + 'userProjectId': userProjectId, + 'tenantCode': tenantCode + } + req = requests.post(url=getProgressURL, data=param) + responseJSON = json.loads(req.text) + return responseJSON + + +# 获取课程列表 +def getListCourse(userProjectId, chooseType, tenantCode): + param = { + 'userProjectId': userProjectId, + 'chooseType': chooseType, + 'tenantCode': tenantCode, + } + req = requests.post(url=getListCourseURL, data=param) + responseJSON = json.loads(req.text) + return responseJSON + +def GetList(userProjectId, categoryCode ,chooseType, tenantCode, name): + param = { + 'userProjectId': userProjectId, + 'categoryCode': categoryCode, + 'chooseType': chooseType, + 'tenantCode': tenantCode, + 'name': name + } + req = requests.post(url=getListURL, data=param) + responseJSON = json.loads(req.text) + return responseJSON + +# 完成课程请求 +def finishCourse(userCourseId, tenantCode): + param = { + 'callback':'jQuery0000', + 'userCourseId': userCourseId, + 'tenantCode': tenantCode, + '_': '1628328773' + } + url_values = parse.urlencode(param) # GET请求URL参数 + req = requests.get(url=finishCourseURL + '?' + url_values) + print(req.text) + + +def getRandomTime(): + return baseDelayTime + random.randint(0, randomDelayDeviation) + + +def doStudy(userProjectId, userCourseId, tenantCode,userId,token): + param = { + 'userProjectId': userProjectId, + 'courseId': userCourseId, + 'tenantCode': tenantCode, + 'userId': userId, + 'token': token + } + req = requests.post(url=doStudyURL, data=param) + print(req.text) + return + + +# 获取并返回QRCode 链接以及 QRCode ID +def getQRCode(): + req = requests.post(url=genQRCodeURL) + responseJSON = json.loads(req.text) + print('请扫描二维码登录') + os.system('explorer {}'.format(responseJSON['data']['imagePath'])) + return responseJSON['data']['barCodeCacheUserId'] + + +# 用于二维码登录,刷新是否已经成功登录 +def getLoginStatus(qrCodeID): + param = { + 'barCodeCacheUserId': qrCodeID + } + req = requests.post(url=loginStatusURL, data=param) + return req.text diff --git a/main.py b/main.py new file mode 100644 index 0000000..1921c7e --- /dev/null +++ b/main.py @@ -0,0 +1,75 @@ +import WeiBanAPI +import json +import time # time.sleep延时 +import os # 兼容文件系统 +import random + +tenantCode = '23333' # 院校ID + + +def main(): + loginResponse = WeiBanAPI.qrLogin() + + try: + print('登录成功,userName:' + loginResponse['data']['userName']) + except BaseException: + print('登录失败') + print(loginResponse) # TODO: 这里的loginResponse调用没有考虑网络错误等问题 + exit(0) + + # 请求解析并打印用户信息 + try: + print('请求用户信息') + stuInfoResponse = WeiBanAPI.getStuInfo(loginResponse['data']['userId'], + tenantCode) + print('用户信息:' + stuInfoResponse['data']['realName'] + '\n' + + stuInfoResponse['data']['orgName'] + + stuInfoResponse['data']['specialtyName'] + ) + except BaseException: + print('解析用户信息失败,将尝试继续运行,请注意运行异常') + + # 请求课程完成进度 + try: + getProgressResponse = WeiBanAPI.getProgress(loginResponse['data']['normalUserProjectId'], + tenantCode) + print('课程总数:' + str(getProgressResponse['data']['requiredNum']) + '\n' + + '完成课程:' + str(getProgressResponse['data']['requiredFinishedNum']) + '\n' + + '结束时间' + str(getProgressResponse['data']['endTime']) + '\n' + + '剩余天数' + str(getProgressResponse['data']['lastDays']) + ) + except BaseException: + print('解析课程进度失败,将尝试继续运行,请注意运行异常') + + # 请求课程列表 + try: + getListCourseResponse = WeiBanAPI.getListCourse(loginResponse['data']['normalUserProjectId'], + '3', + tenantCode) + except BaseException: + print('请求课程列表失败') + + print('解析课程列表并发送完成请求') + + for i in getListCourseResponse['data']: + print('\n----章节码:' + i['categoryCode'] + '章节内容:' + i['categoryName']) + NowClass = WeiBanAPI.GetList(loginResponse['data']['normalUserProjectId'], + i['categoryCode'], + '3', + tenantCode, + '') + for j in NowClass['data']: + print('课程内容:' + j['resourceName'] + '\nuserCourseId:' + j['userCourseId']) + + if (j['finished'] == 1): + print('已完成') + else: + print('发送完成请求') + WeiBanAPI.doStudy(loginResponse['data']['normalUserProjectId'], j['resourceId'], tenantCode,loginResponse['data']['userId'],loginResponse['data']['token']) + time.sleep(WeiBanAPI.getRandomTime()) + WeiBanAPI.finishCourse(j['userCourseId'], tenantCode) + print("✔✔✔必修课已完成✔✔✔") + + +if __name__ == '__main__': + main() diff --git a/main_2021-4.py b/old/main_2021-4.py similarity index 100% rename from main_2021-4.py rename to old/main_2021-4.py