具有Webidentity和转发功能的python登录门户

时间:2018-11-29 23:13:32

标签: python request

我使用Python请求,尝试登录一个门户URL,该URL会转发到另一个URL。我已经读过关于该主题的几篇文章,甚至尝试过:

1)使用请求get和检索csrf令牌创建会话

2)使用上一步中的csrf令牌,并在门户URL上做一个帖子,有效负载为用户名/密码/和csrf令牌(与我使用开发人员工具时传递的信息相同。

3)步骤2之后,我仍然获得以下p.text作为用户名和密码,并且没有显示登录后的页面并表明它正在寻找我登录

s = requests.Session()
g = s.get("myPortalURL")
resp = g.text
for item in resp.split("\n"):
    if "csrf_token" in item:
        print (item)
        csrfToken = item.strip().split("value=")[1].replace("\"", "").replace("/>","")

data = {'Username': self.pythonDataDict["portalUsername"], 'Password': self.pythonDataDict["portalPassword"],
           'csrf_token': csrfToken}

print ("payload= ", data)
headers = {'content-type': 'application/x-www-form-urlencoded'}
p = s.post("myPortalURL", headers=headers, data=data)
soup = BeautifulSoup(p.text)
print (p.text)

1 个答案:

答案 0 :(得分:1)

以下是您的代码可能存在的问题:

  1. 根据个人经验;登录页面的URL应该不同于主页的URL。

  2. data中缺少信息,全部的所需数据需要以表单形式输入,

  3. 您可能需要包括其他请求标头

  4. 根据令牌的性质,您获取csrf_token的代码可能倾向于返回不正确的数据(尽管所有令牌都会有所不同,因此可能不会)

此外,例如,在使用会话时,使用with语句通常更惯用

with requests.Session() as s:
    initial_response = s.get("login_url")
    # def createForm()...
    main_response = s.get("target_url", data = data, headers = headers)
    # rest of code...

如果可以的话,如果您可以包括要访问的页面的URL,这也将非常有帮助。