我正在使用 MechanicalSoup 通过 Python 3.6 登录网站,但我遇到了 CSRF 令牌问题。
每次我请求返回 html 时,我都会阅读“无效的 CSRF 令牌:禁止”。在登录页面上搜索 html,与标记相似的元素 id 最接近的匹配项是“autheticity_token”,它似乎已经用标记填充了。
我能够使用“re”模块来提取令牌并将其重新提交给具有我上面谈到的 id 但没有运气的元素。请注意,我必须通过 id 找到元素,因为没有为其提供名称(这就是为什么我的 Robobrowser 方法不起作用的原因)。
这是我认为对应于 CSRF 的元素:
<input id="authenticity_token" type="hidden" value="b+csp/9zR/a1yfuPPIYJSiR0v8jJUTaJaGqJmJPmLmivSn4GtLgvek0nyPvcJ0aOgeo0coHpl94MuH/r1OK5UA==">
在这种情况下,我将提取 "b+csp/9zR/a1yfuPPIYJSiR0v8jJUTaJaGqJmJPmLmivSn4GtLgvek0nyPvcJ0aOgeo0coHpl94MuH/r1OK5UA==" 并将其重新提交给该元素
这是我的代码,其中包含用户、密码和 url 的虚拟值
import mechanicalsoup
import re
def return_token(str1):
match1 = "authenticity_token"
match2 = ".*value\=\"(.*)\".*"
for x in range(len(str1)):
line = str1[x]
if re.findall(match1,line):
token = re.findall(match2,line)[0]
return token
url1 = ""
username = ""
password = ""
browser = mechanicalsoup.Browser()
page = browser.get(url1)
str0 = page.text
token = return_token(str0.split('\n'))
#print(str0)
form = page.soup.find("form",{"id":"loginForm"})
form.find('input', {'name': 'username'})['value'] = username
form.find('input', {'name': 'password'})['value'] = password
form.find('input', {'id': 'authenticity_token'})['value'] = str(token)
response = browser.submit(form, page.url)
print(response.text)