通过Python

时间:2016-10-26 08:23:48

标签: python http session cookies https

首先,我的编程背景主要限于服务器端脚本,这是我第一次尝试解析网站,所以如果我的问题很荒谬,请原谅我。

我试图从网站(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/]

但我不认为此会话ID是正确的。当我在登录后使用来自battlefield.com页面的Chrome Inspector手动检查sessionID时,会话的名称似乎不同,并且它具有完全不同的值:

Screenshot

所以我的问题是,如何获得BTLF_SESSID

提前谢谢

1 个答案:

答案 0 :(得分:1)

多好笑。我也只是看着这个。

不要使用静态url_login尝试使用重定向,因此设置了执行变量。我不确定这是否需要,但这似乎是一个安全的赌注。

然后,您可以在响应中引用您的登录POST的URL。

我还会从登录页面发送所有表单数据,而不仅仅是用户名和密码。

然后获取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,age和authenticated = True的有效载荷。

我认为在此之后还有一些额外的步骤来实际获取您的统计数据。只需从你的第一个url开始,然后打开devtools,看看它在Network表下做了什么(通过XHR过滤)。此外,还为每个json请求生成了ID,X-GatewaySession ID以相同的方式生成,但是之前已初始化,看起来需要保存以供将来的请求使用。查看init.js文件以查看它们是如何生成的。

另外,关于BTLF_SESSID的原始问题。这只是一个唯一的会话标识符,它在浏览器和python之间会有所不同,因为它们是不同的会话。我认为你可以忽略它,请求会话将负责将数据单独传递给服务器。