影刀RPA 网页登录处理:表单登录与状态判断
作者:林焱
什么情况用什么
很多网站的数据需要登录后才能看到——订单详情、个人消息、后台数据。在影刀RPA里需要自动化完成"输入账号密码→处理验证码→点击登录→判断是否成功→保持登录态"。登录是很多采集流程的前置步骤,处理不好后面的数据都拿不到。
适用场景:后台数据采集、个人订单导出、需要登录的社交平台采集、企业内部系统自动化操作。
怎么做
基本登录流程
店群矩阵自动化突破运营极限!
1. 【打开网页】→ 登录页面URL 2. 【等待元素出现】→ 账号输入框 3. 【输入文本】→ 账号 4. 【输入文本】→ 密码 5. 【点击元素】→ 登录按钮 6. 【等待页面跳转】→ 等待URL变化或登录后元素出现 7. 【判断】→ 登录是否成功影刀RPA登录流程
【打开网页】https://example.com/login 【等待元素出现】 目标:#username 超时:10秒 【输入文本】 目标:#username 内容:yd_var['account'] 【输入文本】 目标:#password 内容:yd_var['password']   【点击元素】 目标:#login-btn 【等待URL变化】 超时:15秒 【判断元素是否存在】 目标:.user-avatar, .welcome-msg 存在 → 登录成功 不存在 → 登录失败,检查错误提示登录状态判断
defcheck_login_status(driver=None):"""判断登录是否成功"""# 方法1:检查URL是否变化(登录后通常会跳转)# 影刀中用【获取当前URL】对比# 方法2:检查登录后才有的元素# 影刀中用【判断元素是否存在】→ .user-info# 方法3:检查错误提示# 影刀中用【判断元素是否存在】→ .error-msg# Python实现逻辑checks={'success_selectors':['.user-avatar','.welcome-msg','.logout-btn'],'error_selectors':['.error-msg','.login-error','.alert-danger'],}# 检查成功标志forselectorinchecks['success_selectors']:ifelement_exists(selector):return{'status':'success','message':'登录成功'}# 检查错误标志forselectorinchecks['error_selectors']:error_el=get_element_text(selector)iferror_el:return{'status':'error','message':error_el}return{'status':'unknown','message':'无法判断登录状态'}Cookie保持登录态
importrequestsimportjsonimportosclassLoginManager:"""登录管理器"""def__init__(self,cookie_file='cookies.json'):self.session=requests.Session()self.cookie_file=cookie_file self.headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}deflogin(self,username,password,login_url):"""登录并保存Cookie"""login_data={'username':username,'password':password,'remember':'true'}response=self.session.post(login_url,data=login_data,headers=self.headers,timeout=10)# 检查登录结果ifresponse.status_code==200:result=response.json()ifresult.get('success')orresult.get('code')==0:# 保存Cookieself.save_cookies()returnTruereturnFalsedefsave_cookies(self):"""保存Cookie到文件"""cookies=self.session.cookies.get_dict()withopen(self.cookie_file,'w')asf:json.dump(cookies,f)print(f"Cookie已保存到{self.cookie_file}")defload_cookies(self):"""从文件加载Cookie"""ifnotos.path.exists(self.cookie_file):returnFalsewithopen(self.cookie_file,'r')asf:cookies=json.load(f)forname,valueincookies.items():self.session.cookies.set(name,value)returnTruedefis_logged_in(self,check_url):"""检查登录态是否有效"""response=self.session.get(check_url,headers=self.headers,timeout=10)# 如果重定向到登录页,说明Cookie失效if'login'inresponse.url:returnFalse# 检查返回内容if'请登录'inresponse.textor'未登录'inresponse.text:returnFalsereturnTruedefensure_login(self,username,password,login_url,check_url):"""确保已登录(Cookie有效则跳过登录)"""# 先尝试用已保存的Cookieifself.load_cookies()andself.is_logged_in(check_url):print("Cookie有效,跳过登录")returnTrue# Cookie失效,重新登录print("Cookie失效,重新登录...")ifself.login(username,password,login_url):print("登录成功")returnTrueprint("登录失败")returnFalse# 使用manager=LoginManager(r"C:\Config\cookies.json")ifmanager.ensure_login('myuser','mypass','https://example.com/api/login','https://example.com/api/userinfo'):# 登录成功,可以采集数据response=manager.session.get('https://example.com/api/orders')data=response.json()影刀RPA中的Cookie管理
【设置变量】cookie_file = r"C:\Config\cookies.json" 【判断文件是否存在】cookie_file 存在 → 【读取文件】→ 加载Cookie 【注入Cookie到浏览器】 【打开网页】→ 检查页面 【判断元素是否存在】→ .user-info 存在 → Cookie有效,跳过登录 不存在 → Cookie失效,执行登录流程 不存在 → 执行登录流程 【登录流程】 【打开网页】→ 登录页 【输入文本】→ 账号 【输入文本】→ 密码 【点击元素】→ 登录按钮 【等待URL变化】 【获取Cookie】→ 保存到文件多账号登录管理
classMultiAccountManager:"""多账号管理"""def__init__(self,accounts_file):""" accounts_file: JSON文件,格式: [ {"username": "acc1", "password": "pwd1", "name": "账号1"}, {"username": "acc2", "password": "pwd2", "name": "账号2"} ] """withopen(accounts_file,'r')asf:self.accounts=json.load(f)self.current_account=Nonedefget_account(self,index):"""获取指定账号"""if0<=index<len(self.accounts):self.current_account=self.accounts[index]returnself.current_accountreturnNonedefget_cookie_file(self,account):"""获取账号对应的Cookie文件"""safe_name=account['name'].replace(' ','_')returnrf"C:\Config\cookies_{safe_name}.json"有什么坑
坑1:密码框被禁用或加密
temu店群自动化报活动案例
有些网站的密码框是先点击启用再输入,或者密码需要前端加密:
# 解决1:先点击密码框再输入# 影刀中:# 【点击元素】→ #password# 【等待】0.5秒# 【输入文本】→ 密码# 解决2:密码加密# 查看网站JS代码,找到加密算法# 常见的是MD5、Base64、RSAimporthashlib encrypted_password=hashlib.md5(password.encode()).hexdigest()# 解决3:用JavaScript直接设值并触发事件js=f""" var pwd = document.querySelector('#password'); pwd.value = '{password}'; pwd.dispatchEvent(new Event('input')); pwd.dispatchEvent(new Event('change')); """# 影刀【执行JavaScript代码】坑2:登录后页面跳转多次
# 问题:登录后先跳中间页再跳首页,等待URL变化可能提前触发# 解决:等待最终目标页面的特征元素# 影刀中:【等待元素出现】→ .dashboard(首页特征元素)# 而不是【等待URL变化】# 或者等待URL稳定defwait_for_url_stable(old_url,timeout=15):"""等待URL稳定不变"""importtime stable_count=0last_url=''for_inrange(timeout):time.sleep(1)current_url=get_current_url()# 影刀指令ifcurrent_url==last_urlandcurrent_url!=old_url:stable_count+=1ifstable_count>=2:returncurrent_urlelse:stable_count=0last_url=current_urlreturnlast_url坑3:登录触发验证码
# 解决1:检测验证码出现# 影刀中:# 【判断元素是否存在】→ .captcha-image# 存在 → 执行验证码处理流程# 解决2:降低登录频率# 同一账号10分钟内不要重复登录# 解决3:记住登录状态# 登录时勾选"记住我"/"7天免登录"# 保存Cookie,下次直接用Cookie# 解决4:验证码识别(如果必须处理)# 影刀中:# 【截图】→ 验证码区域# 【执行Python代码】→ OCR识别或打码平台# 【输入文本】→ 识别结果坑4:Cookie过期时间不确定
# 问题:Cookie可能1小时过期,也可能7天过期# 解决:每次使用前检查defsafe_request(session,url,login_func=None):"""安全请求(自动处理登录态过期)"""response=session.get(url,timeout=10)# 检测是否被重定向到登录页if'login'inresponse.urlorresponse.status_code==401:iflogin_func:print("登录态过期,重新登录...")login_func()response=session.get(url,timeout=10)returnresponse坑5:HTTPS证书问题
# 问题:企业内部系统用自签证书,requests报SSLError# 解决:禁用证书验证(仅限内部系统)response=session.get(url,verify=False,timeout=10)# 或者用影刀浏览器(不受证书限制)# 影刀浏览器默认忽略证书错误