成都某大学新生安全教育学习考试部分
本次文章写于2019年1月27日20:04:36
学校出了个新生安全教育和军事教育的网络教学,学习部分是H5的小动画,考试就是普通的答题。
网站是http://******.mycourse.cn/。(之前结课几次了,又开放了)(打出星号,避免嫌疑推广)
本篇文章将使用到PHP的curl和Fiddler抓包工具,只介绍考试部分。
(其中Fiddler使用的都是基础功能,少些介绍部分)
打开fiddler,对登陆时进行抓包
(第一次插入图片,如果太小请点开)
登陆时请求了多个地址,根据请求的地址正确判断所需要的包。上图中蓝框选中的即所需要的包。查看Inspecter里面的WebForms即可知道请求用了哪些东西。
同理,需要自己做一次考试,并记录下封包。
以下是我寝室隔壁大佬做的记录,分享出来:
获取科目信息:url:http://*******.mycourse.cn/pharos/exam/listPlan.dotype: POSTContent-Type:application/x-www-form-urlencodedformdata:userProjectId:d3495cef-a646-473d-9736-*******tenantCode: 61000007res.data: [{answerNum: 99answerTime: 60displayState: 1examFinishNum: 1examOddNum: 98examPlanId:"5bbb515d-d2ed-4f47-a930-*******"examPlanName: "结课考试"examTimeState: 2id:"03b47a23-9b51-4890-9c44-*******"passScore: 60prompt: ""retakeFinishNum: 0retakeOddNum: 10retakeTimeState: 2showRetake: 2}] 准备考试:url:http://*******.mycourse.cn/pharos/exam/preparePaper.dotype: POSTContent-Type:application/x-www-form-urlencodedformdata:userExamPlanId:03b47a23-9b51-4890-9c44-*******tenantCode: 61000007 获取试卷:url:http://*******.mycourse.cn/pharos/exam/startPaper.dotype: POSTContent-Type:application/x-www-form-urlencodedformdata:userExamPlanId:03b47a23-9b51-4890-9c44-*******tenantCode: 61000007 res.data: [{ id:"0e67e582-a013-4f13-b816-16be9d49ed0e", optionList: [ { content: "在爱国游行中发生“打砸抢烧”不用负责任。", id:"b51eb5a1-d9d3-4323-adef-593e822e07d8", questionId:"0e67e582-a013-4f13-b816-16be9d49ed0e", selected: 2, sequence: 1 } ]}] 提交问题:url:http://*******.mycourse.cn/pharos/exam/recordQuestion.dotype: POSTContent-Type:application/x-www-form-urlencodedformdata:userExamPlanId:03b47a23-9b51-4890-9c44-*******questionId:0e67e582-a013-4f13-b816-16be9d49ed0euseTime: 708answerIds:6f9a46fb-cdf3-4715-9b86-c4f4c7449570(多选时用,隔开)tenantCode: 61000007 交卷:url:http://weiban.mycourse.cn/pharos/exam/submitPaper.dotype: POSTContent-Type:application/x-www-form-urlencodedformdata:userExamPlanId:03b47a23-9b51-4890-9c44-*******tenantCode: 61000007
某些可能会泄露信息的ID的替换成星号,有需要的可以自己截取。
分析了这些我们大概能理出个流程
1.几乎所有请求都没有用到cookie
2.考试过程为登陆->获取科目信息->准备考试->获取试卷->提交问题->交卷
贴出部分PHP代码
其中curl部分封装为(有些地方多余的,我没有剔除去)
// 几乎所有类型的curl请求
function curl_all($url1,$post1='',$url2='',$post2='',$jstyp=''){
// 创建一个临时文件用于cookie保存
$cookie_jar = tempnam('./tmp','cookie');
//$ch1初始化
$ch1 = curl_init();
//设定$ch1目的url1
curl_setopt($ch1,CURLOPT_URL,$url1);
//如果有post,则post方式服务器,否则get方式服务器
if($post1) {
curl_setopt($ch1, CURLOPT_POST, 1);
curl_setopt($ch1, CURLOPT_POSTFIELDS, http_build_query($post1));
}
//把返回来的cookie信息保存在$cookie_jar文件中
curl_setopt($ch1, CURLOPT_COOKIEJAR, $cookie_jar);
//设定返回的数据是否自动显示
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);
//设定是否显示头信息
curl_setopt($ch1, CURLOPT_HEADER, false);
//设定是否输出页面内容
curl_setopt($ch1, CURLOPT_NOBODY, false);
//设定$res1为页面内容
$res1=curl_exec($ch1);
//关闭$ch1
curl_close($ch1);
//如果url2存在,则继续执行,否则返回$res1
if($url2){
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, $url2);
curl_setopt($ch2,CURLOPT_REFERER,$url2);
if($post2) {
curl_setopt($ch2, CURLOPT_POST, 1);
if ($jstyp) {
curl_setopt($ch2, CURLOPT_HTTPHEADER,
array(
'Content-Type: application/json; charset=utf-8',
'Content-Length:'.strlen($post2))
);
curl_setopt($ch2, CURLOPT_POSTFIELDS, $post2);
} else {
curl_setopt($ch2, CURLOPT_POSTFIELDS, http_build_query($post2));
}
}
curl_setopt($ch2, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch2,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch2, CURLOPT_COOKIEFILE, $cookie_jar);
$res2 = curl_exec($ch2);
curl_close($ch2);
return $res2;
} else {
return $res1;
}
}
其他部分,部分代码为:
<?php
header('content-type:text/html;charset=utf-8');
//题库答案
$ans_pre = [
"“打砸抢烧”都属于违法乱纪的行为,会受到法律的惩处。",
"其他三个选项皆是。",
"等等答案……"
];
// 列举需要用到的网址
$url_login = "http://weiban.mycourse.cn/pharos/login/login.do";
$url_list = "http://weiban.mycourse.cn/pharos/usercourse/listCourse.do";
$url_study = "http://weiban.mycourse.cn/pharos/usercourse/study.do";
$url_getcouurl = "http://weiban.mycourse.cn/pharos/usercourse/getCourseUrl.do?";
$url_ex_pre = "http://weiban.mycourse.cn/pharos/exam/listPlan.do";
$url_bgnex = "http://weiban.mycourse.cn/pharos/exam/preparePaper.do";
$url_getex = "http://weiban.mycourse.cn/pharos/exam/startPaper.do";
$url_doex = "http://weiban.mycourse.cn/pharos/exam/recordQuestion.do";
$url_handex = "http://weiban.mycourse.cn/pharos/exam/submitPaper.do";
//预准备
$login["keyNumber"]=$id;
$login["password"]=$id;
$login["tenantCode"]="61000007";
$preid = json_decode(curl_all($url_login,$login),true)["data"]["preUserProjectId"];
$userProjectId = $preid;
$tenantCode = "61000007";
$list["userProjectId"] = $userProjectId;
$list["chooseType"] = "3";
$list["tenantCode"] = $tenantCode;
$list["name"] = "";
$tenantCode = "61000007";
$userProjectId = $preid;
//
$ex_pre["userProjectId"] = $userProjectId;
$ex_pre["tenantCode"] = $tenantCode;
$ex_info=json_decode(curl_all($url_ex_pre,$ex_pre),true)["data"];
//
$all_use_info["userExamPlanId"] = $ex_info["id"];
$all_use_info["tenantCode"] = $tenantCode;
curl_all($url_bgnex,$all_use_info);
//
$qsnr = json_decode(curl_all($url_getex,$all_use_info),true)["data"];
//
for ($i=0; $i < count($qsnr); $i++) {
for ($j=0; $j < count($ans_pre); $j++) {
for ($k=0; $k < count($qsnr[$i]["optionList"]); $k++) {
if ($ans_pre[$j] == $qsnr[$i]["optionList"][$k]["content"]) {
$tmp_ans_arr[$i][] = $qsnr[$i]["optionList"][$k]["id"];
}
}
}
$answer["userExamPlanId"] = $ex_info["id"];
$answer["questionId"] = $qsnr[$i]["id"];
$answer["useTime"] = rand(8, 12);
$answer["answerIds"] = $tmp_ans_arr[$i];
$answer["tenantCode"] = $tenantCode;
for ($l=0; $l < count($tmp_ans_arr[$i]) - 1; $l++) {
$answer["answerIds"] .= (",".$tmp_ans_arr[$i][($l)+1]);
}
curl_all($url_doex,$answer);
}
//
curl_all($url_handex,$all_use_info);
部分答案在题库里面可能对可能错,需要在提交答案的for循环里面加if判断题目,接下来break就行;
用curl多线程能否成功,我没试过,我还不是对curl理解太多。值得尝试。(针对学习部分)
好了,差不多就这么多了,我也是跟着大佬学的,不懂的挺多的,我还是要好好加油。
楼主很努力哦
页:
[1]