function curlLogin($login_url, $cookieFile_code, $cookieFile_login, $loginParams, $target_url) { $ch = curl_init($login_url); curl_setopt($ch,CURLOPT_COOKIEFILE, $cookieFile_code); //验证码session值上传 curl_setopt($ch,CURLOPT_COOKIEJAR, $cookieFile_login); //获取登录cookie curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch,CURLOPT_POST, 1); curl_setopt($ch,CURLOPT_POSTFIELDS, $loginParams); //提交查询信息 curl_exec($ch); curl_close($ch); $ch = curl_init($target_url); curl_setopt($ch,CURLOPT_COOKIEFILE, $cookieFile_login); curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1); $content = curl_exec($ch); if(curl_errno($ch)){ return curl_error($ch); } curl_close($ch); return $content; }
curl_setopt($ch,CURLOPT_COOKIEFILE, $cookieFile_code); //验证码session值上传 curl_setopt($ch,CURLOPT_COOKIEJAR, $cookieFile_login); //获取保持登录的cookie
要分两步,先获取验证码的cookies,
然后提交后再获取登陆后的cookies。
根本没看我发的内容,我都说了我已经拿到验证码cookie了,现在是在获取登录的cookie。
你是按一下步步骤做的吗?(你只给个函数不能说明什么)
1、访问表单页(sessionid可能在这里就有)
2、读取验证码图片到识别表单
3、接收提交的验证码数据
4、将综合数据提交到表单目标页
除 3 外,每步都要有
curl_setopt($ch,CURLOPT_COOKIEFILE, $cookieFile_code);
curl_setopt($ch,CURLOPT_COOKIEJAR, $cookieFile_login);
显然这些工作是不可能在一个函数里完成的
尽管写的好的话,可以只用一个函数,但必然是多次调用的
我摸索中成功登录上去了,我模拟登录的系统比较奇怪,它至始至终的cookie值只有一个,就是验证码生成时产生的随机session,我将该我没用到curl_setopt($ch,CURLOPT_COOKIEFILE, $cookieFile_code);操作去提交cookie,我将里面的session值用正则匹配出来后,附加到header上去提交,其中我模拟登录失败的原因可能是因为服务器判断了来源页,没有设置虚拟来源页的登录都会被拒绝。另外说一下,我模拟登录的是方正的教务处系统。希望我的失败经验对其他人能有帮助。