2016-10-26 5 views
1

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

Я пытаюсь извлечь некоторые данные с сайта (battlefield.com), который требует аутентификации через другой сайт.

У меня есть следующий сценарий:

import requests 

url_login = "https://signin.ea.com/p/web/login?execution=e1567523006s1&initref=https%3A%2F%2Faccounts.ea.com%3A443%2Fconnect%2Fauth%3Fredirect_uri%3Dhttps%253A%252F%252Fwww.battlefield.com%252Flogin_check%26state%3D5223dcd1-5f9c-47a1-940c-1d6b306454f9%26response_type%3Dcode%26client_id%3DBattlefield-CoreWeb" 

url_bf = "https://www.battlefield.com/companion/career/mypersonalid/bf1" 

s = requests.Session() 

payload = { 
    "username": "myemail", 
    "password": "mypassword" 
} 

req1 = s.post(url_login, data=payload) 

req2 = s.get(url_bf) 

print (s.cookies) 

Когда я делаю этот процесс вручную, когда я иду в battlefield.com, нажмите войти, а затем страница перенаправляет меня на url_login странице. Затем я отправляю полезную нагрузку, и страница перенаправляет меня обратно на страницу битвы.

То, что я пытаюсь сделать, - это получить идентификатор сеанса с страницы боя после успешного входа в систему.

Выход скрипта выше (модифицировал SESSIONID и удаленные теги):

RequestsCookieJar[Cookie ealocale=en-us for .battlefield.com/, Cookie JSESSIONID=1DF14B ... 3DAF.eanshprdaccounts38 for signin.ea.com/p/] 

Но я не думаю, что это SESSIONID правильно. Когда я вручную проверить sessionID с помощью Chrome Inspector со страницы battlefield.com после входа в систему, имя сессии, как представляется, отличается и имеет совершенно другое значение:

Screenshot

Так что мой вопрос, как я могу получить BTLF_SESSID?

Заранее спасибо

+0

проверьте коды кодов запроса, также может быть полезно попробовать 'request.get ('http: // ...', allow_redirects = False)' и проверить эти ответы от службы входа – user3012759

+0

@ user3012759 Результат: то же самое, даже с allow_redirects = False – theManag3R

+0

@ user3012759 Коды ответов: req1: 302, req2: 200. Но ответ для req1 равен 302, хотя я ввожу недопустимые учетные данные и очищать файлы cookie ... Я не понимаю – theManag3R

ответ

1

Как смешно. Я просто смотрел на это тоже.

Вместо статического url_login попробуйте использовать перенаправление, чтобы установить переменную выполнения. Я не уверен, что это необходимо, но кажется, что это безопасная ставка.

Затем вы можете ссылаться на URL-адрес в ответе на свой POST-запрос.

Я также отправляю все данные формы со страницы входа, а не только имя пользователя и пароль.

, а затем получить auth.json

s = requests.Session() 

init_url = 'https://www.battlefield.com/login?postAuthUri=/companion' 
auth_json = 'https://www.battlefield.com/service/auth.json' 

init = s.get(init_url) 

login_payload = { 
    'rememberMe': 'on', 
    '_rememberMe': 'on', 
    'gCaptchaResponse': '', 
    '_eventId': 'submit', 
    'password': password 
    'email': email 
    } 

ea_login = s.post(init.url, data=login_payload) 

auth = s.get(auth_json) 

После этого последнего шага, если вы посмотрите на auth.json() вы должны увидеть полезную нагрузку с Gamertag, Pid, ​​возраст, и засвидетельствованы = True.

Я думаю, что после этого есть дополнительные шаги, чтобы получить статистику. Просто начните с вашего первого url в chrome с открытым devtools и посмотрите, что он делает в таблице Network (фильтр XHR). Также есть идентификаторы, сгенерированные для каждого запроса json, и идентификатор X-GatewaySession, который генерируется таким же образом, но инициализирован ранее, и похоже, что он должен быть сохранен для будущих запросов. Посмотрите в файле init.js, чтобы узнать, как они сгенерированы.

Кроме того, для вашего первоначального вопроса о BTLF_SESSID. Это просто уникальный идентификатор сеанса, он будет отличаться от вашего браузера и python, потому что это разные сеансы. И я думаю, вы можете игнорировать его, сеанс запросов позаботится о передаче этих данных на сервер сам по себе.

+0

Да, X-GatewaySession - единственная проблема, которую я оставил. Я не знаю, как это получить. Я просматривал страницу с помощью devtools в Chrome, и я застрял в api? Companion.IsLoggedIn. Кажется, что есть два IsLoggedIn, а в первой части X-GateWaySession нет. Но внезапно это появляется во второй части. Мне удалось получить X-GatewayTraceID, но я не знаю, связано ли это каким-либо образом ... Но все работает, если я получаю sessionid вручную, благодаря вашему коду! – theManag3R

+0

Хорошо, наконец, понял. SessionID пришел через accounts.ea, и для этого мне нужен токен auth. После передачи этого токена API: Companion.loginFromAuthCode, он дал мне sessionID. Благодарим за помощь! – theManag3R