如何使用Python Requests登录多页面CAS认证系统?
用Python Requests登录TAMU分步式CAS系统
我之前处理过这种分两步输入用户名/密码的CAS登录场景,咱们一步步来实现:
核心思路
这个CAS系统把登录拆成了两个阶段:
- 提交用户名后,系统验证用户存在,才展示密码输入框
- 提交密码完成最终认证
我们需要用requests.Session()来维持会话(自动管理Cookie),并且在每个阶段解析页面里的隐藏表单参数(CAS登录必须的lt、execution、_eventId等)。
具体实现步骤
首先确保你安装了必要的库:
pip install requests beautifulsoup4
然后是代码示例:
import requests from bs4 import BeautifulSoup # 配置你的账号信息 USERNAME = "你的TAMU用户名" PASSWORD = "你的TAMU密码" LOGIN_URL = "https://cas.tamu.edu/cas/login" SERVICE_URL = "https://howdy.tamu.edu/uPortal/Login" # 初始化会话,模拟浏览器请求头 session = requests.Session() session.headers.update({ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" }) def get_form_params(html_content): """解析HTML页面,提取CAS登录所需的隐藏表单参数""" soup = BeautifulSoup(html_content, "html.parser") form = soup.find("form", {"id": "fm1"}) params = {} # 提取所有隐藏输入字段 for input_tag in form.find_all("input", type="hidden"): params[input_tag.get("name")] = input_tag.get("value") return params try: # 第一步:访问初始登录页面,获取初始表单参数和Cookie initial_response = session.get(LOGIN_URL, params={"service": SERVICE_URL, "renew": "true"}) initial_params = get_form_params(initial_response.text) # 添加用户名到参数,提交第一阶段请求 initial_params["username"] = USERNAME first_submit_response = session.post(LOGIN_URL, data=initial_params, params={"service": SERVICE_URL, "renew": "true"}) # 第二步:解析密码页面的表单参数 password_page_params = get_form_params(first_submit_response.text) # 添加密码到参数,提交第二阶段请求 password_page_params["password"] = PASSWORD final_response = session.post(LOGIN_URL, data=password_page_params, params={"service": SERVICE_URL, "renew": "true"}) # 验证登录是否成功:访问Howdy主页看看 howdy_response = session.get("https://howdy.tamu.edu/uPortal/") if "Welcome" in howdy_response.text: print("登录成功!") else: print("登录失败,请检查账号信息或CAS页面结构是否变化") except Exception as e: print(f"请求过程出错: {str(e)}")
关键注意事项
- 会话维持:必须用
requests.Session(),它会自动保存和发送Cookie,这是CAS认证的核心 - 表单参数:CAS的每个登录请求都需要
lt(登录票据)、execution(会话ID)这些动态生成的参数,不能硬编码,必须从页面解析 - 请求头:一定要设置合理的
User-Agent,否则CAS系统可能会拦截非浏览器请求 - 页面结构变化:如果后续TAMU修改了CAS页面的表单字段ID或参数名,需要重新调整
get_form_params函数里的解析逻辑
内容的提问来源于stack exchange,提问作者SlupSax
相关产品推荐
相关产品推荐

