php curl войти на espn.com - PullRequest
0 голосов
/ 29 июня 2018

Я пробую так много разных вещей и не нахожу никакого решения, чтобы войти с помощью cUrl на http://www.espn.com/login/, и после входа я хочу получить защищенную область пароля http://games.espn.com/ffl/clubhouse?leagueId=93772&teamId=1&seasonId=2018

что я пытаюсь использовать, это:

$username = 'email';
$password = 'password!';
$loginUrl = 'http://www.espn.com/login/';

//init curl
$ch = curl_init();

//Set the URL to work with
curl_setopt($ch, CURLOPT_URL, $loginUrl);

// ENABLE HTTP POST
curl_setopt($ch, CURLOPT_POST, 1);

//Set the post parameters
curl_setopt($ch, CURLOPT_POSTFIELDS, 'user='.$username.'&pass='.$password);

//Handle cookies for the login
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');

//Setting CURLOPT_RETURNTRANSFER variable to 1 will force cURL
//not to print out the results of its query.
//Instead, it will return the results as a string return value
//from curl_exec() instead of the usual true/false.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

//execute the request (the login)
$store = curl_exec($ch);

//the login is now done and you can continue to get the
//protected content.
sleep(3);
//set the URL to the protected file
curl_setopt($ch, CURLOPT_URL, 'http://games.espn.com/ffl/clubhouse?leagueId=93772&teamId=1&seasonId=2018');

//execute the request
$content = curl_exec($ch);

curl_close($ch);

//save the data to disk
file_put_contents('download.txt', $content);

но опять не получает html после входа в скрипт!

1 Ответ

0 голосов
/ 06 июля 2018

процедура входа в систему на этой странице далеко сложнее, чем это делает ваш код, также это очень необычно, это первая система входа на сайт, которую я Вы видели, что не использует куки (что является почти универсальным способом сделать это) - вот как войти в систему:

1: отправить OPTIONS запрос на https://registerdisney.go.com/jgc/v6/client/ESPN-ONESITE.WEB-PROD/api-key?langPref=en-US с заголовками Access-Control-Request-Method: POST и Access-Control-Request-Headers: cache-control,content-type,conversation-id,correlation-id,expires,pragma и Origin: https://cdn.registerdisney.go.com, он ответит заголовком, похожим на correlation-id: 13fb884f-d873-4344-9f32-fdeaa64cec7c, вы должны разобрать и сохранить этот заголовок идентификатора корреляции.

2: это сложно, вам нужно сгенерировать conversation-id, я извлек алгоритм генерации для вас, он был спрятан глубоко в минимизированном js, он генерируется функцией uuid, которая выглядит следующим образом:

function f() { return g() + g() + "-" + g() + "-" + g("4") + "-" + g((Math.floor(10 * Math.random()) % 4 + 8).toString(16)) + "-" + g() + g() + g() }

function g(e) { for (var t = Math.floor(65535 * Math.random()).toString(16), n = 4 - t.length; n > 0; n--) t = "0" + t; return e = ("" + e).substring(0, 4), !isNaN(parseInt(e, 16)) && e.length ? e + t.substr(e.length) : t }

function uuid(){return f();}

(и поскольку вы используете PHP, а не javascript, вы должны преобразовать этот код в PHP. Это довольно тривиально, если вы знаете как javascript, так и PHP, i cba atm), вывод выглядит примерно так: conversation-id: e2e3b494-2b67-4fe1-b0a2-21e0f7fa84ff, когда это генерируется, сохраните его. Теперь отправьте запрос POST на https://registerdisney.go.com/jgc/v6/client/ESPN-ONESITE.WEB-PROD/api-key?langPref=en-US с телом запроса, буквально содержащим строку null, и с заголовками Referer: https://cdn.registerdisney.go.com/v2/ESPN-ONESITE.WEB-PROD/en-US?include=config,l10n,js,html&scheme=http&postMessageOrigin=http%3A%2F%2Fwww.espn.com%2Flogin%2F&cookieDomain=www.espn.com&config=PROD&logLevel=LOG&topHost=www.espn.com&cssOverride=https%3A%2F%2Fsecure.espncdn.com%2Fcombiner%2Fc%3Fcss%3Ddisneyid%2Fcore.css&responderPage=https%3A%2F%2Fwww.espn.com%2Flogin%2Fresponder%2F&buildId=16388ed5943 и Content-Type: application/json и conversation-id: $conversation_id и correlation-id: $correlation_id (и обратите внимание, заголовок referer является жестко закодированным и подделка, вы не перенаправлены на этот URL, но код javascript написан, чтобы подделать его, чтобы он выглядел так, как будто это был редирект. странное дерьмо, верно?)

ответ будет содержать заголовок api-key, похожий на api-key: MR6UpmRG0VAqAvKStLzof79sbb+1w/HHBextDPqktXf9eXoDfklhgRMFKBpOqt5j63AqoYFx0VHH7/eePYnuw9U7Rg1F, вы должны разобрать и сохранить этот ключ API.

3: сделать запрос OPTIONS для https://ha.registerdisney.go.com/jgc/v6/client/ESPN-ONESITE.WEB-PROD/guest/login?langPref=en-US HTTP/1.1 с заголовками Access-Control-Request-Method: POST и Access-Control-Request-Headers: authorization,cache-control,content-type,conversation-id,correlation-id,expires,pragma и Origin: https://cdn.registerdisney.go.com

примечание: он даст вам новый токен корреляционного идентификатора в заголовке, но игнорируйте его, он, кажется, нигде не используется, старый корреляционный токен - это 1, который вы должны продолжать использовать для следующий запрос.

4: сделать запрос POST для https://ha.registerdisney.go.com/jgc/v6/client/ESPN-ONESITE.WEB-PROD/guest/login?langPref=en-US, тело должно быть json-кодировано с именем пользователя и паролем, и оно выглядит как json_encode(array('loginValue'=>$username,'password'=>$password)), с заголовками Referer: https://cdn.registerdisney.go.com/v2/ESPN-ONESITE.WEB-PROD/en-US?include=config,l10n,js,html&scheme=http&postMessageOrigin=http%3A%2F%2Fwww.espn.com%2Flogin%2F&cookieDomain=www.espn.com&config=PROD&logLevel=LOG&topHost=www.espn.com&cssOverride=https%3A%2F%2Fsecure.espncdn.com%2Fcombiner%2Fc%3Fcss%3Ddisneyid%2Fcore.css&responderPage=https%3A%2F%2Fwww.espn.com%2Flogin%2Fresponder%2F&buildId=16388ed5943 и Content-Type: application/json и Authorization: APIKEY $api_key ( обратите внимание, вы должны буквально начать его с строки APIKEY в верхнем регистре, за которой следует пробел и фактический ключ API, который вы извлекли ранее), correlation-id: $correlation_id и conversation-id: $conversation_id и Origin: https://cdn.registerdisney.go.com

здесь он отвечает json, предположительно, если вход в систему успешен, элемент json error пуст, но, например, когда имя пользователя не существует, объект ошибки содержит, среди прочего, следующий: Error: invalid_grant, Description: 'PROFILE.NOT_FOUND', Code: AUTHENTICATION_FAILED"}

(имеется в виду имя пользователя, которое я использовал, foo, не существует.)

если вход был успешным, я предполагаю, что он дает вам токен или cookie, которые вы можете дать http://games.espn.com/ffl/clubhouse?leagueId=93772&teamId=1&seasonId=2018, чтобы проверить страницу, когда вы вошли в систему, но так как у меня нет действительного имени пользователя / пароля чтобы проверить, я не могу подтвердить это.

...