cURL模拟登录教学管理系统

            cURL模拟登录教学管理系统
2014-09-12 17:10:21
标签: php curl 微信查课表 模拟登陆
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://alldu.blog.51cto.com/2346976/1551650

最近在开发微信公众平台,想实现通过微信查询课表的功能。无奈本人业务不精,之前对微信公众平台不是很了解,甚至对PHP都不是很熟练。所以一直不知道怎么解决,在网上查阅了很多资料,收货不是很大,不过至少把原理弄懂了。其实原理很简单,就是利用php的cURL模拟登录技术。

cURL是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等。最爽的是,PHP也支持 cURL 库。在PHP中建立cURL请求的基本步骤:

1.初始化

2.设置变量

3.执行并获取结果

4.释放cURL句柄

首先登录教学管理系统,我们学校用的是正方教学管理系统,而且不需要验证码。很多学校用的都是这套系统,开发这套系统的人最热衷于做登陆界面,一口气做了5个,这是得有多闲啊。其中的default3.aspx就一个登陆框,我们选择它作为模拟登陆的入口。

查看源代码找到登陆需要提交的参数,当然用httpwatch抓包分析更好,现在这台电脑上没安装所以就不截图了。

VIEWSTATE这个参数我也不知道是干嘛的,好像是aspx用来验证的,后面进入教务系统后每一次点击都要提交一次这个参数,而且点击后的这个参数很长,有时候根本提交不过去,这个问题暂时还没解决。一般来说登陆提交这三个参数就行了。

这是我在网上找的正则表达式,可以将表格转换成数组,非常方便,可以拿去用在很多地方。

","{tr}",$table);
         $table  str_replace ( "" , "{td}" , $table );
         //去掉 HTML 标记
         $table  = preg_replace( "'<[/!]*?[^<>]*?>'si" , "" , $table );
         //去掉空白字符
         $table  = preg_replace( "'([rn])[s]+'" , "" , $table );
         $table  = preg_replace( '/ /' , "" , $table );
         $table  str_replace ( " " , "" , $table );
         $table  str_replace ( " " , "" , $table );
         $table  explode ( '{tr}' $table );
         array_pop ( $table );
         foreach  ( $table  as  $key => $tr ) {
                 $td  explode ( '{td}' $tr );
                 array_pop ( $td );
             $td_array [] =  $td ;
         }
         return  $td_array ;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function  get_td_array( $table ) {
         $table  = preg_replace( "']*?>'si" , "" , $table );
         $table  = preg_replace( "']*?>'si" , "" , $table );
         $table  = preg_replace( "']*?>'si" , "" , $table );
         $table  str_replace ( "

详细代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
$username = '2011140113' ; //账号
$password = '123456' ; //密码
$cookie_file  =tempnam( './temp' , 'cookie' );    //创建临时文件保存cookie
$login_url  'http://192.168.17.42/(0t3a2k454z1yey55nczj5x55)/default3.aspx' ;//登陆地址
$post_fields  '__VIEWSTATE=dDwtMTk3MjM2MzU0MDs7Po+Vuw2g98nkvMhqN2OzPbC6DnbA&TextBox1=' . $username . '&TextBox2=' . $password ; //POST参数
$ch  = curl_init( $login_url ); //初始化
curl_setopt( $ch , CURLOPT_HEADER, 0); //0显示
curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 1); //1不显示
curl_setopt( $ch , CURLOPT_POST, 1); //POST数据
curl_setopt( $ch , CURLOPT_COOKIEJAR,  $cookie_file ); //保存cookie
curl_setopt( $ch , CURLOPT_POSTFIELDS,  $post_fields ); //加上POST变量
curl_exec( $ch );
curl_close( $ch );
 
//跳转到课表页面,原理同上
$url = 'http://192.168.17.42/(0t3a2k454z1yey55nczj5x55)/tjkbcx.aspx?xh=$username' ;
$ch  = curl_init( $url );
curl_setopt( $ch , CURLOPT_HEADER, 0);
curl_setopt( $ch , CURLOPT_RETURNTRANSFER,0);
curl_setopt( $ch , CURLOPT_COOKIEFILE,  $cookie_file );
$contents  = curl_exec( $ch ); //执行并获取HTML文档内容
iconv( 'GB2312' 'UTF-8' $contents ); //编码转换
 
preg_match_all( '/]*>([\s\S]*?)<\/table>/' , $contents , $table ); //用正则表达式将课表的表格取出
  $arr  = get_td_array( $table [0][0]); //执行函数
  //按星期天数将课表保存到二维数组里
  for  ( $d =1; $d <=7; $d ++){
     $shuzu [ $d ][1]= $arr [1][ $d ];
     $shuzu [ $d ][2]= $arr [2][ $d +1];
     $shuzu [ $d ][3]= $arr [3][ $d ];
     $shuzu [ $d ][4]= $arr [4][ $d ];
     $shuzu [ $d ][5]= $arr [5][ $d ];
     $shuzu [ $d ][6]= $arr [6][ $d ];
     $shuzu [ $d ][7]= $arr [7][ $d ];
     $shuzu [ $d ][8]= $arr [8][ $d ];
     $shuzu [ $d ][9]= $arr [9][ $d ];
     $shuzu [ $d ][10]= $arr [10][ $d ];
     $shuzu [ $d ][11]= $arr [11][ $d ];
     $shuzu [ $d ][12]= $arr [12][ $d ];
     $shuzu [ $d ][13]= $arr [13][ $d ];
     $shuzu [ $d ][14]= $arr [14][ $d ];
     $shuzu [ $d ][15]= $arr [15][ $d ];
     }
 
     $xq = date ( 'w' ); //取出星期几
     //根据星期几打印课表
     if ( $shuzu [w]==null){
     echo ( "你今天没有课哦!" );
     } else
     print_r( $shuzu [w]);
     
     curl_close( $ch ); //释放curl句柄

基本步骤和代码就是这样了,虽然不是很复杂,但是当初我作为一个初学者,毕竟花了很多时间才弄懂的。

如果要用在微信公众平台里查询,基本思路是这样的,用户先绑定学号(username)和密码(password),然后服务器模拟登陆到教学管理系统,将课表提取出来,然后需要再用正则表达式将这个数组提取出来,保存到变量里,回复给用户就行了。具体原理请参考微信的消息发送机制。


本文出自 “业精于勤,荒于嬉。” 博客,请务必保留此出处http://alldu.blog.51cto.com/2346976/1551650

你可能感兴趣的:(php)