php写的cet成绩批量查询

![php写的cet成绩批量查询][1]

一直都关注cnbeta的动态,没想到20号的时候登录尽然有这条新闻:“2009年6月CET6成绩于今天2009年8月20号早上9点公布” ,cnbeta现在是嘛新闻都出啊。于是乎就拿出了俺的“证件夹”,掏出了准考证开始查成绩,我对这个网上cet查分的网站的认识和评价基本上和"另一个角度看CET查分"一文一样,这次6级得到437分,感觉还是差不多了,因为还重来没有认认真真的停下来背单词、作题,除了考四级的时候作了一张模拟卷。

![php写的cet成绩批量查询][2]

这个查询网站通过ajax来查询,需要等待15秒的时间,每次限查询一人成绩,听说08年的时候还要安装activex控件才能查询,对于linux用户就恼火了。通过分析一下http://cet.99sushe.com/这个页面发现没有表单(form),而是这样一句:

调用了一个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  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 = "
2009年6月考试成绩查询结果:
";
resulthtml += "  考生姓名: "+name+"";
resulthtml += "
学校: " + school + "";
resulthtml += "
考试类别: ";
resulthtml += get_testtype(testid);
resulthtml += "  ";
resulthtml += "
准考证号: ";
resulthtml += testid;
resulthtml += "
";
if(tscore == "") resulthtml += "无法找到对应准考证号的分数,请确认你输入的准考证号无误";
else {
if (sarray.length >= 7) {
resulthtml += "
您的成绩总分:
" + sarray[4] + "
";
resulthtml += "
听力:
" + sarray[0] + "
";
resulthtml += "
阅读:
" + sarray1 + "
";
resulthtml += "
综合:
" + sarray2 + "
";
resulthtml += "
写作:
" + sarray[3] + "
";
}
else {
resulthtml += "
您的成绩总分:
" + sarray[0] + "
";
}
}
resulthtml += "
姓名中的生僻字可能无法正常显示,以成绩单为准
";
resulthtml += "
";
resulthtml += "
";
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人的成绩,我贴一下源代码:

2009年上半年CET院校成绩批量查询 by tunpishuang
#description{
    border:solid 4px 4px 10px 4px #828282;
    color:#8B0000;
    width:420px;
}
#form{
    border:solid 4px #828282;
    color:#8B0000;
    width:520px;
}
2009年上半年CET院校成绩批量查询 by tunpishuang
A.前6位是地区号.(可以问与你同一城市报名的任何一人)
B.然后是071 (表示07年的第1次,即07年6月份的)
C.然后是1或2 (1代表四级,2代表6级)
D.然后的三位是你的考场号,多为0**或1**
E.最后两位是你的座位
单人成绩查询(输入准考证号)
院校成绩查询(输入准考证号前六位)
这个查询程序草草完工,有待完善的地方,但是我不想弄了,弄老一天,人都矿鸟
有空到我博客来耍哈,http://tunps.com

cet_query.php

“php写的cet成绩批量查询”的一个回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注