前言
本文主要针对长江雨课堂中,考试后老师禁止查看试卷和答案这一问题,提供一种合理且快捷的获取方法。 通过使用Python及其相关第三方库,能够轻易地获取禁止查看的试卷的题目+标准答案+我的答案+分析,适合的题型范围包括选择题、填空题、判断题、问答题。
温馨提示: 友情告诫各位读者,切莫将本文所讲解的方法用于不正当竞争以及舞弊行为。否则,所造成的一切后果与本平台无关、与本文无关、与编者无关。一切解释权仅归编者所有。
提示:以下是本篇文章正文内容,下面案例仅供参考与学习
一、程序实现效果视频展示
视频网址:https://www.hfutblog.com/jiami/demo.mp4
二、长江雨课堂简介
长江雨课堂属于雨课堂系列教学产品,由学堂在线与清华大学在线教育办公室共同研发,旨在连接师生的智能终端,将课前-课上-课后的每一个环节都赋予全新的体验,最大限度地释放教与学的能量,推动教学改革。长江雨课堂将复杂的信息技术手段融入到PowerPoint和微信,在课外预习与课堂教学间建立沟通桥梁,让课堂互动永不下线。使用长江雨课堂,教师可以将带有MOOC视频、习题、语音的课前预习课件推送到学生手机,师生沟通及时反馈;课堂上实时答题、弹幕互动,为传统课堂教学师生互动提供了完美解决方案。长江雨课堂科学地覆盖了课前-课上-课后的每一个教学环节,为师生提供完整立体的数据支持,个性化报表、自动任务提醒,让教与学更明了。
网址:https://changjiang.yuketang.cn/
你以为我在为长江雨课堂打广告??? 俗话说知己知彼,方能百战不殆。所以我们要对长江雨课堂有一个大概了解,我们才能在学习中驾驭这款教学产品,为我们的学习提供极大的简便和帮助。在此,读者需要对长江雨课堂的登录方式有一个大概的了解,才能把我为大家提供的方法驾驭好。
长江雨课堂有四种登录方式:扫码登录、手机登录、短信登录、邮箱登录。这些登录方式都有一个共同的特点----依赖cookie和session。而程序需要读者的cookie和session信息来进行登录,从而进行后续相关操作。编者提供的程序中为大家提供以下两种登录方式:
方式一:
手机号+密码(加密后)登录。在if name == ‘main’:之后的代码中找到tel与pwd字段,并修改为相应的值。
考虑到加密后的密码需要使用抓包工具(如:Fiddler)来获取,使用较为麻烦。为了方便大家使用,本人研究了长江雨课堂的密码加密机制,为RSA加密。在此,本人为大家提供了一个获取加密后密码的平台(为编者提供,安全可靠)
获取加密后密码平台网址:https://www.hfutblog.com/jiami/rainlogin.html
tel = "你的注册电话号码"
pwd = "你的加密后的密码"
cookieStr = login(tel,pwd)
#如:
tel = "199****8888"
pwd = "jEfv/7abc7aOqcyxDwgmloBaO3mqMIA1zFHsx7y9mMwW+oUA7/OOxPYZWQIcZRa4ZwBbUC0uhD3gnbuP41DDA+T98/c/sodbcLLXmEmX7buhFOt9bfl1SwT8OlV/f1Yd1k5nNipeku8vV0c9o2IKdpvmONbDKHj2Z6X0QfONUvk="
cookieStr = login(tel,pwd)
方式二:
获取cookie登录。在运行程序时输入0即可通过cookie按照程序提示进行登录。
获取csrftoken和sessionid字段的方法如下:
步骤一:在长江雨课堂网页版登录长江雨课堂。(可以通过上文见过的四种方式登录)
步骤二:登录后,按“F12”键打开开发者工具。打开后点击Network,然后刷新一下页面,找到并点击index。在右侧栏目中找到cookie。然后cookie中会包括csrftoken和sessionid字段的值,复制即可。
两种方式对比:
方式一:这种登录方法长久有效,账户信息不变时不需要再次修改或更新。
方式二:这种登录方法有时效性,需要及时更新cookieinfo[‘csrftoken’]和cookieinfo[‘sessionid’]的值。
三、需求简介
老师发布试卷时设置了“交卷后不可查看”,十分不利于学习和交流,以及进一步操作。
通过本人写的python程序,可以十分便捷地获取题目图片以及答案等相关试卷信息。
四、程序简介
所需第三方库
程序需要的Python第三方库和包有base64、time、json、re、requests、os、urllib.request。其中,base64、time、json、re、os库均为python自带的第三方库,不需要额外安装。点击查看如何安装第三方库。
import base64
import time
import json
import re
import requests
import os
import urllib.request
程序部分函数
以下只写出程序中主要的功能函数:
函数一: 登录函数login()和smlogin()
login() 函数的作用是通过POST提交手机号和加密以后的密码进行登录,获取用户的session信息,使程序维持登录的状态,是后续功能的基础。smlogin() 函数的作用是用户直接输入session信息,使程序维持登录的状态。这两种函数只需任意执行一个,即可完成程序保持登录。
def login(tel,pwd):
url = 'https://changjiang.yuketang.cn/pc/login/verify_pwd_login/'
data = {
"type":"PP",
"name":tel,
"pwd":pwd
}
headers={
'Connection': 'keep-alive',
'Content-Language':'zh-cn',
'Content-Type': 'text/html; charset=utf-8',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Host': 'changjiang.yuketang.cn',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Mobile Safari/537.36'
}
try:
session = requests.session()
cookie_jar = session.post(url=url,json=data,headers=headers,verify=False).cookies
cookie_t = requests.utils.dict_from_cookiejar(cookie_jar)
cookieStr = "csrftoken=" + cookie_t['csrftoken'] + ";" + "sessionid=" + cookie_t['sessionid']
return cookieStr
except:
return False
def smlogin(cookieinfo):
try:
cookie_t = cookieinfo
cookieStr = "csrftoken=" + cookie_t['csrftoken'] + ";" + "sessionid=" + cookie_t['sessionid']
return cookieStr
except:
return False
函数二: 查找课程信息函数showCourse()
该函数的作用是通过GET获取用户在长江雨课堂的课程信息。
def showCourse(cookieStr):
cookie = cookieStr
url = "https://changjiang.yuketang.cn/v/course_meta/my_courses?_date="
curtime = "{0:.3f}".format(float(time.time())).replace(".","")
url += curtime
try:
headers={
'accept':'*/*',
'accept-language':'zh-CN,zh;q=0.9',
'connection':'keep-alive',
'referer':url,
'Cookie': cookie,
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
response = requests.get(url=url,headers=headers,verify=False)
courseinfo = response.json()
return courseinfo['data']['classrooms']
except:
return False
函数三: 查找课程信息函数getDetailQuery()
该函数的作用是通过GET获取用户所查询课程的所有考试的详细信息。
def getDetailQuery(cookie,course_id,classroom_id):
#获取每门课程考试的Id
curtime = "{0:.3f}".format(float(time.time())).replace(".","")
url = "https://changjiang.yuketang.cn/v/course_meta/classroom_logs?course_id=" + course_id + "&classroom_id=" + classroom_id + "&activity_type=-1&date_time=" + curtime
#print(url)
try:
headers={
'accept':'*/*',
'accept-language':'zh-CN,zh;q=0.9',
'connection':'keep-alive',
'referer':url,
'Cookie': cookie,
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
response = requests.get(url=url,headers=headers,verify=False)
exam = response.json()
return exam['data']['activities']
except:
return False
函数四: 获取查询试卷加密题目信息函数getHtml()
该函数的作用是通过GET获取用户所要查询试卷加密的题目信息。虽然老师设置了“交卷后不可查看”,但是从试卷的HTML代码中却有经过base64加密过的试卷信息。
def getHtml(cookie,query,rawaddr):
url = "https://changjiang.yuketang.cn/quiz/quiz_info/" + query + "/"
try:
headers={
'accept':'*/*',
'accept-language':'zh-CN,zh;q=0.9',
'connection':'keep-alive',
'referer':url,
'Cookie': cookie,
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
response = requests.get(url=url,headers=headers,verify=False)
exam = response.text
fo = open(rawaddr,'w')
fo.write(exam)
fo.close()
return True
except:
return False
函数五: base64解密函数base64Decode()
该函数的作用是将base64加密过的试卷信息进行解密操作。
def base64Decode(rawCode):
try:
mystr = rawCode
str_url = base64.b64decode(mystr).decode("utf-8")
return str_url
except:
return False
异常处理
程序已经比较完善地解决了可能出现的异常问题,如:登录异常、查询课程不存在、查询考试不存在等。各位读者可以放心使用。
程序源代码
程序源代码接近500行,均为本人耗费大量时间所写。各位读者可以浏览第一部分的展示视频,根据自身的真实情况,通过以下链接进行获取和下载:
程序源代码