长江雨课堂


前言

本文主要针对长江雨课堂中,考试后老师禁止查看试卷和答案这一问题,提供一种合理且快捷的获取方法。 通过使用Python及其相关第三方库,能够轻易地获取禁止查看的试卷的题目+标准答案+我的答案+分析,适合的题型范围包括选择题、填空题、判断题、问答题。
温馨提示: 友情告诫各位读者,切莫将本文所讲解的方法用于不正当竞争以及舞弊行为。否则,所造成的一切后果与本平台无关、与本文无关、与编者无关。一切解释权仅归编者所有。


提示:以下是本篇文章正文内容,下面案例仅供参考与学习

一、程序实现效果视频展示

视频网址:https://www.hfutblog.com/jiami/demo.mp4


二、长江雨课堂简介

长江雨课堂属于雨课堂系列教学产品,由学堂在线与清华大学在线教育办公室共同研发,旨在连接师生的智能终端,将课前-课上-课后的每一个环节都赋予全新的体验,最大限度地释放教与学的能量,推动教学改革。长江雨课堂将复杂的信息技术手段融入到PowerPoint和微信,在课外预习与课堂教学间建立沟通桥梁,让课堂互动永不下线。使用长江雨课堂,教师可以将带有MOOC视频、习题、语音的课前预习课件推送到学生手机,师生沟通及时反馈;课堂上实时答题、弹幕互动,为传统课堂教学师生互动提供了完美解决方案。长江雨课堂科学地覆盖了课前-课上-课后的每一个教学环节,为师生提供完整立体的数据支持,个性化报表、自动任务提醒,让教与学更明了。
网址:https://changjiang.yuketang.cn/
你以为我在为长江雨课堂打广告??? 俗话说知己知彼,方能百战不殆。所以我们要对长江雨课堂有一个大概了解,我们才能在学习中驾驭这款教学产品,为我们的学习提供极大的简便和帮助。在此,读者需要对长江雨课堂的登录方式有一个大概的了解,才能把我为大家提供的方法驾驭好。
长江雨课堂有四种登录方式:扫码登录、手机登录、短信登录、邮箱登录。这些登录方式都有一个共同的特点----依赖cookiesession。而程序需要读者的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按照程序提示进行登录。
获取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行,均为本人耗费大量时间所写。各位读者可以浏览第一部分的展示视频,根据自身的真实情况,通过以下链接进行获取和下载:
程序源代码

猜你喜欢

转载自blog.csdn.net/qq_45002960/article/details/114177464