0

我正在尝试使用 curl-php 登录到 2shared,但由于某种原因,它只是返回了我的登录页面,并且没有在 cookie 文件中设置正确的 cookie。下面是我的代码。谢谢你的帮助。

$user = "";
$pass = "";
$cookie = "cookie.txt";

$jsonp = 'jsonp'.time();

if (file_exists($cookie)) {
    unlink($cookie);
}

$post = array(
    "login" => $user,
    "password" => $pass,
    "callback" => $jsonp
);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "http://www.2shared.com/login?callback=".$jsonp);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-Requested-With: XMLHttpRequest'));
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);    
curl_setopt($ch, CURLOPT_REFERER, 'http://www.2shared.com/');       
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0");
curl_setopt($ch, CURLOPT_ENCODING, "UTF-8" );

$return = curl_exec($ch);
curl_close($ch);

echo $return;

编辑:

当我通过浏览器登录并通过 HTTP 分析器查看流量时,我注意到在点击登录按钮后它会返回此数据并重定向到 loginRedirect 对象,我注意到它设置了一些在我执行 php-curl 请求时不会出现的 cookie:

{
    "ok":true,
    "rejectReason":"",
    "loginRedirect":"http://www.2shared.com/account/homeDoorway.jsp;jsessionid=3F253C7C641C7A8402D4AC9872C1CEAE.dc282?rand=0.8112776952920494",
    "loggedIn":"myemail@email.com",
    "needActivation":false
}

但是,当尝试使用上面的代码 curl-php 登录时,它会返回以下数据:

jsonp1339804887({
    "ok":true,
    "rejectReason":"",
    "loginRedirect":"http://www.2shared.com/login.jsp?sessionUnavailable=1",
    "loggedIn":"",
    "needActivation":false
}) 
4

2 回答 2

2

在进行网络抓取时,与往常一样,关键是与使用浏览器手动完成的记录会话进行比较(例如使用 LiveHTTPHeaders 或类似工具)。然后确保您的脚本发送的请求与记录的请求尽可能相似。

如果你这样做了,你会看到...

2shared 上的登录表单似乎没有使用多部分表单,因此您将 $array 传递给 CURLOPT_POSTFIELDS 是错误的。它应该只是一个形式为“login=$name&password=$secret”的字符串。这就是说,这可能不是您方法中的唯一缺陷。

于 2012-06-26T08:06:14.740 回答
0

这可能只是黑暗中的短暂,但在我看来,您实际上应该查看重定向并遵循它。该错误消息确实表明您实际上不在服务器端的正常会话中 - 会话标识是您将被重定向到但选择不跟随的地址的一部分。;jsessionid=3F253C7C641C7A8402D4AC9872C1CEAE.dc282后半部分?rand=0.8112776952920494出现了——对我来说!– 作为系统也希望发回的随机数。我将把它当作一个简单的令牌机制来确保请求实际上是新鲜的,而不是像试图进入的脚本之类的东西:-)

另外,您确定您使用的回调机制(随着时间的推移)确实很有意义吗?

您是否尝试过无辜地进入登录页面,等待重定向弹出,然后从那里启动您的其他代码?

于 2012-06-26T08:15:14.677 回答