процедура входа в систему на этой странице далеко сложнее, чем это делает ваш код, также это очень необычно, это первая система входа на сайт, которую я Вы видели, что не использует куки (что является почти универсальным способом сделать это) - вот как войти в систему:
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, чтобы проверить страницу, когда вы вошли в систему, но так как у меня нет действительного имени пользователя / пароля чтобы проверить, я не могу подтвердить это.