0

我正在尝试登录网站并从您必须经过身份验证才能查看的页面中获取内容。我已经进行了一些研究,并看到了一些同时使用 cURL 和 stream_context_create 的示例,但我无法获得任何一种工作方式。我有要登录的页面的 url,以及包含我需要获取的数据的页面。非常感谢您的帮助!

这是我正在使用的:

<?php 
    $pages = array('home' => 
'https://www.53.com/wps/portal/personal', 
               'login' => 
'https://www.53.com/wps/portal/personal', 
               'data' => 
'https://www.53.com/servlet/efsonline/index.html?Messages.SortedBy=DATE,REVERSE'); 
    $ch = curl_init(); 
    //Set options for curl session 
    $options = array(CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)', 
             CURLOPT_SSL_VERIFYPEER => FALSE, 
             CURLOPT_SSL_VERIFYHOST => 2, 
             CURLOPT_HEADER => TRUE, 
             //CURLOPT_RETURNTRANSFER => TRUE, 
             CURLOPT_COOKIEFILE => 'cookie.txt', 
             CURLOPT_COOKIEJAR => 'cookies.txt'); 

    //Hit home page for session cookie 
    $options[CURLOPT_URL] = $pages['home']; 
    curl_setopt_array($ch, $options); 
    curl_exec($ch); 

    //Login 
    $options[CURLOPT_URL] = $pages['login']; 
    $options[CURLOPT_POST] = TRUE; 
    $options[CURLOPT_POSTFIELDS] = 'uid-input=xxx&pw=xxx'; 
    $options[CURLOPT_FOLLOWLOCATION] = FALSE; 
    curl_setopt_array($ch, $options); 
    curl_exec($ch); 

    //Hit data page 
    $options[CURLOPT_URL] = $pages['data']; 
    curl_setopt_array($ch, $options); 
    $data = curl_exec($ch); 

    //Output data
    echo $data; 

    //Close curl session 
    curl_close($ch); 
?>

干杯,

安东尼

4

3 回答 3

0

您正在使用登录字段 id 而不是名称:

$options[CURLOPT_POSTFIELDS] = 'uid-input=xxx&pw=xxx'; 

应该

$options[CURLOPT_POSTFIELDS] = 'UserName=xxx&Password=xxx'; 
于 2010-11-20T22:27:40.980 回答
0

如果您查看如何使用 file_get_contents 在 PHP 中发布数据?你可能会得到你需要的东西。

(我想您需要做与您登录并从那里继续会话时相同的帖子)

编辑(作为对以下问题的回应)

在第一个请求中,客户端将在登录后使用一些 cookie 进行响应。您必须将此 cookie 设置为第二个请求中的标头。

如果您收到 500 个错误,则可能是服务器拒绝了您的请求,因为您没有向它发送足够的标头。拒绝你的情况并不少见。尝试以下操作:

$opts = array('http' =>
array('method' => 'Get',
        'Header' => "Host: www.someserver.com\r\n".
        "User-Agent: Mozilla\r\n",
    'user_agent' => 'Mozilla'));

$context = stream_context_create($opts);

$fp = fopen('http://www.someserver.no', 'r', false, $context);
fpassthru($fp);
fclose($fp);

...您可能需要设置的标头因服务器而异。

于 2010-11-20T13:43:01.013 回答
0

安东尼,前段时间我不得不建造类似的东西。您需要关注的是 cookie。

Curl 处理 cookie,您需要做的是确保您首先登录,并在同一个连接中加载数据。我不能使用相同的连接,您可以使用 opts CURLOPT_COOKIE 或 CURLOPT_COOKIEFILE 来帮助您。更多信息: http: //ar2.php.net/manual/en/function.curl-setopt.php

于 2010-11-20T13:53:26.483 回答