验证码真实地址未知情况下实现Curl模拟登陆

以前写过一个关于Curl模拟登陆的文章,那个系统是urp综合教务系统,验证码带cookie,访问验证码的时候获取带JSESSIONID的cookie,保存Cookie,然后带着cookie登陆,验证合法后就可以带着Cookie访问任何页面。此次的情况是模拟登陆校园网H3C自助服务系统。 不同点:①验证码不带Cookie。②验证码地址不是固定的,而是类似http://192.168.252.247:8080/selfservice/codeImages/checkCode8609423202686165331.jpg的地址,每次的地址都不同 遇到了两个难题:①由于地址不是固定的,无法获取验证码地址,所以无法提取验证码给用户②验证码不带cookie,访问验证码也没有用。这两个问题纠结了好久,最终想到解决办法:使用正则表达式。 1.访问整个页面,保存Cookie
header ( 'content-type:text/html; charset=utf-8' );
$cookie_file = dirname(__FILE__)."/pic.cookie";
$login_url = 'http://192.168.252.247:8080/selfservice/login.jsf';
$url  = 'http://192.168.252.247:8080/selfservice/maintain/main.jsf';
$ch = curl_init($login_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
$contents = curl_exec($ch);
curl_close($ch);
2.使用正则表达式截取验证码(这里的表达式规则根据自己页面的写,我的仅仅作为例子),并展示给用户:
(.*)<\/span>/';

preg_match($regex, $contents, $m);
// print_r($m);
$sub = $m['1'];
$img = str_replace("src='", "src='http://192.168.252.247:8080", $sub);
?>

3.recive.php页面接收验证码后使用Curl模拟登陆,验证合法之后保存Cookie,然后就可以带着那个Cookie访问你所需要的页面了。