我当前正在使用Python请求,并且需要CSRF令牌才能登录到站点。根据我的理解,requests.Session()获取cookie,但是显然我需要令牌。而且我也想知道在我的代码中放置它的位置。 导入请求
user_name = input('Username:')
payload = {
'username': 'user_name',
'password': 'randompass123'
}
with requests.Session() as s:
p = s.post('https://examplenotarealpage.com', data=payload)
答案 0 :(得分:1)
请参见以下代码示例。您可以直接使用它登录仅使用cookie来存储登录信息的网站。
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选择器。查看示例:
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, 'lxml')
csrf_token = soup.select_one('meta[name="csrf-token"]')['content']
它可以在带有JavaScript代码的脚本标签内。得到它会很棘手。但是,您始终可以使用regex来隔离它。
答案 1 :(得分:0)
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.检查您的name属性以获取csrf令牌和form_build_id
通过打印(r.content)
并找到csrftoken和form-build-id并检查其name属性。
搜索登出,然后登录。