2016-10-26 1 views
1

우선 프로그래밍 방침은 대부분 서버 측 스크립팅으로 제한되어 있으며, 웹 사이트를 구문 분석하려고 할 때 처음 사용하는 것이므로 내 질문에 어리 석다면 용서해주십시오.파이썬에서 리디렉션을 통해 세션 ID를 얻는 중

다른 사이트를 통한 인증이 필요한 웹 사이트 (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를 가져 오는 것입니다.

위 (sessionid를 제거 태그를 수정) 된 스크립트의 출력 :

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

하지만이 sessionID와 올바른 생각하지 않습니다. 내가 수동으로 로그인 한 후 battlefield.com 페이지에서 크롬 검사기를 사용하여 sessionID을 검사 할 때, 세션의 이름을 다른 것으로 보인다과는 완전히 다른 값이 있습니다

Screenshot

그래서 내 질문입니다, BTLF_SESSID을 얻으려면 어떻게해야합니까?

미리 감사드립니다.

+0

요청 상태 코드를 확인하고'requests.get ('http : // ...', allow_redirects = False) '를 시도해보고 로그인 서비스에서받은 응답을 검사 할 가치가 있습니다. – user3012759

+0

@ user3012759 결과는 다음과 같습니다. allow_redirects = False 일지라도 – theManag3R

+0

@ user3012759 응답 코드는 req1 : 302, req2 : 200입니다. 유효하지 않은 자격 증명을 입력하고 쿠키를 지우더라도 req1에 대한 응답은 302입니다. 이해할 수 없습니다. – theManag3R

답변

1

얼마나 재미 있어요. 나는 이것도보고 있었다.

정적 url_login을 사용하는 대신 리디렉션을 사용해보십시오. 그러면 실행 변수가 설정됩니다. 이것이 필요한지 확실하지 않지만 안전한 내기처럼 보입니다.

그러면 로그인 POST에 대한 응답에서 url을 참조 할 수 있습니다.

사용자 이름과 비밀번호뿐 아니라 로그인 페이지에서 모든 양식 데이터를 전송합니다.

그리고 당신은 당신이 당신의 게이머 태그, PID, 나이가 페이로드를 참조해야한다() auth.json에서보고, = 진정한 인증 된 경우 그 마지막 단계 후 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) 

를 가져옵니다.

실제로 통계를 얻기 위해 몇 가지 추가 단계가 있다고 생각합니다. devtools가 열리는 크롬의 첫 번째 URL에서 시작하여 Network 표 (XHR 기준 필터)에서 수행중인 작업을 살펴보십시오. 또한 각 json 요청에 대해 생성 된 ID와 동일한 방법으로 생성되었지만 이전에 초기화 된 ID이며 이후 요청에 대해 저장해야하는 것처럼 보이는 X-GatewaySession ID가 있습니다. init.js 파일을 보면 어떻게 생성되는지 볼 수 있습니다.

또한 원래 질문이 BTLF_SESSID 인 경우. 이것은 고유 한 세션 식별자 일 뿐이며, 다른 세션이므로 브라우저와 파이썬간에 차이가납니다. 그리고 나는 그것을 무시할 수 있다고 생각합니다. 요청 세션은 그 데이터를 서버에 직접 전달할 것입니다.

+0

예, X-GatewaySession은 제가 떠난 유일한 문제입니다. 나는 그것을 얻는 방법을 모른다. Chrome에서 devtools 페이지를보고 있었는데 api에 붙어 있습니까? Companion.IsLoggedIn 부분입니다. 두 개의 IsLoggedIn이있는 것으로 보이며 첫 번째 부분에서는 X-GateWaySession이 없습니다. 하지만 갑자기 두 번째 부분에 나타납니다. X-GatewayTraceID를 얻을 수 있었지만 어떤 식 으로든 관련이 있는지 알 수는 없습니다 ... 코드를 사용하여 수동으로 sessionid를 가져 오면 모든 것이 작동합니다! – theManag3R

+0

좋아, 마침내 얻었습니다. sessionID는 accounts.ea를 통해 왔으며이를 위해 인증 토큰이 필요했습니다. 이 토큰을 API : Companion.loginFromAuthCode에 전달한 후 sessionID를 주었다. 도움 주셔서 감사합니다. – theManag3R

관련 문제