影刀RPA店群自动化教程:Python协同浏览器请求拦截与智能Mock实战
影刀RPA店群自动化教程Python协同浏览器请求拦截与智能Mock实战页面加载了五秒有三秒在加载无关的广告和统计脚本。平台的一个非关键接口超时整个自动化流程就僵在那里不动。店群矩阵自动化突破运营极限做店群自动化久了你会发现浏览器的网络请求是最大的不确定性来源。一个商品编辑页面背后可能发起了几十个请求——有获取商品详情的有检查库存的有埋点上报的有拉取广告位的。自动化流程真正需要的可能只有其中两三个请求的响应数据。但其他请求却在消耗带宽、占用连接、拖慢页面渲染。更糟糕的是某些请求不稳定时比如第三方CDN的字体文件加载超时整个页面的ready状态都会被延迟导致影刀脚本卡在“等待页面加载完成”这一步。我们后来利用Chrome DevTools Protocol的Fetch域构建了一套请求拦截与智能Mock系统。这套系统运行在浏览器层对影刀流程完全透明却能让页面加载速度提升、减少外部依赖、并增强自动化流程的稳定性。一、请求拦截的能力边界我们不是在做黑产首先要明确一点我们拦截的是浏览器发出的请求而不是篡改平台的业务数据。拦截的目标是三类请求temu店群自动化报活动案例无关的第三方资源广告、统计、字体、社交媒体挂件等屏蔽后页面加载更快可Mock的查询接口某些只读接口如获取类目树、运费模板的数据是相对稳定的可以在本地用缓存数据Mock避免重复请求需要监控的关键请求拦截商品提交、价格修改等写操作的请求用于审计和异常检测绝不拦截、不篡改涉及支付、交易、用户隐私等核心业务请求。二、CDP Fetch域的基础操作Chrome DevTools Protocol提供了Fetch域可以拦截浏览器发出的网络请求并在请求发出前或响应返回前暂停、修改或继续。Python通过CDP客户端我们用的是chromote或直接WebSocket来控制这个域。importjsonimportasynciofromtypingimportOptional,CallableclassFetchInterceptor:def__init__(self,cdp_session):self.cdpcdp_session self.patterns[]# 拦截规则self.request_handlers[]self.response_handlers[]asyncdefenable(self,patterns:list):# patterns 示例: [{urlPattern: *doubleclick.net*, requestStage: Request}]self.patternspatternsawaitself.cdp.send(Fetch.enable,{patterns:patternsor[],handleAuthRequests:False})asyncdefdisable(self):awaitself.cdp.send(Fetch.disable)asyncdefon_request_paused(self,event:dict):request_idevent[requestId]requestevent[request]resource_typeevent.get(resourceType,)urlrequest.get(url,)# 执行请求拦截处理器链forhandlerinself.request_handlers:actionawaithandler(url,resource_type,request)ifactionabort:awaitself.cdp.send(Fetch.failRequest,{requestId:request_id,errorReason:BlockedByClient})returnelifactionmock:mock_body,mock_headersawaitself._get_mock_response(url,request)ifmock_bodyisnotNone:awaitself.cdp.send(Fetch.fulfillRequest,{requestId:request_id,responseCode:200,responseHeaders:mock_headers,body:self._encode_base64(mock_body)})return# 默认继续awaitself.cdp.send(Fetch.continueRequest,{requestId:request_id})---## 三、拦截规则的配置化我们在Python端管理一个拦截规则表配置哪些URL模式需要拦截以及拦截后的行为。 规则结构示例 yaml intercept_rules:-url_pattern:*.doubleclick.net/*-action:abort-description:屏蔽广告请求-url_pattern:*/api/categoryTree*-action:mock-mock_source:cache:category_tree# 从缓存中取数据-ttl:3600-url_pattern:*/api/shipping/templates*-action:mock-mock_source:file:templates/shipping_templates.json-update_on_change:true# 若检测到平台更新重新拉取-url_pattern:*/product/submit*-action:audit# 记录请求体和响应体用于审计- Python拦截引擎加载这些规则在收到 Fetch.requestPaused 事件时匹配规则并执行相应动作。 pythonimportfnmatchimportreclassInterceptRuleEngine:def__init__(self,rules:list,cache_manager):self.rulesrules self.cachecache_managerdefmatch(self,url:str,resource_type:str)-dict:forruleinself.rules:patternrule.get(url_pattern,*)iffnmatch.fnmatch(url,pattern)orre.search(pattern,url):returnrulereturn{action:continue}asyncdefget_mock_response(self,rule:dict,url:str)-tuple:mock_sourcerule.get(mock_source,)ifmock_source.startswith(cache:):cache_keymock_source.split(:,1)[1]dataawaitself.cache.get(cache_key)ifdata:returndata.encode(),[{name:Content-Type,value:application/json}]elifmock_source.startswith(file:):file_pathmock_source.split(:,1)[1]withopen(file_path,r)asf:returnf.read().encode(),[{name:Content-Type,value:application/json}]returnNone,None---## 四、动态缓存管理与自动刷新对于Mock的查询接口缓存的数据需要保持新鲜度。 我们设计了缓存刷新策略-**定时刷新**每隔N分钟后台静默更新一次在空闲时进行--**触发式刷新**当监听到与该接口相关的平台“修改”操作成功后主动清除缓存下次请求时重新拉取--**版本校验**某些接口支持ETag或Last-Modified可以在后台用HEAD请求检查是否有更新 pythonclassCacheRefreshManager:def__init__(self,fetch_interceptor,rules):self.interceptorfetch_interceptor self.rulesrulesasyncdefscheduled_refresh(self):whileTrue:forruleinself.rules:ifrule.get(action)mockandrule.get(refresh_interval):awaitself._refresh_mock(rule)awaitasyncio.sleep(300)# 每5分钟检查一次asyncdef_refresh_mock(self,rule):# 暂时关闭拦截发出真实的请求获取最新数据original_patternrule[url_pattern]# 移除该规则请求一次真实数据self.interceptor.remove_pattern(original_pattern)try:asyncwithaiohttp.ClientSession()assession:asyncwithsession.get(real_url)asresp:dataawaitresp.text()mock_sourcerule[mock_source]ifmock_source.startswith(cache:):cache_keymock_source.split(:,1)[1]awaitself.cache.set(cache_key,data,ttlrule.get(ttl,3600))finally:# 重新启用拦截self.interceptor.add_pattern(original_pattern)---## 五、审计与写操作监控对于写操作请求商品上架、价格修改等我们将其请求体和响应体完整记录作为操作审计的补充。 这比单纯从Python调度层记录参数更底层——因为它捕获的是浏览器实际发出的网络请求可以验证“影刀脚本填写的值”与“最终提交到平台的值”是否一致。 pythonasyncdefaudit_write_request(event,cdp):request_idevent[requestId]requestevent[request]urlrequest.get(url,)methodrequest.get(method,)post_datarequest.get(postData,)# 获取请求体如果未包含则通过Fetch.getRequestPostData获取ifnotpost_dataandmethodPOST:post_dataawaitcdp.send(Fetch.getRequestBody,{requestId:request_id})post_datapost_data.get(body,)# 继续请求但获取响应awaitcdp.send(Fetch.continueRequest,{requestId:request_id})# 响应会被 Fetch.responsePaused 事件捕获那里可以获取响应体# 将请求和响应组合写入审计日志audit_record{timestamp:time.time(),url:url,method:method,request_body:post_data,response_body:,# 稍后在响应阶段填入shop_id:extract_shop_id(url),}# 暂存到Redis响应阶段补齐awaitredis.set(faudit:request:{request_id},json.dumps(audit_record),ex300) 这些审计数据结合之前构建的审计系统形成操作的全链路证据链。---## 六、性能收益与稳定性提升启用请求拦截后我们在生产环境观察到的变化-页面平均加载时间减少约25%屏蔽了广告和统计脚本--自动化流程因“等待页面加载”而超时的次数降低约30%--代理流量消耗下降约15%减少了不必要的请求--Mock接口的响应时间从平均800ms降到了5ms以内直接内存返回 尤其在批量数据采集任务中Mock拦截的效果极为显著采集50个商品列表传统方式需要逐页翻页、每次等待列表接口返回使用Mock后列表数据直接来自缓存页面渲染几乎瞬间完成。---## 七、与影刀流程的配合请求拦截对影刀流程完全透明。 影刀流程不需要任何特殊配置它仍然按正常方式操作页面元素。 Python拦截器在浏览器底层工作屏蔽或Mock掉不必要的请求确保影刀看到的页面是干净、快速、稳定的。 当某个平台接口变化导致Mock数据失效时拦截器会自动降级如果Mock返回的数据导致页面出现异常例如类目下拉框无法正常渲染我们的智能元素定位引擎会检测到元素异常触发告警并通知更新Mock数据。 pythonclassMockHealthMonitor:asyncdefcheck(self):# 如果智能定位失败率突然升高且与Mock接口相关则可能是Mock数据过期recent_failuresawaitself.db.fetch(SELECT error_detail FROM task_failures WHERE error_typeelement_not_found AND created_at NOW() - INTERVAL 10 minutes)iflen(recent_failures)5:logger.warning(Possible Mock data staleness detected, purging cache...)awaitself.cache.clear(patternmock:*)---## 八、安全与合规边界我们不修改任何写操作请求的请求体或响应体也不拦截任何涉及支付、交易的接口。 拦截规则会经过审核禁止匹配平台的鉴权、登录、订单支付等关键URL。 所有Mock的数据来源于我们自己的缓存或预置文件不会注入外部代码或修改DOM。 这套系统的定位是**加速和稳定自动化流程**而非对抗平台。---## 九、监控与运维-拦截请求数量与比例屏蔽、Mock、放行--Mock缓存命中率与新鲜度--审计事件数量与异常检测--拦截规则变更记录 当Mock缓存命中率持续过低时需要调整缓存策略或增加更新频率。当审计事件中出现异常的请求体例如价格字段为0时立刻发出告警。---## 十、踩坑实录**Fetch域与其他域的冲突。**启用Fetch域拦截时浏览器的其他CDP操作如Page.navigate可能会因为请求暂停而超时。我们通过为Fetch.continueRequest设置默认超时和自动放行策略来避免阻塞。**Mock数据导致页面行为变化。**有一次Mock返回的类目树数据中缺少了一个新类目导致页面的下拉框无法渲染影刀流程报元素找不到。 我们在Mock返回体中增加了“保留未知字段”的策略不完全替换而是增量合并。**请求体过大导致内存问题。**某些商品编辑页面的请求体包含Base64编码的图片完整记录到审计日志中会迅速膨胀。我们限制了审计日志中请求体的大小上限超过阈值只记录哈希和截断摘要。---## 十一、写在最后浏览器的网络层是自动化系统中一个容易被忽略的“深水区”。 通过CDP的Fetch拦截能力我们可以主动管理浏览器发出的每一条网络请求剔除噪音、加速加载、稳定响应并在关键写操作上构建更深层的审计能力。自动化不只是模拟点击。真正的掌控力来自于你能够管理浏览器的每一个细微行为包括那些看不见的HTTP请求。 当你在浏览器的网络面板里看到那些被屏蔽的红色请求、被Mock瞬间完成的绿色请求时你会知道自动化系统已经不止是“操作页面”而是在重新定义“页面能有多快、多稳定”。---*作者林焱*