引言:继前文《模拟登陆并采集数据》,你们彷佛看不过瘾,这会再出一发,模拟实现带验证码网站的登陆。php
这篇文章主要介绍了PHP使用CURL实现对带有验证码的网站进行模拟登陆的方法,能够帮助读者加深对CURL操做的理解与应用,须要的朋友能够参考下。html
网上的不少模拟登陆程序,大都是经过服务程序Apache之类的运行,获取到验证码以后显示在网页上,而后填上再POST出去,这样虽然看起来很友好,可是既然模拟登陆,登陆后所干的事情就不必定是短期完成的,因此这就要受到php最大执行时间的限制,并且有些操做还有可能权限不足。浏览器
本文提供了一个程序实例,思路就是获取到验证码以后把验证码存储为一个图片,而后程序休眠20秒,在20秒以内由用户手动查看图片,并把验证码填写到code.txt文件中,20秒休眠完成后,程序会读code.txt的验证码,这样再带着验证码进行登陆操做。cookie
简单,恶心,粗鲁,粗暴……。curl
切入主题网站
下面直接上高清代码,:)。url
/////////////// // 初始化变量 /////////////// // Cookie文件名称 $cookie_file = "tmp.cookie"; // 验证码文件名称 $vcode_file = "code.txt"; // 登陆网址 $login_url = "http://xxx.com/logon.php"; // 验证码网址 $vcode_url = "http://xxx.com/verifyCode.php"; echo "===================================\n"; echo "正在获取COOKIE... \n"; echo "===================================\n"; // 初始化CURL对象 $ch = curl_init(); // 设置请求URL curl_setopt($ch, CURLOPT_URL, $login_url); // 设置不输出到浏览器(说明:直接返回字符串,不然直接输出) curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 设置链接超时时间(说明:5秒) curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); // 设置Cookie保存文件(说明:把返回来的cookie信息保存在$cookie_file文件中) curl_setopt($ch,CURLOPT_COOKIEJAR, $cookie_file); // 执行请求 $contents = curl_exec($ch); // 关闭链接 curl_close($ch); echo "===================================\n"; echo "COOKIE获取完成,正在取验证码... \n"; echo "===================================\n"; // 初始化CURL对象 $ch = curl_init(); // 设置请求URL curl_setopt($ch, CURLOPT_URL, $vcode_url); // 设置Cookie使用文件(说明:使用指定路径下的cookie文件,并跟随请求传递) curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); // 设置返回响应头信息[无](说明:该设置一般是须要加上的,用于制做下一次请求的肥料。) curl_setopt($ch, CURLOPT_HEADER, 0); // 设置不输出到浏览器(说明:直接返回字符串,不然直接输出) curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 执行请求(说明:得到图片字符集) $img = curl_exec($ch); // 关闭链接 curl_close($ch); echo "===================================\n"; echo "正在保存验证码图片... \n"; echo "===================================\n"; $fp = fopen("verifyCode.jpg", "w"); fwrite($fp, $img); fclose($fp); echo "===================================\n"; echo "验证码取出完成,正在休眠... \n"; echo "20秒内请把验证码填入code.txt并保存.\n"; echo "===================================\n"; // 线程睡眠20秒 sleep(20); echo "===================================\n"; echo "休眠完成,开始取验证码... \n"; echo "===================================\n"; $code = file_get_contents(vcode_file); echo "验证码成功取出:$code\n"; echo "===================================\n"; echo "正在准备模拟登陆... \n"; echo "正在准备模拟登陆... \n"; echo "===================================\n"; // 初始化CURL对象 $ch = curl_init(); // 设置请求URL curl_setopt($ch, CURLOPT_URL, $url); // 设置返回响应头信息[无](说明:该设置一般是须要加上的,用于制做下一次请求的肥料。) curl_setopt($ch, CURLOPT_HEADER, false); // 设置不输出到浏览器(说明:直接返回字符串,不然直接输出) curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 设置请求携带数据 curl_setopt($ch, CURLOPT_POSTFIELDS, "username=superdo&pwd=do.org.cn&verifycode=$code"); // 设置Cookie使用文件(说明:使用指定路径下的cookie文件,并跟随请求传递) curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); // 执行请求 $result = curl_exec($ch); // 关闭链接 curl_close($ch); // 这一块根据本身抓包获取到的网站上的数据来作判断 if (substr_count($result, "登陆成功")) { echo "登陆成功\n"; } else { echo "登陆失败\n"; exit; } // OK,开始作你想作的事吧。。。。。
未完待续……。spa
本站文章为 宝宝巴士 SD.Team 原创,转载务必在明显处注明:(做者官方网站: 宝宝巴士 )
转载自【宝宝巴士SuperDo团队】 原文连接: http://www.cnblogs.com/superdo/p/4791957.html线程