验证码形式:http://www.4levelsbux.com/pages/captcha?t=s&s=standard&h=452300983
验证码来源:http://www.4levelsbux.com/pages/login像这种网站,要如何用CURL模拟登陆,登陆后进行 信息采集。
<?php
$CookieFile = dirname(__FILE__).'/cookie.tmp';
if(isset($_GET["img"])){
$url = 'http://www.4levelsbux.com/pages/captcha?t=s&s=standard&h=452300983';
$ch = curl_init($url);
curl_setopt($ch,CURLOPT_COOKIEJAR, $CookieFile);//把返回来的cookie信息保存在文件中
//curl_setopt($ch, CURLOPT_REFERER, "http://localhost/learn/curltest/verifycode.php");
//设置请求的来源(referrer)
curl_exec($ch);
curl_close($ch);
exit();
}    
//=========================================================?>
<form id="form1" name="form1" method="post" action="">
<img src="?img=true" /><!--由服务器端取图片内容并输出-->
<input type="text" name="d"  />
<input type="submit" name="button" id="button" value="提交" />
</form>
搞大半天没搞出来,请教高手。

解决方案 »

  1.   

    1.访问 
    http://www.4levelsbux.com/pages/login
    2.将页面内的
    this.src="/pages/captcha?t=s&s=standard&h=109750452"; this.onclick=""; this.style.cursor="default"; getObject("captcha").focus();
    取出
    3.拼装成
    http://www.4levelsbux.com/pages/captcha?t=s&s=standard&h=109750452
    4.访问3的url 即可得到验证码的图.
      

  2.   


    我就是这样做的。但在 保存cookie,输出到本地的时候,图片严重变形
      

  3.   


    通过culr和我4楼的步骤 取得图片我已经测试通过了.图片没发现有严重变形的问题,不知道你说的严重变形是个什么意思
      

  4.   


    取出/pages/captcha?t=s&amp;amp;s=standard&amp;amp;h=109750452 后,用我提问中的代码,输出图片如下
      

  5.   


    将你的代码按照我4楼的步骤写一次,然后将你的代码post出来.
      

  6.   


    为什么 直接GET不行,还需要POST
      

  7.   

    我是绝对0基础(没任何编程基础),自学PHP出来的。可能没有系统的指导,有的东东不怎么明白
      

  8.   


    不好意思 post 是说将你的代码贴出来.我洗澡去了,回头看看你的代码
      

  9.   


    $url = "http://www.4levelsbux.com/pages/login"; 
      
       $ch  = curl_init($url); //初始化
       curl_setopt($ch, CURLOPT_HEADER,0);
       curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
       
       $contents = curl_exec($ch);
       
       //使用正则和分割,得到验证码地址最后的编号 如:702224513
       
    //----验证码参数读取完毕//----输出验证码
       $CookieFile = dirname(__FILE__).'/cookie.tmp';
       if(isset($_GET["img"])){
       $codurl = 'http://www.4levelsbux.com/pages/captcha?t=s&s=standard&h=814258691';
       $ch = curl_init($codurl);
       curl_setopt($ch,CURLOPT_COOKIEJAR, $CookieFile);//把返回来的cookie信息保存在文件中
       //curl_setopt($ch, CURLOPT_REFERER, "http://localhost/learn/curltest/verifycode.php");
       //设置请求的来源(referrer)
       curl_exec($ch);
       curl_close($ch);
       exit();
       }   
       
       echo "<img src=\"?img=true\" width=\"111\" height=\"44\" />";
    就是不知道为什么,输出的图片是严重变形的,还请不怕麻烦,不惜指教,
      

  10.   

    $codurl = 'http://www.4levelsbux.com/pages/captcha?t=s&s=standard&h=814258691';这个里面最后的编号 是用 GET方式从图片位置传递的过来的,只是这里直接填写编号而已
      

  11.   

    如果你用的是同样的CURL代码,为什么不会变形?
      

  12.   


    $cookie_file = dirname(__FILE__).'/cookie.txt';
    $url = "http://www.4levelsbux.com/pages/login";
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch,CURLOPT_USERAGENT,"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; InfoPath.1; CIBA)");
    curl_setopt($ch, CURLOPT_COOKIEJAR,  $cookie_file);
    $data=curl_exec($ch);
    curl_close($ch);
    preg_match('/this.src="\/pages\/captcha\?t=s&s=standard&h=([\d]+)"/is',$data,$matcharr);
    $number=$matcharr[1];
    $url="http://www.4levelsbux.com/pages/captcha?t=s&s=standard&h={$number}";
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,FALSE);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
    $response = curl_exec($ch);
    curl_close($ch);
    header('Content-type: image/jpeg');
    echo $response;
      

  13.   

    curl_setopt($ch, CURLOPT_COOKIEFILE, $CookieFile);
    手册:
    CURLOPT_COOKIEFILE  包含cookie数据的文件名,cookie文件的格式可以是Netscape格式,或者只是纯HTTP头部信息存入文件。
    CURLOPT_COOKIEJAR  连接结束后保存cookie信息的文件。

    之所以变形,是对方服务器没有接收到 cookie PHPSESSID
      

  14.   


    <img style="cursor:pointer;" src="/images/captcha_waiting.jpg" align="absmiddle" onclick="this.src=&quot;/pages/captcha?t=s&amp;s=standard&amp;h=758495425&quot;; this.onclick=&quot;&quot;; this.style.cursor=&quot;default&quot;; getObject(&quot;captcha&quot;).focus();" width="111" height="44">这个图片是on_click之后替换上去的src,你直接抓onclick="this.src"后面这个网址,拼成http://www.4levelsbux.com/pages/captcha?t=s&s=standard&h=452300983这种形式就可以读到图片了.
      

  15.   


    嗯。这样把图片取到本地了,但怎么载入表单。我想加入form表单进行POST提交,但浏览器中看不到表单,也无法看源文件
      

  16.   

    加入form 进行模拟登陆,在页面中只显示 验证码,看不到 表单了。像这种定义了图片头,加不到html代码。
    难道玛瑙登陆时,直接调用$response?
      

  17.   


    把读来的图片, file_put_contents放到一个文件里, 然后在表单里加一个type="image" src="图片文件URL"就行了。
      

  18.   

    嗯,我尝试下使用框架来读取cookie文件提交模拟登陆看看
      

  19.   


    估计楼主是雇佣了一堆廉价劳动力, 希望给它们发工钱让它们帮你敲网站的验证码。过程:1,用户访问你的表单呈现页面
    2,你的表单呈现页面去外国网站拉回cookie和验证码图片
    3, 将cookie值存到当前访问表单呈现页面的用户session中
    4,将验证码图片存储到文件系统内
    5,表单呈现页面生成表单+验证码URL
    6,廉价劳动力填写表单,根据图片输入验证码
    7,廉价劳动力提交表单,服务端根据SESSION里记录的COOKIE向外国网站发起post请求完成外国网站的登录
    8,完成外国网站登录了,你再返回什么页面给你的廉价劳动力由你决定,反正外国网站的会话COOKIE在廉价劳动力的SESSION里存储了,之后的操作都可以进一步以已登录身份操作外国网站了,当然还都是PHP端curl在工作。
      

  20.   

    估计楼主是雇佣了一堆廉价劳动力, 希望给它们发工钱让它们帮你敲网站的验证码。过程:1,廉价劳动力访问你的表单呈现页面
    2,你的表单呈现页面去外国网站拉回cookie和验证码图片
    3, 将cookie值存到当前访问表单呈现页面的廉价劳动力session中
    4,将验证码图片存储到文件系统内
    5,表单呈现页面生成表单+验证码URL
    6,廉价劳动力填写表单,根据图片输入验证码
    7,廉价劳动力提交表单,服务端根据SESSION里记录的COOKIE向外国网站发起post请求完成外国网站的登录
    8,完成外国网站登录了,你再返回什么页面给你的廉价劳动力由你决定,反正外国网站的会话COOKIE在廉价劳动力的SESSION里存储了,之后的操作都可以进一步以已登录身份操作外国网站了,当然还都是PHP端curl在工作。
      

  21.   


    呵呵,你的点子不错,猜测也很大胆。不过我还没那个技术啊。还在 curl初级阶段,努力刻苦学习中,还希望能得到前辈们的悉心指导,毕竟我没有进学校学过计算机专业,都是在家自个摸索学习,不正规,也不系统。
      

  22.   

    当在高人的帮助后,得到清晰的验证码。分析原因,原来是 没有发送cookie,也没有定义图片头,导致JPG图片输出为PNG,导致严重变形。接着需要使用分析到的cookie进行模拟登陆操作,需要使用新文件页面来设置表单,因为图片头不允许有html存在,否则将直接输出乱码,所要用新页面。在分析目标网站表单时,发现,目标站表单的name和ID都是由JS产生的动态变量,还需要先进行目标站表单元素分析抓取动态变化的name和ID
      

  23.   


    fiddler抓一下登录提交的http请求, 对照着页面上表单看看是不是有什么额外的JS控制.