登录到2共享站点时,使用curl php登录站点不起作用

登录到2共享站点时,使用curl php登录站点不起作用,php,libcurl,Php,Libcurl,我正在尝试使用curl php登录到2shared,但由于某些原因,它只返回我的登录页面,并且没有在cookie文件中设置正确的cookie。下面是我的代码。谢谢你的帮助 $user = ""; $pass = ""; $cookie = "cookie.txt"; $jsonp = 'jsonp'.time(); if (file_exists($cookie)) { unlink($cookie); } $post = array( "login" => $use

我正在尝试使用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 analyzer查看流量时,我注意到在点击“登录”按钮后,它返回此数据并重定向到LoginDirect对象,我注意到它设置了一些cookie,在我执行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
}
但当尝试使用上述代码登录时,它会返回以下数据:

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

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

如果你那样做了,你会看到


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

这可能只是黑暗中的一小部分,但在我看来,您实际上应该查看重定向并遵循它。错误消息确实表明您实际上不在服务器端正在运行的会话中,并且会话标识是地址的一部分,您本应被重定向到该地址,但选择不遵循该地址<代码>;jsessionid=3F253C7C641C7A8402D4AC9872C1CEAE.dc282后面的部分
?rand=0.8112776952920494
出现在我面前作为一个随机数,系统还希望返回。我将把它作为一个简单的令牌机制,以确保请求实际上是新的,而不是像试图进入的脚本一样:-)

另外,您是否确定(随着时间的推移)使用的回调机制有这么大的意义


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

你有没有仔细阅读过其他网站上的19打100个
cURL登录,但没有相关问题?是的,事实上我也开发了12个,但从未遇到过类似的问题,所以在这里寻求帮助。让我们换个位置,我问了这个问题,你正在尝试解决它。到底怎么了?什么证明有效/无效?尝试了什么?会发生什么?错误?任何东西这看起来像99%的一般性问题“我的卷发不管用了,你能发现为什么吗?”的所有意图和目的。主要是因为除了代码没有其他细节。帮助我们帮助你,告诉我们发生了什么事的细节。我更新了帖子,提供了更多信息。谢谢你的时间。我重新格式化了它,以便让其他人更容易理解。谢谢你的回复,但问题是我以数组形式发送帖子数据,而不是Daniel提到的字符串…所有问题都解决了…Regard我刚刚注意到,我真不敢相信你是“Daniel Stenberg”:)谢谢先生,你是传奇人物,我是你作品的忠实粉丝:)……上帝保佑你谢谢你的好话!