V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lusin
V2EX  ›  PHP

请问php通过curl如何模拟登陆阿里妈妈呢?

  •  
  •   lusin · 2013-12-09 20:54:19 +08:00 · 8872 次点击
    这是一个创建于 4001 天前的主题,其中的信息可能已经有所发展或是发生改变。
    登陆的时候提示:超人,您提交的页面已过期,请重新输入提交
    以下是我写的模拟登陆代码,技术比较菜,勿笑,请问有什么问题呢?
    public function curl(){
    $url='https://www.alimama.com/member/minilogin_act.htm';
    $url2='http://www.alimama.com/member/minilogin.htm';
    $data['_tb_token_']=$this->g($url2);
    $data['style']='';
    $data['redirect']='';
    $data['proxy']='http://www.alimama.com/proxy.htm';
    $data['logname']='aaaaaa;
    $data['originalLogpasswd']='bbbbb';
    $data['logpasswd']='567aassssssssssssssssssssssss0f4';
    $fields=array_map('urlencode', $data);
    $cookie_file = "d:\cookie.txt";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,0);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_exec($ch);
    curl_close($ch);
    }
    15 条回复    2017-03-10 15:15:13 +08:00
    loveminds
        1
    loveminds  
       2013-12-09 22:48:29 +08:00
    可能限制了模拟登录吧
    hitsmaxft
        2
    hitsmaxft  
       2013-12-10 00:09:45 +08:00
    作弊检测很严格的...
    bombless
        3
    bombless  
       2013-12-10 00:21:07 +08:00
    这……前几行引号不全,后面$url和$url2也没用到……
    ETiV
        4
    ETiV  
       2013-12-10 02:28:11 +08:00 via iPhone
    http referer?
    bsbgong
        5
    bsbgong  
       2013-12-10 08:47:56 +08:00
    提示你过期,能想到两个可能:
    1. 你的请求缺失某个隐藏域;
    2. token验证过期
    一般模拟登录都不是这么简单实现了,光一个令牌验证就能把你过滤了。
    要使用一些库来模拟,比如apache httpclient:http://hc.apache.org/httpcomponents-client-4.3.x/index.html
    anewg
        6
    anewg  
       2013-12-10 09:43:09 +08:00   ❤️ 2
    注意 refer 和隐藏表单的 token。

    或者换个思路 参考我这篇博客 http://blog.segmentfault.com/pcp/1190000000341558
    xoxo
        7
    xoxo  
       2013-12-10 11:27:27 +08:00
    淘宝全线产品均不可程序模拟登录,有严格的各种防机器校验
    lusin
        8
    lusin  
    OP
       2013-12-10 12:48:47 +08:00
    @bombless 哦,那个url2是另一个方法获取tb_token用的,引号应该不少吧:)
    lusin
        9
    lusin  
    OP
       2013-12-10 12:49:22 +08:00
    @ETiV 这个加上了也是一样的结果
    lusin
        10
    lusin  
    OP
       2013-12-10 12:53:39 +08:00
    @bombless 少的引号是发贴时改用户名密码时丢的,应该不是这个问题,主要可能就是模拟登陆比这个复杂的多,这个只能登陆非常简单的网站
    thursday
        11
    thursday  
       2013-12-10 21:28:12 +08:00
    还是用浏览器模拟吧
    54dev
        12
    54dev  
       2014-08-19 18:21:38 +08:00
    @anewg 看了你写的demo,想请问一下,这个php库里好像没有获取源码的方法?
    anewg
        13
    anewg  
       2014-08-19 19:09:43 +08:00   ❤️ 1
    @54dev 可以试试 $elements = $session->element('css selector', 'body')->text(); 如果不行的话查下selenium的文档,应该是有的。我太久没用忘的差不多了
    54dev
        14
    54dev  
       2014-08-20 11:24:07 +08:00
    @anewg $elements = $session->element('css selector', 'body')->text();是获取所有文本,我用的是和你一样php库,那个库里好像没有获取源码的方法。
    awobaba
        15
    awobaba  
       2017-03-10 15:15:13 +08:00
    PHP 不行,获取不到完整的 session 。 需要配合软件来使用,我有 C#编写的程序,软件内建了 API ,可供 PHP 等其他程序调用. Q 23360598
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2818 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 14:00 · PVG 22:00 · LAX 06:00 · JFK 09:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.