影刀RPA Cookie与Session管理:登录态保持
影刀RPA Cookie与Session管理登录态保持作者林焱什么情况用你的影刀流程需要登录某个网站才能采集数据每次运行都要手动输入账号密码登录后操作了几分钟突然又跳回登录页提示登录已过期同一账号在多个流程中都要用每次都登录太麻烦Cookie和Session管理是解决登录态保持的核心技能。把登录后的Cookie保存下来下次直接加载就能跳过登录步骤。在影刀RPA中合理管理Cookie可以大幅提升流程效率和稳定性。本文讲清楚Cookie是什么、怎么保存和加载Cookie、怎么处理登录态过期。怎么做一、Cookie的基本概念概念说明在影刀中的体现Cookie浏览器存在本地的键值对影刀浏览器可读取/写入Session服务器端的会话状态通过Cookie中的SessionID关联| 登录态 | 登录后服务器发Cookie | 有Cookie就是已登录状态 || 过期时间 | Cookie的有效期 | 到期后需要重新登录 |核心原理登录成功后服务器返回一个包含SessionID的Cookie。后续请求带上这个Cookie服务器就知道你是已登录用户。Cookie过期了就需要重新登录。二、影刀RPA中的Cookie操作拼多多店群自动化报活动上架影刀浏览器支持Cookie管理操作【获取Cookie】→ 获取当前浏览器的所有Cookie保存到变量 【设置Cookie】→ 将Cookie写入浏览器 【删除Cookie】→ 清除指定Cookie 三、保存和加载Cookie的完整方案步骤1首次登录并保存Cookieimportjsonimportosdefsave_cookies(cookie_data,filepathcookies.json):保存Cookie到文件withopen(filepath,w,encodingutf-8)asf:json.dump(cookie_data,f,ensure_asciiFalse,indent2)print(fCookie已保存到{filepath})defload_cookies(filepathcookies.json):从文件加载Cookieifnotos.path.exists(filepath):print(fCookie文件不存在{filepath})returnNonewithopen(filepath,r,encodingutf-8)asf:try:returnjson.load(f)exceptjson.JSONDecodeError:print(Cookie文件格式错误)returnNonedefis_cookie_valid(cookie_data):检查Cookie是否过期importtimeifnotcookie_data:returnFalsecurrent_timetime.time()forcookieincookie_data:# 检查expiry字段expirycookie.get(expiry)ifexpiryandexpirycurrent_time:returnFalsereturnTrue步骤2流程中的Cookie使用逻辑defensure_login(url,cookie_filecookies.json):确保已登录状态# 1. 尝试加载已保存的Cookiecookiesload_cookies(cookie_file)ifcookiesandis_cookie_valid(cookies):# 2. 有有效Cookie先设置到浏览器print(加载已保存的Cookie...)# 在影刀中使用【设置Cookie】指令设置每个Cookieforcookieincookies:# 设置Cookie的逻辑pass# 3. 打开页面检查是否处于登录状态# 在影刀中【打开网页】url# 检查页面上是否有登录后的元素is_logged_incheck_login_status()ifis_logged_in:print(Cookie有效已登录)returnTrueelse:print(Cookie已失效需要重新登录)# 4. Cookie无效或不存在执行登录print(执行登录流程...)do_login()# 5. 登录成功后保存新Cookienew_cookiesget_all_cookies()# 获取浏览器当前Cookiesave_cookies(new_cookies,cookie_file)print(新Cookie已保存)returnTruedefcheck_login_status():检查是否已登录# 检查页面上是否存在登录后才有的元素# 例如用户头像、退出按钮、个人中心链接等# 在影刀中用【判断元素是否存在】指令# 假设检查用户头像元素# return yd_var[avatar_exists]passdefdo_login():执行登录操作# 在影刀中用指令实现登录流程# 1. 【打开网页】登录页URL# 2. 【填写输入框】用户名# 3. 【填写输入框】密码# 4. 【点击】登录按钮# 5. 【等待元素出现】登录后页面的标志性元素pass四、用Selenium管理Cookiefromseleniumimportwebdriverimportjsonimporttimedeflogin_and_save_cookies(login_url,username,password,cookie_file):登录并保存Cookiedriverwebdriver.Chrome()# 1. 打开登录页driver.get(login_url)time.sleep(2)# 2. 填写用户名密码driver.find_element(By.ID,username).send_keys(username)driver.find_element(By.ID,password).send_keys(password)# 3. 点击登录driver.find_element(By.ID,login-btn).click()time.sleep(3)# 4. 验证登录成功ifdashboardindriver.current_url:# 5. 获取所有Cookiecookiesdriver.get_cookies()# 6. 保存到文件withopen(cookie_file,w)asf:json.dump(cookies,f)print(f登录成功Cookie已保存{len(cookies)}个)returndriverelse:print(登录失败)returnNonedefload_cookies_and_visit(driver,url,cookie_file):加载Cookie并访问页面# 1. 先打开同域的任意页面必须先打开页面才能设置Cookiedriver.get(url)time.sleep(1)# 2. 删除现有Cookiedriver.delete_all_cookies()# 3. 加载保存的Cookiewithopen(cookie_file,r)asf:cookiesjson.load(f)forcookieincookies:# Selenium添加Cookie需要特定格式# 有些字段需要去掉否则会报错cookie.pop(sameSite,None)cookie.pop(httpOnly,None)try:driver.add_cookie(cookie)exceptExceptionase:print(f添加Cookie失败{e})# 4. 刷新页面Cookie生效driver.get(url)time.sleep(2)# 5. 检查登录状态ifdashboardindriver.current_url:print(Cookie加载成功已登录)returnTrueelse:print(Cookie已失效需要重新登录)returnFalse五、Cookie过期处理defauto_relogin(login_func,check_func,max_retries3):自动检测登录态并重登forattemptinrange(max_retries):# 1. 检查当前是否登录ifcheck_func():returnTrueprint(f登录态失效第{attempt1}次尝试重新登录...)# 2. 执行登录iflogin_func():# 3. 登录成功保存新Cookiesave_current_cookies()time.sleep(2)# 4. 再次验证ifcheck_func():print(重新登录成功)returnTruetime.sleep(5)print(f重登失败已尝试{max_retries}次)returnFalse六、多账号Cookie管理importjsonimportosclassCookieManager:多账号Cookie管理器def__init__(self,cookie_dircookies):self.cookie_dircookie_dir os.makedirs(cookie_dir,exist_okTrue)defget_cookie_path(self,account_name):获取账号对应的Cookie文件路径returnos.path.join(self.cookie_dir,f{account_name}.json)defsave(self,account_name,cookies):保存账号Cookiepathself.get_cookie_path(account_name)withopen(path,w,encodingutf-8)asf:json.dump(cookies,f,ensure_asciiFalse,indent2)print(f账号{account_name}Cookie已保存)defload(self,account_name):加载账号Cookiepathself.get_cookie_path(account_name)ifnotos.path.exists(path):returnNonewithopen(path,r,encodingutf-8)asf:returnjson.load(f)defis_expired(self,account_name):检查Cookie是否过期cookiesself.load(account_name)ifnotcookies:returnTruecurrent_timetime.time()forcookieincookies:expirycookie.get(expiry)ifexpiryandexpirycurrent_time:returnTruereturnFalsedeflist_accounts(self):列出所有已保存的账号filesos.listdir(self.cookie_dir)accounts[f.replace(.json,)forfinfilesiff.endswith(.json)]returnaccounts# 使用示例managerCookieManager()# 保存账号A的Cookiemanager.save(account_a,driver.get_cookies())# 加载账号B的Cookiecookies_bmanager.load(account_b)ifcookies_b:forcookieincookies_b:driver.add_cookie(cookie)driver.refresh()# 检查哪些账号Cookie过期了foraccountinmanager.list_accounts():ifmanager.is_expired(account):print(f账号{account}的Cookie已过期)有什么坑坑1设置Cookie前必须先打开同域页面现象直接设置Cookie报错unable to set cookie。原因浏览器要求在设置Cookie前必须先访问过该域名下的页面。这是浏览器的安全机制。解决先打开目标域的任意页面即使是需要登录的页面也没关系然后再设置Cookie最后刷新页面。坑2Cookie的域名匹配问题现象保存了.example.com域名的Cookie访问www.example.com时却没带上。原因Cookie的domain字段决定了哪些子域名会发送该Cookie。.example.com表示所有子域名www.example.com只匹配www子域名。解决保存Cookie时注意domain字段。如果要在多个子域名间共享确保domain以.开头如.example.com。加载时不要修改domain字段。TEMU店群矩阵自动化运营核价报活动坑3Session超时不是Cookie过期现象Cookie还没过期但服务器端的Session已经失效了访问页面还是跳到登录页。原因Cookie的过期时间和服务器端Session的超时时间是两个概念。Cookie可能有效期7天但服务器Session可能30分钟不活动就过期了。解决定期访问一个需要登录的页面来激活Session。如果长时间不操作后访问返回登录页执行重新登录流程。不要只依赖Cookie的expiry判断要以实际页面状态为准。坑4Cookie中的token字段现象有些网站不用传统的Session Cookie而是用JWT Token存在Cookie或localStorage中。保存了Cookie但还是没登录态。原因现代网站可能用多种方式存储认证信息——Cookie、localStorage、sessionStorage。只保存Cookie可能不够。解决同时保存localStorage中的token。在影刀中用【执行JavaScript脚本】获取localStorage// 获取所有localStoragevarstorage{};for(vari0;ilocalStorage.length;i){varkeylocalStorage.key(i);storage[key]localStorage.getItem(key);}returnJSON.stringify(storage);加载时varstorage/* 从文件读取的JSON */;for(varkeyinstorage){localStorage.setItem(key,storage[key]);}坑5验证码导致自动登录失败现象Cookie失效后自动重新登录但登录页弹出了验证码自动登录流程卡住了。解决在登录流程中加入验证码检测——如果检测到验证码元素出现暂停流程并通知人工处理。或者接入验证码识别服务。不要让流程在验证码页面死循环重试。