影刀RPA CDN缓存刷新内容更新批量处理作者林焱 | 适用人群影刀RPA新手 | 难度★★☆☆☆一、什么情况用这个网站更新了内容——换了Logo、改了页面、发了新文章——但用户看到的还是旧的。因为CDN缓存没刷新。每次更新都要手动登录CDN控制台找到对应的URL点「刷新」按钮。如果更新了100个文件一个个刷新能刷到怀疑人生。用影刀RPA监听文件变更 → 自动调用CDN API → 批量刷新缓存 → 确认刷新结果。网站更新后CDN自动跟着刷新用户秒看到最新内容。实际场景电商活动页面更新、CMS内容发布后的缓存刷新、静态资源版本更新、多CDN服务商统一管理。这篇文章能解决的问题自动调用阿里云CDN/腾讯云CDN API刷新缓存批量URL提交刷新刷新任务状态跟踪多CDN服务商统一刷新二、怎么做拼多多店群自动化上架方案2.1 环境准备以阿里云CDN为例需要AccessKey和Secret# 安装阿里云SDK影刀安装目录\python\python.exe-mpipinstallaliyun-python-sdk-cdn2.2 影刀主流程┌──────────────────────────────────────────────┐ │ ① 【监控文件夹】 │ │ 监听网站静态资源目录文件变化触发 │ │ ↓ │ │ ② 【执行Python代码】 │ │ 收集需要刷新的URL列表 │ │ ↓ │ │ ③ 【执行Python代码】 │ │ 调用CDN API提交刷新任务 │ │ ↓ │ │ ④ 【执行Python代码】 │ │ 轮询刷新任务状态确认完成 │ │ ↓ │ │ ⑤ 【写入日志】 │ │ 记录刷新结果 │ └──────────────────────────────────────────────┘2.3 核心代码步骤②③调用阿里云CDN刷新APIfromaliyunsdkcore.clientimportAcsClientfromaliyunsdkcdn.request.v20180510.RefreshObjectCachesRequestimportRefreshObjectCachesRequestfromaliyunsdkcdn.request.v20180510.DescribeRefreshTasksRequestimportDescribeRefreshTasksRequestimportjsonimporttime# 阿里云CDN配置 ACCESS_KEY_IDyourAccessKeyIdACCESS_KEY_SECRETyourAccessKeySecretREGIONcn-hangzhou# 初始化客户端clientAcsClient(ACCESS_KEY_ID,ACCESS_KEY_SECRET,REGION)defrefresh_cdn_cache(urls,refresh_typeFile): 刷新CDN缓存 refresh_type: File(文件刷新) | Directory(目录刷新) requestRefreshObjectCachesRequest()request.set_ObjectPath(\n.join(urls))# 多个URL用换行分隔request.set_ObjectType(refresh_type)try:responseclient.do_action_with_exception(request)resultjson.loads(response)refresh_task_idresult.get(RefreshTaskId,)request_idresult.get(RequestId,)print(f刷新任务已提交TaskId{refresh_task_id})return{success:True,task_id:refresh_task_id,request_id:request_id,}exceptExceptionase:print(f刷新失败{e})return{success:False,error:str(e),}# 批量刷新 # 要刷新的URL列表从文件夹监控中获得urls_to_refresh[https://www.example.com/css/style.css,https://www.example.com/js/app.js,https://www.example.com/images/logo.png,]# 阿里云CDN一次最多1000个URL如果超过需要分批BATCH_SIZE100results[]foriinrange(0,len(urls_to_refresh),BATCH_SIZE):batchurls_to_refresh[i:iBATCH_SIZE]resultrefresh_cdn_cache(batch)results.append(result)print(f批次{i//BATCH_SIZE1}:{len(batch)}个URL)# 如果是目录刷新刷新整个目录下的所有文件# refresh_cdn_cache([https://www.example.com/css/], Directory)outputjson.dumps(results,ensure_asciiFalse)步骤④检查刷新状态defcheck_refresh_status(task_id):查询刷新任务状态requestDescribeRefreshTasksRequest()request.set_TaskId(task_id)try:responseclient.do_action_with_exception(request)resultjson.loads(response)tasksresult.get(Tasks,{}).get(CDNTask,[])iftasks:tasktasks[0]return{task_id:task_id,status:task.get(Status,Unknown),progress:task.get(Process,0%),creation_time:task.get(CreationTime,),}exceptExceptionase:return{task_id:task_id,status:Error,error:str(e)}# 等待刷新完成importtimeforresult_iteminresults:ifresult_item[success]:task_idresult_item[task_id]print(f等待刷新完成{task_id})# 轮询10次每次等3秒for_inrange(10):statuscheck_refresh_status(task_id)print(f 状态{status[status]}进度{status[progress]})ifstatus[status]Complete:print(f ✅ 刷新完成)breakelifstatus[status]Failed:print(f ❌ 刷新失败)breaktime.sleep(3)2.4 腾讯云CDN备选如果用的是腾讯云CDN# pip install tencentcloud-sdk-pythonfromtencentcloud.commonimportcredentialfromtencentcloud.cdn.v20180606importcdn_client,models credcredential.Credential(SecretId,SecretKey)clientcdn_client.CdnClient(cred,ap-guangzhou)reqmodels.PurgeUrlsCacheRequest()req.Urls[https://www.example.com/css/style.css,https://www.example.com/js/app.js,]respclient.PurgeUrlsCache(req)print(resp.to_json_string())2.5 多CDN统一管理大厂可能同时用了阿里云CDN Cloudflare需要统一刷新defrefresh_all_cdns(urls):同时刷新所有CDN服务商results{}# 阿里云CDNtry:results[aliyun]refresh_aliyun_cdn(urls)exceptExceptionase:results[aliyun]{success:False,error:str(e)}# Cloudflaretry:results[cloudflare]refresh_cloudflare(urls)exceptExceptionase:results[cloudflare]{success:False,error:str(e)}returnresultsdefrefresh_cloudflare(urls):Cloudflare缓存刷新importrequests CLOUDFLARE_ZONE_IDyour_zone_idCLOUDFLARE_API_TOKENyour_api_tokenurlfhttps://api.cloudflare.com/client/v4/zones/{CLOUDFLARE_ZONE_ID}/purge_cacheheaders{Authorization:fBearer{CLOUDFLARE_API_TOKEN},Content-Type:application/json,}payload{files:urls}responserequests.post(url,headersheaders,jsonpayload,timeout30)returnresponse.json()三、有什么坑坑1刷新配额限制各CDN服务商都有刷新配额限制服务商文件刷新目录刷新阿里云每天2000条每天100条腾讯云每天10000条每天20条TEMU店群如何管理运营| Cloudflare | 免费版每月1000条 | — |# 每次刷新前检查配额defcheck_refresh_quota():检查剩余刷新配额# 阿里云可以通过DescribeRefreshQuota查询requestDescribeRefreshQuotaRequest()responseclient.do_action_with_exception(request)quotajson.loads(response)remaining_urlquota.get(UrlRemain,0)remaining_dirquota.get(DirRemain,0)print(f剩余文件刷新配额{remaining_url})print(f剩余目录刷新配额{remaining_dir})returnremaining_url0坑2大文件刷新慢CDN节点遍布全球一个文件刷新要等几分钟甚至更久。不要发完刷新请求就认为完成了一定要轮询状态确认。defwait_for_refresh_complete(task_id,max_wait600):等待刷新完成最长等10分钟waited0whilewaitedmax_wait:statuscheck_refresh_status(task_id)ifstatus[status]Complete:returnTrueifstatus[status]Failed:returnFalsetime.sleep(10)waited10print(f⚠️ 刷新超时{task_id})returnFalse坑3URL编码问题URL中包含中文或特殊字符时需要正确编码fromurllib.parseimportquotedefencode_cdn_url(url):对URL中需要编码的部分进行编码# 中文路径需要URL编码# 但不要编码整个URL协议://和域名部分不需要编码fromurllib.parseimporturlparse,urlunparse parsedurlparse(url)encoded_pathquote(parsed.path,safe/-_.!~*())returnurlunparse(parsed._replace(pathencoded_path))坑4误刷新目录目录刷新会把整个目录下所有文件都刷掉成本高可能要回源拉取大量文件。用文件刷新更精确消耗的配额也更合理。# ✅ 推荐文件刷新refresh_cdn_cache([https://www.example.com/css/style.css],File)# ⚠️ 谨慎目录刷新整个目录回源refresh_cdn_cache([https://www.example.com/css/],Directory)坑5CDN预热刷新完后如果文件很重要最好再预热一下推送到边缘节点让第一个访问的用户也能快速加载# 阿里云CDN预热fromaliyunsdkcdn.request.v20180510.PushObjectCacheRequestimportPushObjectCacheRequestdefpush_cdn_cache(urls):预热CDN缓存requestPushObjectCacheRequest()request.set_ObjectPath(\n.join(urls))responseclient.do_action_with_exception(request)resultjson.loads(response)returnresult.get(PushTaskId,)总结CDN缓存刷新自动化关键是控制好刷新频率和配额。文件刷新优于目录刷新刷新后要轮询确认完成。如果是多CDN架构统一封装后一条命令搞定所有CDN。