带重定向的python请求

kAl*_*own 7 python authentication redirect curl python-requests

尝试在http://72.ru网站上进行身份验证,注意到有一个重定向到https://loginka.ru/auth/。发现有 302 个带有数据形式的纯凭证的 POST。从 Chrome 复制标头可以在 cURL 中重现该标头,但仍然无法在 requests 模块中到达。

警告:页面全是俄文字母,注册在东北方的盒子里

with requests.Session() as s:
    s.auth = ('EMAIL', 'PASSWD')

    s.post('http://72.ru/passport/login.php')
    p = s.get('http://72.ru/job/favorite/vacancy/')

    # will print True if logged
    print('some title from favorite page, if logged' in p.text)
Run Code Online (Sandbox Code Playgroud)

为什么无法验证,我做错了什么?

jun*_*ony 9

我认为你需要指定allow_redirects=True

s.post('http://72.ru/passport/login.php', allow_redirects=True)
Run Code Online (Sandbox Code Playgroud)

  • **kwargs 传递给底层 requests.request 调用的可选参数 (2认同)

Vik*_*jha 2

有一种更简单的方法可以登录该网站。

import requests

headers = {
    "User-Agent":
        "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36",
}

s = requests.session()
s.headers.update(headers)

# There is a dedicated login page, which is the url of the Login button on the site, you can open that directly. 
# Requests will automatically take care of rediects
s.get('https://loginka.ru/auth/?url=http%3A%2F%2F72.ru')

# Generate the post data
data = {
    'url': 'http://72.ru',
    'email': username,
    'password': password
}

# Perform the post request
r = s.post('https://loginka.ru/auth/?url=http%3A%2F%2F72.ru', data=data)

# There is an extra post request on this site which uses token from redirect url
token = r.url[r.url.index('token=')+6:]
url = 'http://72.ru/put_token_to_user/?token=' + token + '&dummy_put_token_to_user=yes'
headers2 = {'X-Requested-With': 'XMLHttpRequest', 'Referer': r.url}
r = s.get(url, headers=headers2)

r = s.get('http://72.ru/passport/mypage.php')
print r.url
print r.status_code
with open('abc.txt', 'wb') as f:
    f.write(r.content)
Run Code Online (Sandbox Code Playgroud)