使用请求登录身份验证

时间:2016-03-11 00:14:24

标签: python-requests

我正在尝试处理请求(python 3.4)来创建一个会话,我登录gamefaqs.com并导航到一个棋盘页面,以便我可以删除内容以获取我正在尝试的相关信息去完成。我直接从firefox中的开发者控制台复制了头和有效负载信息。

import requests
import urllib3

url = 'http://www.gamefaqs.com/user/login'
url2 = 'http://www.gamefaqs.com/user/Leight_Weight/boards'

header = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'en-US,en;q=0.5',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0',
    'Referer': 'http://www.gamefaqs.com/',
    'Connection': 'keep-alive',
    'Host': 'www.gamefaqs.com',
    }

payload = {
    'path': "http://www.gamefaqs.com/",
    'key': "71548de4",
    'EMAILADDR': "username",
    'PASSWORD': "password",
    }

with requests.Session() as s:
    p = s.get(url, headers=header)
    p = s.post(url, headers=header, data=payload, cookies = s.cookies)

我遇到的问题是我没有收到从网站传递到我的会话的身份验证cookie。我正在使用fiddler来跟踪来自Python的帖子请求。尽管请求头信息与firefox中的请求头信息相同,但响应头信息却大不相同。

来自firefox的响应头(由Fiddler看到): Firefox Response Header

来自Python的响应头(由Fiddler看到): Python Response Header

此时我有点失落。据我所知,我的代码是合理的,请求标头是正确的,但是没有收到验证cookie证明有问题。如果查看响应头,则代码不同(302 vs 200)。我不确定错误是什么。

1 个答案:

答案 0 :(得分:0)

事实证明 - 有效负载项'键'根据您的会话而变化。我最初没有抓住这个,因为我没有想到浏览器通过打开/关闭使用持久性cookie的事实,这个解决方案没有使用。

我使用BeautifulSoup做了一些严谨的方法来找到正确的键值,但结果保持不变。一旦我获得了适当的密钥值,我就会在执行post命令和中提点之前将其添加到有效负载中 - 成功登录。

为了后人,代码如下。

import requests
from bs4 import BeautifulSoup as bs

url = 'http://www.gamefaqs.com/user/login'
url2 = 'http://www.gamefaqs.com/user/Leight_Weight/boards'

header = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'en-US,en;q=0.5',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0',
    'Referer': 'http://www.gamefaqs.com/',
    'Connection': 'keep-alive',
    'Host': 'www.gamefaqs.com',
    }

payload = {
    'PASSWORD': "password",
    'path': "http://www.gamefaqs.com/",
    'EMAILADDR': "username",
    }

with requests.Session() as s:
    resp = s.get(url, headers=header)
    parse = bs(resp.text)
    keyval = parse.find_all('form')[1].contents[1]['value']
    payload['key'] = keyval
    p = s.post(url, headers=header, data=payload)