0

我正在使用 PHP 登录到我的 Microsoft 帐户并执行一两个操作。到目前为止,我已经意识到您需要一个 PPFT 令牌作为 CSRF 令牌才能登录到微软。我正在这样做:

$PPFT = file_get_contents('http://login.live.com');

preg_match('/id\="i0327" value\="(.*?)"\//', $PPFT, $key);

$ch = curl_init('https://login.live.com/ppsecure/post.srf');
$query = http_build_query(array('login' => 'MY_EMAIL_ADDRESS@gmail.com', 'passwd' => '_MY_EMAIL_ADDRESS_PASSWORD', 'PPFT' => "{$key[1]}"));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // for https
curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36','Origin: https://login.live.com','Content-Type: application/x-www-form-urlencoded; charset=UTF-8','Referer: https://login.live.com/'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$result = curl_exec($ch);

curl_close($ch);

var_dump($result);

它给了我:

string(512) "HTTP/1.1 200 OK
Cache-Control: max-age=0
Content-Length: 6777
Content-Type: text/html; charset=utf-8
Expires: Fri, 20 Feb 2015 15:33:19 GMT
Server: Microsoft-IIS/8.5
P3P: CP="DSP CUR OTPi IND OTRi ONL FIN"
X-XSS-Protection: 0
X-Content-Type-Options: nosniff
Set-Cookie: MSPOK=$uuid-49105e9d-c262-4b46-9fa7-710d3058e6fe; domain=login.live.com;secure= ;path=/;HTTPOnly= ;version=1
X-Frame-Options: deny
PPServer: PPV: 30 H: BAYIDSLGN1B021 V: 0
Date: Fri, 20 Feb 2015 15:34:19 GMT
Connection: close

这当然不行。

如果您抱怨更多标题,请查看此图像。

使用 jquery (javascript)。我可以通过在https://login.live.com上运行此 javascript 来登录我自己的帐户

x = document.createElement('script');
x.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js';
document.body.appendChild(x);

$.post('https://login.live.com/ppsecure/post.srf', 
{ 
login: 'MY_EMAIL_ADDRESS@gmail.com', 
passwd : 'MY_PASSWORD', 
PPFT : 'Cke!8IRbHV6V95QHkcbjUrMQWetwe7vQchGSnm1*l8NpcMMCeTqAGLZ8xjeFF7NzHJ3enl6ycLRUn0iCgoncbOPyLNPozOq2miY33O0TKGMRZWm70T*7PyslhBIJxvHumMpWH7tbEcIU0HRWs7cgdchinYgQzt85aoktbtrJTTz72Vo5qltscLxChJeOZ73mcg$$' 
}, 
function(data, status, xhr) { console.log(data+"\n"+status+"\n"+xhr.getAllResponseHeaders()); 
});

它工作正常。检查此屏幕截图:

在此处输入图像描述

但是在 PHP 上,微软似乎知道我正在使用 PHP。为什么我可以使用 javascript $.post 请求而不是 PHP 登录?这是因为我从 file_get_contents 请求 PPFT 令牌并使用 cURL 发布数据吗?但是 cURL 的 HTML 具有与 file_get_contents() 相同的标记。那么有什么问题呢?

  • 请帮我。自从 4 小时以来,我就对此感到震惊!:(
4

1 回答 1

1

看起来您缺少 Curl 中的重定向。jQuery 在浏览器中,所以它会自动跟随重定向。另一方面,默认情况下 Curl 不遵循重定向。

将此添加到您的 PHP curl 请求并给我们结果

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

跟进。

我尝试了多种方式来做到这一点,但似乎没有奏效。我什至获取了整个登录页面,将其显示在我的服务器上,然后正确填写并提交,但由于登录凭据错误而被拒绝。

我的猜测是微软正在检查远程客户端地址并确保提交实际上来自微软登录网络服务器,而不仅仅是任何地方。这对我来说似乎很合理。

如果我上面的假设是正确的,那么您将需要使用更像爬虫的东西来获取内容。我访问的大多数微软网站都使用了大量的 javascript,这意味着您需要启用 javascript 的爬虫。这将是一个新问题。这是一个关于Make a JavaScript-aware Crawler 或 this one Web crawler Parsing PHP/Javascript links 的问题的链接?

于 2015-02-20T16:07:44.990 回答