首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用python请求获取CSRF令牌

使用python请求获取CSRF令牌
EN

Stack Overflow用户
提问于 2018-07-16 03:16:20
回答 2查看 22.2K关注 0票数 7

我目前正在使用Python请求,需要一个CSRF令牌来登录站点。根据我的理解,requests.Session()获得了cookie,但显然我需要令牌。我还想知道在我的代码中把它放在哪里。导入请求

代码语言:javascript
复制
user_name = input('Username:')
payload = {
'username': 'user_name',
'password': 'randompass123'
}


with requests.Session() as s:
p = s.post('https://examplenotarealpage.com', data=payload)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-16 03:42:53

请参见下面的代码示例。您可以直接使用它登录到只使用cookies存储登录信息的网站。

代码语言:javascript
复制
import requests

LOGIN_URL = 'https://examplenotarealpage.com'
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}

response = requests.get(LOGIN_URL, headers=headers, verify=False)

headers['cookie'] = '; '.join([x.name + '=' + x.value for x in response.cookies])
headers['content-type'] = 'application/x-www-form-urlencoded'
payload = {
    'username': 'user_name',
    'password': 'randompass123'
}

response = requests.post(LOGIN_URL, data=payload, headers=headers, verify=False)
headers['cookie'] = '; '.join([x.name + '=' + x.value for x in response.cookies])

CSRF令牌有几个可能的位置。不同的网站使用不同的方式将其传递给浏览器。以下是其中的一些:

  • 它可以附带响应头,在这种情况下,获取它很容易。
  • 有时页面元包含CSRF令牌。您必须解析页面的html内容才能获得它。找到适合它的CSS选择器。请看示例:

从bs4导入BeautifulSoup soup = BeautifulSoup(response.text,'lxml') csrf_token =lxml可以在带有JavaScript代码的脚本标记内。要获得它将是一件棘手的事情。但是,您始终可以使用regex将其隔离。

票数 14
EN

Stack Overflow用户

发布于 2020-04-08 00:36:56

代码语言:javascript
复制
import requests
from bs4 import BeautifulSoup
headers = {'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 
           (KHTML, like Gecko) Chromium/80.0.3987.160 Chrome/80.0.3987.163 
           Safari/537.36'
 }
login_data = {
             'name' : 'USERNAME',
             'pass' : 'PASSWORD',
             'form_id':'new_login_form',
             'op':'login'
  }

with requests.Session() as s:
    url = 'https://www.codechef.com/'
    r = s.get(url,headers=headers,verify=False)
    #print(r.content) # to find name of csrftoken and form_build_id
    soup = BeautifulSoup(r.text, 'lxml')

    csrfToken = soup.find('input',attrs = {'name':'csrfToken'})['value']
    form_build_id = soup.find('input',attrs = {'name':'form_build_id'}) 
    ['value']

    login_data['csrfToken'] = csrfToken
    login_data['form_build_id'] = form_build_id

    r = s.post(url,data=login_data,headers = headers)
    print(r.content)

您可以直接使用它,但需要更改的内容很少:

1.在浏览器网络选项中检查用户代理

2.通过打印(r.content)检查csrf-token和form_build_id的name属性,找到csrftoken和form-build-id并检查它们的name属性。

最后一步:

在您的r.content中搜索注销,如果是他们的,则您正在登录。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51351443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档