路过csrftoken与蟒蛇请求(Passing csrftoken with python Req

2019-06-21 07:10发布

你如何通过使用Python模块请求csrftoken? 这是我有什么,但它不工作,我不知道哪个参数,将其传递到(数据,标题,AUTH ...)

import requests
from bs4 import BeautifulSoup

URL = 'https://portal.bitcasa.com/login'

client = requests.session(config={'verbose': sys.stderr})

# Retrieve the CSRF token first
soup = BeautifulSoup(client.get('https://portal.bitcasa.com/login').content)
csrftoken = soup.find('input', dict(name='csrfmiddlewaretoken'))['value']

login_data = dict(username=EMAIL, password=PASSWORD, csrfmiddlewaretoken=csrftoken)
r = client.post(URL, data=login_data, headers={"Referer": "foo"})

每一次同样的错误消息。

<h1>Forbidden <span>(403)</span></h1>
<p>CSRF verification failed. Request aborted.</p>

Answer 1:

如果你要设置引荐头,则该特定网站,您需要为引荐设置为相同的URL作为登录页面:

import sys
import requests

URL = 'https://portal.bitcasa.com/login'

client = requests.session()

# Retrieve the CSRF token first
client.get(URL)  # sets cookie
if 'csrftoken' in client.cookies:
    # Django 1.6 and up
    csrftoken = client.cookies['csrftoken']
else:
    # older versions
    csrftoken = client.cookies['csrf']

login_data = dict(username=EMAIL, password=PASSWORD, csrfmiddlewaretoken=csrftoken, next='/')
r = client.post(URL, data=login_data, headers=dict(Referer=URL))

当使用不安全的http ,在Referer标题往往是过滤掉,否则很具有欺骗性,无论如何,所以大多数站点不再要求要设置的头。 但是,使用SSL连接时,如果它被设置,它有一定道理的网站,以验证它至少引用一个在逻辑上已经发起请求的东西。 Django的执行此当连接被加密的(使用https:// ),积极需要它然后。



Answer 2:

类似地,使用Django的csrf_client 注意到主要区别是使用 login_data csrftoken.value。 经过测试和Django 1.10.5 -

import sys

import django
from django.middleware.csrf import CsrfViewMiddleware, get_token
from django.test import Client

django.setup()
csrf_client = Client(enforce_csrf_checks=True)

URL = 'http://127.0.0.1/auth/login'
EMAIL= 'test-user@test.com'
PASSWORD= 'XXXX'

# Retrieve the CSRF token first
csrf_client.get(URL)  # sets cookie
csrftoken = csrf_client.cookies['csrftoken']

login_data = dict(username=EMAIL, password=PASSWORD, csrfmiddlewaretoken=csrftoken.value, next='/')
r = csrf_client.post(URL, data=login_data, headers=dict(Referer=URL))


文章来源: Passing csrftoken with python Requests