Я использую PHP, чтобы войти в мою учетную запись Microsoft и выполнить действие или два. Я до сих пор понял, что вам нужен токен PPFT в качестве токена CSRF войти в Microsoft. Я делаю это:
$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' => '[email protected]', '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). Я могу войти в свою учетную запись, запустив этот JavaScript на https://login.live.com
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: '[email protected]',
passwd : 'MY_PASSWORD',
PPFT : 'Cke!8IRbHV6V95QHkcbjUrMQWetwe7vQchGSnm1*l8NpcMMCeTqAGLZ8xjeFF7NzHJ3enl6ycLRUn0iCgoncbOPyLNPozOq2miY33O0TKGMRZWm70T*7PyslhBIJxvHumMpWH7tbEcIU0HRWs7cgdchinYgQzt85aoktbtrJTTz72Vo5qltscLxChJeOZ73mcg$$'
},
function(data, status, xhr) { console.log(data+"\n"+status+"\n"+xhr.getAllResponseHeaders());
});
И это прекрасно работает. Проверьте этот скриншот:
Но на PHP это выглядит так, будто Microsoft знает, что я использую PHP. Как я могу войти с помощью javascript $ .post запроса, но не PHP? Это потому, что я запрашиваю токен PPFT из file_get_contents и размещаю данные с помощью cURL? Но HTML-код cURL имеет те же токены, что и file_get_contents (). Так что не так?
Похоже, вы пропустили перенаправление в Curl. JQuery находится в браузере, поэтому он будет автоматически следовать перенаправлению. Curl с другой стороны по умолчанию не следует за перенаправлениями.
Добавьте это к вашему запросу PHP curl и дайте нам результат
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
Следовать за.
Я пытался сделать это различными способами, и это, похоже, не работает. Я даже получил всю страницу для входа в систему, отобразил ее на своем сервере, а затем правильно заполнил и отправил, и она была отклонена из-за неверных учетных данных для входа.
Я предполагаю, что Microsoft проверяет адрес удаленного клиента и проверяет, что отправка действительно происходит с веб-сервера входа в Microsoft, а не где-то еще. Это кажется мне очень разумным.
Если мое предположение выше верно, то вам нужно будет использовать что-то более похожее на сканер, чтобы добраться до контента. Большинство сайтов Microsoft, которые я посещаю, имеют большой объем JavaScript, что означает, что вам нужен сканер с поддержкой JavaScript. Это должен быть новый вопрос. Вот ссылка на вопрос об этом Сделайте Crawler с поддержкой JavaScript
или этот
Веб-сканер Разбор PHP / Javascript ссылок?
Других решений пока нет …