import os import sys import time import psutil import json from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from urllib.parse import urlparse from selenium.common.exceptions import WebDriverException from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options def check_route_cookie(driver):#检查cookie是否有效 """ 检查当前页面的 cookies 中是否包含特定的 route 值。 参数: driver: WebDriver 实例 返回: 1 - 如果 cookies 中存在 route 且其值为 "adef3cfba742b03d8aed0b1f92f60144" 0 - 否则 """ try: # 获取当前页面的所有 cookies cookies = driver.get_cookies() # 遍历 cookies,检查是否存在目标 route 值 for cookie in cookies: if cookie['name'] == 'route' and cookie['value'] == 'adef3cfba742b03d8aed0b1f92f60144': return 1 return 0 # 如果未找到符合条件的 route 值,则返回 0 except Exception as e: print(f"检查 cookie 时发生错误: {e}") return 0 def modify_cookie_and_navigate(driver):#修改cookie并重跳登录界面 """ 当 `check_route_cookie(driver)` 返回 0 时,修改当前页面的 cookie 中的 route 值, 刷新页面后跳转到指定链接。 """ # 检查 cookie 中的 route 值 if check_route_cookie(driver) == 0: # 修改 cookie 的 route 值 new_cookie = { 'domain': urlparse(driver.current_url).netloc, # 使用当前页面的域名 'name': 'route', 'path': '/', 'value': 'adef3cfba742b03d8aed0b1f92f60144' } driver.delete_cookie('route') # 删除旧的 route cookie driver.add_cookie(new_cookie) # 添加新的 route cookie print("已修改 cookie 中的 route 值为 'adef3cfba742b03d8aed0b1f92f60144'") # 刷新页面 # 跳转到指定页面 navigate_with_retry(driver, "https://portal.nxist.com/sso/dskjlogin") # 示例调用 # from selenium import webdriver # driver = webdriver.Edge() # driver.get("https://example.com") # 替换为实际页面 # modify_cookie_and_navigate(driver) def navigate_with_retry(driver, url, retries=3, wait_time=5):#带重试功能的打开链接 attempt = 0 while attempt < retries: try: driver.get(url) # 尝试访问URL return # 如果成功访问,则直接返回 except WebDriverException as e: if 'ERR_CONNECTION_TIMED_OUT' in str(e): # 如果是连接超时错误 print(f"连接超时,正在重试 {attempt + 1}/{retries}...") attempt += 1 time.sleep(wait_time) # 等待一段时间后重试 driver.refresh() # 刷新页面 else: print(f"发生错误:{e}") break print("所有重试次数已用完,无法加载页面。") # 使用示例 #driver = webdriver.Edge() # 或者你使用其他浏览器,例如 Chrome #url = "https://portal.nxist.com/sso/dskjlogin" #navigate_with_retry(driver, "https://portal.nxist.com/sso/dskjlogin") # 启动 Edge 浏览器并打开指定的初始页面 def start_browser_initial_page(): options = webdriver.ChromeOptions() options.add_argument('--start-maximized') # 启动时最大化窗口 driver = webdriver.Chrome(options=options) navigate_with_retry(driver, "https://www.baidu.com/") update_status_in_browser(driver, "欢迎使用小易教务快速登录系统!2秒后自动打开教务系统!") return driver # 检查并确保浏览器进入指定域名 def check_and_navigate_to_correct_domain(driver): navigate_with_retry(driver, "https://portal.nxist.com/sso/dskjlogin") # 跳转到登录页面 while True: current_url = driver.current_url parsed_url = urlparse(current_url) current_domain = parsed_url.netloc # 获取域名部分 if current_domain in ["portal.nxist.com", "10.100.100.141", "cas.nist.edu.cn", "login.work.weixin.qq.com"]: update_status_in_browser(driver, f"已进入指定域名: {current_domain}") break # 如果是指定域名,退出循环 else: update_status_in_browser(driver, f"当前域名 ({current_domain}) 非预期,正在跳转...") navigate_with_retry(driver, "https://portal.nxist.com/sso/dskjlogin") # 跳转到指定页面 time.sleep(1) # 每秒检查一次 update_status_in_browser(driver, "欢迎使用小易教务快速登录系统!若界面非登录界面请复制连接打开(多试几次):https://portal.nxist.com/sso/dskjlogin") def new_cookie(driver): # 定义要添加的 Cookie new_cookie = { "domain": "10.100.100.141", "name": "route", "path": "/", "value": "adef3cfba742b03d8aed0b1f92f60144" } # 添加 Cookie driver.add_cookie(new_cookie) # 验证 Cookie 是否添加成功 cookies = driver.get_cookies() print(f"当前所有 Cookies: {cookies}") def new_cookie1(driver): # 获取当前页面的所有 cookies cookies = driver.get_cookies() # 创建新的 route cookie(JSON字符串) new_route_cookie_str = '{"domain": "portal.nxist.com", "name": "route", "path": "/", "value": "adef3cfba742b03d8aed0b1f92f60144"}' # 将 JSON 字符串解析为字典 new_route_cookie = json.loads(new_route_cookie_str) # 将旧 cookie 和新创建的 route cookie 一起添加到浏览器 for cookie in cookies: driver.delete_cookie(cookie['name']) # 删除旧的 cookie(确保不会重复) driver.add_cookie(cookie) # 重新添加原有 cookie # 添加新创建的 route cookie driver.add_cookie(new_route_cookie) update_status_in_browser(driver, "test") # 显示 # 刷新页面 driver.refresh() update_status_in_browser(driver, "已添加新的 route cookie,正在刷新页面...") time.sleep(1) def update_status_in_browser(driver, message): script = f""" var statusDiv = document.getElementById("status"); if (!statusDiv) {{ statusDiv = document.createElement("div"); statusDiv.id = "status"; statusDiv.style.position = "fixed"; statusDiv.style.top = "10px"; statusDiv.style.left = "10px"; statusDiv.style.padding = "10px"; statusDiv.style.backgroundColor = "rgba(0, 0, 0, 0.7)"; statusDiv.style.color = "white"; statusDiv.style.fontSize = "16px"; statusDiv.style.zIndex = "9999"; document.body.appendChild(statusDiv); }} statusDiv.innerText = "{message}"; """ try: driver.execute_script(script) except Exception as e: print(f"执行 JavaScript 时出错: {e}") # 检查当前页面域名是否为指定的域名 def check_and_wait_for_correct_domain(driver): update_status_in_browser(driver, "正在检测当前页面域名...") while True: current_url = driver.current_url parsed_url = urlparse(current_url) current_domain = parsed_url.netloc # 获取域名部分 if current_domain in ["portal.nxist.com", "10.100.100.141","cas.nist.edu.cn","login.work.weixin.qq.com"]: update_status_in_browser(driver, f"已进入指定域名: {current_domain}") break # 如果是指定域名,退出循环 else: update_status_in_browser(driver, f"当前域名 ({current_domain}) 非预期,正在跳转...") navigate_with_retry(driver, "https://portal.nxist.com/sso/dskjlogin") # 跳转到指定页面 time.sleep(1) # 每秒检查一次 # 检查当前页面域名是否为指定的域名 def check_and_wait_for_correct_domain1(driver): update_status_in_browser(driver, "正在检测当前页面域名...") while True: current_url = driver.current_url parsed_url = urlparse(current_url) current_domain = parsed_url.netloc # 获取域名部分 if current_domain in ["portal.nxist.com", "10.100.100.141","cas.nist.edu.cn"]: update_status_in_browser(driver, f"已进入指定域名: {current_domain}") break # 如果是指定域名,退出循环 else: update_status_in_browser(driver, f"当前域名 ({current_domain}) 非预期,正在跳转...") navigate_with_retry(driver, "https://portal.nxist.com/sso/dskjlogin") # 跳转到指定页面 time.sleep(1) # 每秒检查一次 # 等待页面加载完成,直到页面 URL 包含特定字符串 def wait_for_login(driver):#防跳转其他界面。 #check_and_wait_for_correct_domain(driver) # 检查并等待正确域名 #current_url = driver.current_url # parsed_url = urlparse(current_url) # current_domain = parsed_url.netloc # 获取域名部分 while True: current_url = driver.current_url parsed_url = urlparse(current_url) current_domain = parsed_url.netloc if current_domain!="cas.nist.edu.cn": check_and_wait_for_correct_domain break else: update_status_in_browser(driver, "欢迎使用小易教务快速登录系统!请耐心等待...") time.sleep(1) while True: current_url = driver.current_url parsed_url = urlparse(current_url) current_domain = parsed_url.netloc if current_domain!="login.work.weixin.qq.com": check_and_wait_for_correct_domain1 break else: update_status_in_browser(driver, "欢迎使用小易教务快速登录系统!请耐心等待...") time.sleep(1) while True: current_url = driver.current_url parsed_url = urlparse(current_url) current_domain = parsed_url.netloc if current_domain!="cas.nist.edu.cn": check_and_wait_for_correct_domain break else: update_status_in_browser(driver, "欢迎使用小易教务快速登录系统!请耐心等待...") time.sleep(1) update_status_in_browser(driver, "欢迎使用小易教务快速登录系统!请耐心等待...") WebDriverWait(driver, 600).until(EC.url_contains("https://portal.nxist.com/jwglxt/xtgl/index_initMenu.html")) update_status_in_browser(driver, f"登录成功! 当前页面: {driver.current_url}") # 获取当前页面的 cookies def get_cookies(driver): update_status_in_browser(driver, "获取用户信息。。。") cookies = driver.get_cookies() return cookies # 修改 cookies 中的 'route' 值 def modify_route_cookie(cookies, driver): for cookie in cookies: if cookie['name'] == 'route': cookie['value'] = 'adef3cfba742b03d8aed0b1f92f60144' # 修改 route 值 driver.delete_cookie('route') driver.add_cookie(cookie) update_status_in_browser(driver, "修改参数。。。") # 刷新页面并获取更新后的 cookies def refresh_and_get_cookies(driver): update_status_in_browser(driver, "向服务器请求内网登录。。。") driver.refresh() time.sleep(3) # 获取当前 cookies cookies = driver.get_cookies() # 查找并验证 'route' cookie route_cookie = next((cookie for cookie in cookies if cookie['name'] == 'route'), None) while True: if route_cookie and route_cookie['value'] == 'adef3cfba742b03d8aed0b1f92f60144': update_status_in_browser(driver, "route cookie 修改成功!") break else: update_status_in_browser(driver, "route cookie 修改失败,正在重试...") time.sleep(1) time.sleep(1) # 等待页面刷新完成 while True: current_url = driver.current_url parsed_url = urlparse(current_url) current_domain = parsed_url.netloc # 获取域名部分 if current_domain in ["portal.nxist.com", "10.100.100.141","cas.nist.edu.cn"]: update_status_in_browser(driver, f"已进入指定域名: {current_domain}") break # 如果是指定域名,退出循环 else: update_status_in_browser(driver, f"当前域名 ({current_domain}) 非预期,正在跳转...") navigate_with_retry(driver, "https://portal.nxist.com/jwglxt/xtgl/index_initMenu.html") time.sleep(1) # 每秒检查一次 cookies = driver.get_cookies() return cookies # 将 cookies 写回浏览器 def set_cookies_in_browser(driver, cookies): update_status_in_browser(driver, "写入值。。。") for cookie in cookies: if isinstance(cookie, dict): # 确保cookie是字典 driver.delete_cookie(cookie['name']) driver.add_cookie(cookie) # 打开目标页面 def open_target_page(driver): navigate_with_retry(driver, "http://10.100.100.141/jwglxt/xtgl/login_slogin.html") while True: current_url = driver.current_url parsed_url = urlparse(current_url) current_domain = parsed_url.netloc # 获取域名部分 if current_domain in ["portal.nxist.com", "10.100.100.141","cas.nist.edu.cn"]: update_status_in_browser(driver, f"已进入指定域名: {current_domain}") break # 如果是指定域名,退出循环 else: update_status_in_browser(driver, f"当前域名 ({current_domain}) 非预期,正在跳转...") navigate_with_retry(driver, "http://10.100.100.141/jwglxt/xtgl/login_slogin.html") # 跳转到指定页面 time.sleep(1) # 每秒检查一次 update_status_in_browser(driver, f"强制登录成功!你可以操作了!当前页面: {driver.current_url}") # 检查浏览器进程是否仍在运行 def is_browser_running(driver): try: # 获取浏览器的进程 ID browser_pid = driver.service.process.pid for proc in psutil.process_iter(['pid', 'name']): if proc.info['pid'] == browser_pid and 'msedge' in proc.info['name'].lower(): return True except Exception as e: print(f"错误: {e}") return False # 检查浏览器是否关闭 def check_browser_closed(driver): if not is_browser_running(driver): update_status_in_browser(driver, "浏览器已关闭,程序退出。") driver.quit() # 关闭浏览器 sys.exit(0) # 退出程序 #QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ # 主程序执行流程 def main(): driver = start_browser_initial_page()#打开浏览器并初始化页面 check_and_navigate_to_correct_domain(driver)#打开登录界面 wait_for_login(driver)#等待人工登录 check_route_cookie(driver)#检查cookie是否有效 while True: if check_route_cookie(driver)==0:#如果cookie无效 modify_cookie_and_navigate(driver)#修改cookie并跳转登录页 wait_for_login(driver)#等待人工登录 check_route_cookie(driver)#检查cookie是否有效 else:#如果cookie有效 cookies = get_cookies(driver)#获取cookie for cook in cookies:#修改cookie生效于10.100.100.141 if 'domain' in cook: cook['domain'] = '10.100.100.141' update_status_in_browser(driver, "登录内网。。请确保已连接校园网!!!") navigate_with_retry(driver, "http://10.100.100.141") driver.delete_cookie(cook['name'])#删除旧cookie driver.add_cookie(cook) #添加新cookie new_cookie(driver) navigate_with_retry(driver, "http://10.100.100.141/jwglxt/xtgl/login_slogin.html") update_status_in_browser(driver, "test") # 显示 break #new_cookie(driver) #navigate_with_retry(driver, "http://10.100.100.141/jwglxt/xtgl/login_slogin.html") #new_cookie(driver)#给当前界面创建新cookie #new_cookie1(driver) #wait_for_login(driver) #cookies = get_cookies(driver) #time.sleep(1) #modify_route_cookie(cookies, driver) #refresh_and_get_cookies(driver) #cookies = get_cookies(driver) # 修改 cookies 的 Domain 值 #for cook in cookies: # if 'domain' in cook: # cook['domain'] = '10.100.100.141' # update_status_in_browser(driver, "登录内网。。请确保已连接校园网!!!") #navigate_with_retry(driver, "http://10.100.100.141") # 将 JSON 字符串解析为字典 #cook = json.loads(cook) # 将旧 cookie 和新创建的 route cookie 一起添加到浏览器 #for cookie in cook: #driver.delete_cookie(cookie['name']) # 删除旧的 cookie(确保不会重复) #driver.add_cookie(cookie) # 重新添加原有 cookie # 添加新创建的 route cookie # driver.delete_cookie(cook['name']) # driver.add_cookie(cook) #navigate_with_retry(driver, "http://10.100.100.141/jwglxt/xtgl/login_slogin.html") #update_status_in_browser(driver, "test") # 显示 #set_cookies_in_browser(driver, cook) # while True: #current_url = driver.current_url #parsed_url = urlparse(current_url) #current_domain = parsed_url.netloc # 获取域名部分 #if current_domain in ["portal.nxist.com", "10.100.100.141","cas.nist.edu.cn"]: # update_status_in_browser(driver, f"已进入指定域名: {current_domain}") # break # 如果是指定域名,退出循环 #else: #update_status_in_browser(driver, f"当前域名 ({current_domain}) 非预期,正在跳转...") # navigate_with_retry(driver, "http://10.100.100.141/jwglxt/xtgl/login_slogin.html") #time.sleep(1) # 每秒检查一次 # 将修改后的 cookies 写回浏览器 #set_cookies_in_browser(driver, cook) #open_target_page(driver) update_status_in_browser(driver, "你可以操作了!感谢使用小易教务快速登录系统!") # 检查浏览器是否仍在运行,直到浏览器关闭后退出脚本 #while is_browser_running(driver): time.sleep(86400) # 每秒检查一次浏览器进程 # print("浏览器已关闭,脚本退出。") #driver.quit() # 关闭浏览器 if __name__ == "__main__": main()