来自http://tunps.com/cet-score-batch-query

一直都关注cnbeta的动态,没想到20号的时候登录尽然有这条新闻:‘“2009年6月CET6成绩于今天2009年8月20号早上9点公布” ,cnbeta现在是嘛新闻都出啊。于是乎就拿出了俺的“证件夹”,掏出了准考证开始查成绩,我对这个网上cet查分的网站的认识和评价基本上和此文一样,这次6级得到437分,感觉还是差不多了,因为还重来没有认认真真的停下来背单词、作题,除了考四级的时候作了一张模拟卷。
这个查询网站通过ajax来查询,需要等待15秒的时间,每次限查询一人成绩,听说08年的时候还要安装activex控件才能查询,对于linux用户就恼火了。通过分析一下http://cet.99sushe.com/这个页面发现没有表单(form),而是这样一句:
<input id="btn" type="button" name="" value="查询" onclick="submit_search();" /></p> |
调用了一个js函数submit_search(); 网页引用了一个js文件:http://cet.99sushe.com/res/js/cet0908.js :
var testid = "";var score = "";var contenthtml = "";var sec = 15; //默认等待15秒钟String.prototype.trim = function(){return this.replace(/(^\s*)|(\s*$)/g, ""); //javascrip没有自带trim函数,用来消除空白符}function gid(id) {return document.getElementById(id);} //返回表单输入的准考证号的值function assertFormat(tid){ //检查准考证号格式 var reg = /^\d{1,}$/; //regexp 表示全部为数字 if (!reg.test(tid) || tid.length != 15 || tid.substr(6, 3) != "091" || get_testtype(tid) == "") { //第6位其的三位数不是091的不准查,意思就是只能查09年上半年的成绩,而后用curl发现根本就没有其他几次考试的数据 alert("准考证号格式不正确"); return false;}else { for (var i = 1; i <= 7; i++) { if (gid("t" + i).checked) { if (tid.substr(9, 1) != gid("t" + i).value) { alert("考试类型和准考证号不匹配"); return false; } }}}return true;}function submit_search() { //提交查询 var testid_c = gid("id"); var c = assertFormat(testid_c.value.trim()); if(!c) { testid_c.focus(); return;}testid = testid_c.value.trim();if (contenthtml == "") contenthtml = gid("content").innerHTML; //得到content的div的innerHTML//search(testid);wait(); //等待15秒}function wait(){ //等待的时候把waithtml插入到content的div中 var sec_all = sec; var waithtml = " <div id="score_result"> <div id="score_inner">"; waithtml += " <div id="wait_title">系统正在查询中请稍候</div> "; waithtml += " <div id="time">" + sec + "</div> "; waithtml += "</div> </div> "; gid("content").innerHTML = waithtml; setTimeout("search(" + testid + ")", 0); wait_time(sec_all);}function wait_time(waitsec){ if (waitsec > 0) { //15秒没有到 gid("time").innerHTML = waitsec; waitsec--; setTimeout("wait_time(" + waitsec + ")", 1000); //难道这就是传说的中递归调用函数?!} else{ showscore(score); //时间到了也该显示分数得了 }}function showscore(tscore){var name = "";var school = "";var sarray=new Array();if(tscore != ""){ sarray = tscore.split(',');//根据不同的考试类型来给sarray数列赋值if (sarray.length >= 7) { name = sarray[6]; school = sarray[5];}else { name = sarray[2]; school = sarray[1];}}var resulthtml = "<div id="score_result"><h1>2009年6月考试成绩查询结果:</h1><div id="score_inner">";resulthtml += " <dl> <dt class="dtleft">考生姓名:</dt> <dd class="ddright">"+name+"</dd>";resulthtml += " <dt class="dtleft">学校:</dt> <dd class="ddright">" + school + "</dd>";resulthtml += " <dt class="dtleft">考试类别:</dt> <dd class="ddright">";resulthtml += get_testtype(testid);resulthtml += "</dd> <dt></dt> <dd style="overflow: hidden; height: 0px; clear: both;"></dd>";resulthtml += " <dt class="dtleft">准考证号:</dt> <dd class="ddright">";resulthtml += testid;resulthtml += "</dd> </dl><ul>";if(tscore == "") resulthtml += "<li>无法找到对应准考证号的分数,请确认你输入的准考证号无误</li>";else {if (sarray.length >= 7) { resulthtml += " <li> <div class="lileft">您的成绩总分:</div> <div class="liright" style="font-weight:bold;">" + sarray[4] + "</div></li> "; resulthtml += " <li> <div class="lileft">听力:</div> <div class="liright">" + sarray[0] + "</div></li> "; resulthtml += " <li> <div class="lileft">阅读:</div> <div class="liright">" + sarray[1] + "</div></li> "; resulthtml += " <li> <div class="lileft">综合:</div> <div class="liright">" + sarray[2] + "</div></li> "; resulthtml += " <li> <div class="lileft">写作:</div> <div class="liright">" + sarray[3] + "</div></li> ";}else {resulthtml += " <li><div class="lileft">您的成绩总分:</div><div class="liright" style="font-weight:bold;">" + sarray[0] + "</div></li>";}}resulthtml += "</ul><div style="text-align:center;">姓名中的生僻字可能无法正常显示,以成绩单为准</div></div>";resulthtml += "<p class="lang" style="margin-top:-10px;text-align:center;"><input id="btn" onclick="re_search();" type="button" value="返回" /></p> ";resulthtml += "</div>";gid("content").innerHTML = resulthtml; //通过js写html到dom上,用IE,firefox默认的源代码查看工具都没有发现源代码的变化,但是firefox扩展firebug就能看到,看来还是firebug牛逼。}function re_search() { //清空数据 var testid = ""; var score = ""; gid("content").innerHTML = contenthtml;} function get_testtype(tid) { //根据考号得到考试类型 switch (tid.substr(9, 1)) { case "1": return "英语四级"; case "2": return "英语六级"; case "3": return "日语四级"; case "4": return "日语六级"; case "5": return "德语四级"; case "7": return "俄语四级"; case "9": return "法语四级"; default: return ""; }}function search(tid){ //通过ajax post数据"id="+xxxxxxxxxxxxxxx var ajax = new Ajax(); ajax.Post("/getscore.html", "id="+tid, search_callback); //这个就是关键,通过post发送数据到getscore.html来完成查询。}function search_callback(success, responsetext) { if (success) { score = responsetext; //showscore(score); } else { search(testid); }} |
——————————————-
总结起来就是向getscore.html post一个数据"id="+xxxxxxxxxxxx
可以通过curl向指定的服务器发送数据包,具体方法此文 “斗智斗勇续 四六级查分技巧 ” 有介绍,需要注意的一点是查询的服务器有referer验证,referer验证一般用来防盗链,防止数据从非本站的提交上去,不过自定义referer并不是什么好难的事情,此为的作者还做了一个c#的gui前端,基本上就是把cmd的输出放在gui界面上,没有多大的意义。这个 “CET在线连续查分程序” 是别人用c#弄的一个在线查询,可以指定准考证号的起始号码和结束号码,就可以连续查询了。
然后我受到这样的启发,做了一个php版本的,演示地址:http://tunpishuang.iamspace.com/cet.php , 和c#那个略有不同的是并不是指定起始和结束地址,而是直接输入前6位,最多输出6000人的成绩,我贴一下源代码:
cet.php —————————————————
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>2009年上半年CET院校成绩批量查询 by tunpishuang</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><style type="text/css">#description{ border:solid 4px 4px 10px 4px #828282; color:#8B0000; width:420px;}#form{ border:solid 4px #828282; color:#8B0000; width:520px;}</style></head><body><h1>2009年上半年CET院校成绩批量查询 by tunpishuang</h1><div id="description">A.前6位是地区号.(可以问与你同一城市报名的任何一人)<br />B.然后是071 (表示07年的第1次,即07年6月份的)<br />C.然后是1或2 (1代表四级,2代表6级)<br />D.然后的三位是你的考场号,多为0**或1**<br />E.最后两位是你的座位<br /></div><form method="post" action="cet_query.php"><div id="form">单人成绩查询(输入准考证号)<input type="text" name="tid" id="tid" size="15" maxlength="15" /><input type="submit" value="查一查,更健康" /><p></p>院校成绩查询(输入准考证号前六位)<input type="text" name="cid" id="cid" size="8" maxlength="6" /><input type="submit" value="查一查,更健康" /></div></form><div><h1>这个查询程序草草完工,有待完善的地方,但是我不想弄了,弄老一天,人都矿鸟<p></p>有空到我博客来耍哈,<a href="http://tunps.com">http://tunps.com</a></h1></div></body></html> |
cet_query.php—————————————————-
<?phpecho "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\"><html xmlns=\"http://www.w3.org/1999/xhtml\"><head><title>查询结果</title><meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\" /><style type=\"text/css\">table,td,tr,th{ border:solid 1px #1E90FF; text-align:center;}</style></head><body><table cellpadding=\"15\" cellspacing=\"0\" ><tr> <th>听力</th> <th>阅读</th> <th>综合</th> <th>写作</th> <th>总分</th> <th>学校</th> <th>姓名</th></tr>"; $data_fmt=array();function query($id){ $curl = curl_init(); $curlpost='id='.$id; curl_setopt($curl, CURLOPT_URL, 'http://cet.99sushe.com/getscore.html'); curl_setopt($curl, CURLOPT_REFERER, 'http://cet.99sushe.com'); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_POST,1); curl_setopt($curl, CURLOPT_POSTFIELDS,$curlpost); curl_setopt($curl, CURLOPT_CONNECTTIMEOUT,0); $data = curl_exec($curl); global $data_fmt; $data_fmt=explode(",",$data); echo "<tr> <td>$data_fmt[0]</td> <td>$data_fmt[1]</td> <td>$data_fmt[2]</td> <td>$data_fmt[3]</td> <td>$data_fmt[4]</td> <td>$data_fmt[5]</td> <td>$data_fmt[6]</td></tr>"; curl_close($curl); } function person_query($tid){ query($tid); }function college_query($cid){ $cid=$_POST['cid']; $cid=sprintf("%.0f",$cid."091200100"); $j=0; $k=0; while($k<2){ while($j<100){ for($i=0;$i<30;$i++) { $cid=sprintf("%.0f",$cid+1); query($cid); } $cid=$cid-30; $cid=$cid+100; $j++; } $cid=$_POST['cid']; $cid=sprintf("%.0f",$cid."091200100"); $j=0; $k++; }}if(($_POST['tid'])!=0){ $tid=$_POST['tid']; person_query($tid); }if(($_POST['cid'])!=0){ $cid=$_POST['cid']; college_query($_POST['cid']); }echo "</table></body></html>";?><!--<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>查询结果</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><style type="text/css">table,td,tr,th{ border:solid 1px #1E90FF; text-align:center;}</style></head><body><table cellpadding="15" cellspacing="0" ><tr> <th>听力</th> <th>阅读</th> <th>综合</th> <th>写作</th> <th>总分</th> <th>学校</th> <th>姓名</th></tr> <tr> <td><?php echo $data_fmt[0]?></td> <td><?php echo $data_fmt[1]?></td> <td><?php echo $data_fmt[2]?></td> <td><?php echo $data_fmt[3]?></td> <td><?php echo $data_fmt[4]?></td> <td><?php echo $data_fmt[5]?></td> <td><?php echo $data_fmt[6]?></td></tr></table></body></html> |

不错! 啊!