首先,我的编程背景主要限于服务器端脚本,这是我第一次尝试解析网站,所以如果我的问题很荒谬,请原谅我。
我试图从网站(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
时,会话的名称似乎不同,并且它具有完全不同的值:
所以我的问题是,如何获得BTLF_SESSID
?
提前谢谢
答案 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之间会有所不同,因为它们是不同的会话。我认为你可以忽略它,请求会话将负责将数据单独传递给服务器。