最近在开发微信公众平台,想实现通过微信查询课表的功能。无奈本人业务不精,之前对微信公众平台不是很了解,甚至对PHP都不是很熟练。所以一直不知道怎么解决,在网上查阅了很多资料,收货不是很大,不过至少把原理弄懂了。其实原理很简单,就是利用php的cURL模拟登录技术。
cURL是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等。最爽的是,PHP也支持 cURL 库。在PHP中建立cURL请求的基本步骤:
1.初始化
2.设置变量
3.执行并获取结果
4.释放cURL句柄
首先登录教学管理系统,我们学校用的是正方教学管理系统,而且不需要验证码。很多学校用的都是这套系统,开发这套系统的人最热衷于做登陆界面,一口气做了5个,这是得有多闲啊。其中的default3.aspx就一个登陆框,我们选择它作为模拟登陆的入口。
查看源代码找到登陆需要提交的参数,当然用httpwatch抓包分析更好,现在这台电脑上没安装所以就不截图了。
VIEWSTATE这个参数我也不知道是干嘛的,好像是aspx用来验证的,后面进入教务系统后每一次点击都要提交一次这个参数,而且点击后的这个参数很长,有时候根本提交不过去,这个问题暂时还没解决。一般来说登陆提交这三个参数就行了。
这是我在网上找的正则表达式,可以将表格转换成数组,非常方便,可以拿去用在很多地方。
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(
"'<table[^>]*?>'si"
,
""
,
$table
);
$table
= preg_replace(
"'<tr[^>]*?>'si"
,
""
,
$table
);
$table
= preg_replace(
"'<td[^>]*?>'si"
,
""
,
$table
);
$table
=
str_replace
(
"</tr>"
,
"{tr}"
,
$table
);
$table
=
str_replace
(
"</td>"
,
"{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
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
|
<?php
$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(
'/<table id="Table6" [^>]*>([\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