首页 > 解决方案 > 带有网络身份和转发的python登录门户

问题描述

使用 Python 请求,我试图登录一个转发到另一个 URL 的门户 URL。我已经阅读了几篇关于这个主题的帖子,甚至尝试过:

1) 使用请求获取和检索 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)

标签: pythonrequest

解决方案


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

  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,这也将非常有帮助。


推荐阅读