通过cURL抓取受保护的内容

时间:2016-06-03 03:13:52

标签: php post curl

我目前正在为那些从其他网站抓取图表数据的用户开发一个信息中心。要获得此图表,需要您登录。<​​/ p>

我正在尝试复制的表单包含以下代码:

<form method="POST" action="https://redacted/auth/login" accept-charset="UTF-8" id="loginform" name="loginform"><input name="_token" type="hidden" value="xyxRW0w8ZjHyP7ZvrCFygqcNkPZ37P35wh8NifuC">
    <table class="form spaceform">
        <tr>
            <td class='label'><label for="email">Email address:</label></td>
            <td><input name="email" type="text" id="email"></td>
        </tr>
        <tr>
            <td class='label'></td>
            <td>
                <input id="has_account_new" name="has_account" type="radio" value="new">
                <label for="has_account_new">I am a new customer</label><br />
                <input id="has_account_return" checked="checked" name="has_account" type="radio" value="return">
                <label for="has_account_return">I am a returning customer</label>
            </td>
        </tr>
        <tr>
            <td class='label'><label for="password">Password:</label></td>
            <td><input name="password" type="password" value="" id="password"></td>
        </tr>
        <tr>
            <td></td>
            <td><a href="https://redacted/auth/forgot">Forgot your password?</a></td>
        </tr>
        <tr>
            <td colspan='2' align='center' class='noborder'><br />
                <input type="submit" value="Login">
            </td>
        </tr>
    </table>
    <input name="_token" type="hidden" value="xyxRW0w8ZjHyP7ZvrCFygqcNkPZ37P35wh8NifuC">        
    <input type="hidden" name="page_transfer" value="0" />
</form>

和我正在使用的PHP代码尝试登录并抓取图表:

$username = 'demo@demo.com';
$password = 'demo';
$loginUrl = 'https://redacted/auth/login/';


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $loginUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'email='.$username.'&password='.$password.'&has_account=return&_token=PM2dY2hlbkPLvB97FyjL7cnPwryHXgfiex5050Iy&page_transfer=0');
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

$store = curl_exec($ch);

curl_setopt($ch, CURLOPT_URL, 'https://redacted/ucp/view-graph/157/0/1');

$content = curl_exec($ch);

curl_close($ch);

echo $content;

当前的输出是HTML将我重定向回他们的登录表单,我猜测是因为我在POST请求中遗漏了一些东西。我也在登录表单中看到令牌,我不确定,这可能与它有关吗?

2 个答案:

答案 0 :(得分:1)

当然。服务器可能拒绝任何不包含由同一服务器发出的令牌值的登录尝试。 我建议将标记值添加到已发布的字段中。

此外,您应首先get登录页面,以获得&#34;新鲜&#34;令牌,然后是post。让我补充一点,在您执行get后,您可能会收到一些cookie。您应该在post中发送的Cookie。我认为如果你不关闭手柄,curl默认会这样做。

答案 1 :(得分:0)

经过大量的游戏和alejandro的帮助,解决方案是向页面发送GET请求并收集令牌,下面的这些代码可以很好地满足我的需求。     

// Allocate, initialize, and add the automatic button.
_AutomaticSend = [[UISwitch alloc] initWithFrame:CGRectMake([self width] - 50.0, textAreaY + Center(160.0, textAreaHeight), 50.0, 50.0)];
[_AutomaticSend addTarget:self action:@selector(changeSwitch:) forControlEvents:UIControlEventValueChanged];