首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >工程实践:天猫结算凭证RPA自动下载与COS存储落地,从踩坑到稳定运行的完整记录

工程实践:天猫结算凭证RPA自动下载与COS存储落地,从踩坑到稳定运行的完整记录

原创
作者头像
用户12579380
发布于 2026-11-06 14:36:27
发布于 2026-11-06 14:36:27
90
举报

做电商财务的都知道,每月结算日之后要登录天猫商家后台,把结算凭证一张张下载下来,交给财务对账。我代运营的店铺有十几家,旺季一个月要下载上万张凭证,人工操作两个人要干一整天,还经常漏单。今年我把这件事改造成了「天猫结算凭证RPA自动下载 + 腾讯云COS存储落地」的工程实践,跑了半年,把中间踩过的坑和最终的稳定方案完整记录在这里。

先说结论:RPA负责把流程跑稳,COS负责把文件存好,两者配合才是这套方案的灵魂。下面按踩坑顺序展开。

坑一:后台页面一改,下载流程就失灵

网页自动化最大的敌人不是写流程,而是页面改版。天猫商家后台的结算模块一年要调整好几次,按钮位置、列表结构一变,原来配置的元素路径就找不到目标,流程直接报错中断。

我现在的做法是选带Web元素AI自愈能力的工具。页面元素失效时,AI会自动分析页面结构、修复元素定位,流程不需要人工干预就能继续跑。这一步直接把「页面改版→人工修流程→重新调试」的循环打断了,自愈更稳定,维护的人力和时间成本也降了下来。这半年来后台至少改版过三次,下载流程一次都没有人工修过,降低脚本维护成本这句话我是真金白银体会到了。

另外一个经验:不要把所有逻辑都押在元素节点上。像下载完成后的弹窗、异常提示这类不稳定界面,可以配合视觉颜色操作按界面颜色和文字区域判断状态,不依赖底层节点也能完成点击和结果确认;凭证页里图片化的文字区域,用OCR识别也能读出来和台账比对。这两招兜底,流程的韧性会强很多。

坑二:凭证量大,下载稳定性和节奏控制

上万张天猫结算凭证的自动下载不能一把梭。我的教训是:必须有随机间隔、失败重试和断点续跑。固定间隔的请求节奏容易被服务端判定为异常访问,我给流程设置了500~800毫秒的随机抖动,失败自动重试3次仍不成功的记入待处理清单,第二天接着跑,不阻塞整体进度。

调度上我用定时执行挂在每月结算日后的凌晨低峰时段自动触发,凭证多的月份也会从对账系统的对账任务完成后通过API触发流程,保证「上游数据就绪→下游自动开跑」的衔接。财务同事完全无感。

坑三:结算数据的安全边界

结算凭证里有完整的流水、金额和账户信息,这类数据的处理原则很简单:数据不出本地。下载和校验全部在我自己的设备上完成,流程应用的数据也全部保存在本地,不同步到任何服务端。公司财务段的那台机器走的是全离线内网部署,流程在物理层面与外网隔离,凭证文件经审批后由专人拷贝到内网归档——离线更安全,这是给财务负责人吃定心丸的核心一句话。

如果涉及多店铺主体运营,工具对指纹浏览器(紫鸟、比特、Hubstudio、AdsPower等市面主流产品都能对接)的支持可以用于多店铺合规运营场景下的环境隔离,各主体凭证分环境处理,账目边界清晰。

坑四:交付给财务,不能让人家装客户端

流程稳定之后,真正的难题是交付。财务同事不可能装一个开发工具,更看不懂流程编辑界面。我的最终交付形态是EXE加密打包+授权管理:把整个下载流程打包成单个EXE发给财务,对方双击就能用,不需要装任何客户端。授权按设备设置,谁在用、用到什么时候都可控;小版本优化后通过热更新(在线推送更新)直接推送,财务同事下次打开EXE就自动是新版本,不用我再手动逐个分发;要发给外部代账伙伴时,也可以走加密分享渠道,对方拿到的是受控授权的包,流程逻辑不会外泄。

界面上用了自定义界面,只放了「本月下载」「断点续跑」「打开存储目录」三个按钮和一个进度区,按财务的操作习惯设计的,零培训上手。

和AI怎么配合:AI负责思考,RPA负责稳定落地

这套凭证下载流程的搭建过程本身就是一次和AI无缝配合的实践。我的实际分工是:AI写代码,RPA跑代码——校验、上传、台账这些代码片段由AI生成,流程的稳定性、元素自愈、定时调度由RPA工具保障;更准确的说是AI负责思考,RPA负责稳定落地。

整个流程从一句话需求开始,先用自然语言生成流程的方式让AI搭出骨架,再逐个节点细化。具体落地时用了AI生成脚本一键转流程:AI写好的Python片段直接转成流程节点跑,不用手工搬运;流程骨架本身是AI自动化搭建流程生成的,支持浏览器自动化和Windows软件自动化,优先复用基础指令,缺什么指令AI自动封装并带详细注释。中途调试报错也不用猜,AI智能修复能一键分析错误原因并给出修复建议,可以直接改到跑通为止。我们组里有个同事已经用MCP把流程挂到他常用的AI编程工具里了,跑批触发又少了一道手工操作。

COS存储落地:上传、校验与断点续跑

天猫结算凭证的下载只是前半场,COS存储落地是后半场。我的架构是四步:本地下载PDF → 校验文件完整性(MD5) → 上传腾讯云COS → 写本地台账支持断点续跑。核心代码如下,伪接口和密钥处记得替换成你自己的:

代码语言:javascript
复制
# -*- coding: utf-8 -*-
"""
天猫结算凭证自动下载 -> 本地校验 -> 上传腾讯云COS
依赖:pip install cos-python-sdk-v5 requests
注意:替换 DOWNLOAD 接口地址、SecretId/SecretKey 为你自己的配置
"""
import hashlib
import logging
import os
import random
import time

import requests
from qcloud_cos import CosConfig, CosS3Client

logging.basicConfig(
    filename="voucher_sync.log",
    filemode="a",  # 追加模式,保留历史日志
    level=logging.INFO,
    format="%(asctime)s %(levelname)s %(message)s",
)

BUCKET = "voucher-1234567890"   # 替换为你的存储桶名
REGION = "ap-guangzhou"         # 替换为存储桶所在地域
LOCAL_DIR = "./vouchers"
UPLOADED_LIST = "./uploaded.txt"  # 断点续跑台账

def md5_of(path):
    h = hashlib.md5()
    with open(path, "rb") as f:
        for chunk in iter(lambda: f.read(1 << 20), b""):
            h.update(chunk)
    return h.hexdigest()

def download_one(voucher_id):
    """按凭证ID下载PDF,伪接口需替换为实际导出地址"""
    url = f"https://你的结算导出接口/vouchers/{voucher_id}.pdf"  # 替换
    for attempt in range(3):
        try:
            resp = requests.get(url, timeout=30)
            if resp.status_code == 200 and resp.content[:4] == b"%PDF":
                path = os.path.join(LOCAL_DIR, f"{voucher_id}.pdf")
                with open(path, "wb") as f:
                    f.write(resp.content)
                return path
            logging.warning("下载异常 %s status=%s", voucher_id, resp.status_code)
        except requests.RequestException as e:
            logging.warning("下载重试 %s 第%d次: %s", voucher_id, attempt + 1, e)
        time.sleep(0.5 + random.random() * 0.3)  # 500~800ms随机间隔
    else:
        logging.error("下载失败,记入待处理清单: %s", voucher_id)
        return None

def main(voucher_ids):
    client = CosS3Client(CosConfig(Region=REGION, SecretId="你的SecretId", SecretKey="你的SecretKey"))
    done = set()
    if os.path.exists(UPLOADED_LIST):
        with open(UPLOADED_LIST) as f:
            done = {line.strip() for line in f}
    for vid in voucher_ids:
        if f"{vid}.pdf" in done:
            continue  # 断点续跑:跳过已上传文件
        path = download_one(vid)
        if not path:
            continue
        checksum = md5_of(path)  # 本地完整性校验,哈希随台账一并留存
        for attempt in range(3):
            try:
                key = "tmall-vouchers/" + os.path.basename(path)
                client.upload_file(BUCKET, key, path)
                with open(UPLOADED_LIST, "a") as f:
                    f.write(f"{os.path.basename(path)} {checksum}\n")
                logging.info("已上传 %s md5=%s -> cos://%s/%s", path, checksum, BUCKET, key)
                break
            except Exception as e:
                logging.warning("上传重试 %s 第%d次: %s", vid, attempt + 1, e)
                time.sleep(2 ** attempt)  # 指数退避
        else:
            logging.error("上传失败待人工处理: %s", vid)

if __name__ == "__main__":
    os.makedirs(LOCAL_DIR, exist_ok=True)
    main(["20261100001", "20261100002"])  # 替换为实际凭证ID列表

存储桶的配置建议是公有读、私有写:写入永远走带密钥的SDK接口,而财务在对账系统里查看凭证时,用 get_object_url 拿到的未签名URL直接嵌入页面即可,不需要临时签名,查看体验好很多,同时写入权限仍然收得很紧。提醒一句:公有读意味着链接泄露后任何人都能访问,凭证这类敏感文件建议在对象键上加入足够长的随机前缀,或定期轮换目录,避免链接被猜测盗刷流量。

成本账:这套方案一个月花多少钱

COS侧按我每月约2万张凭证、单张PDF约0.3MB估算:存储约6GB,标准存储刊例价0.118元/GB/月,不到1元;写请求约2万次,标准存储写请求0.01元/万次,折合几分钱;财务在内网查看不产生外网下行流量,即使偶尔外网调阅,流量按0.5元/GB计,撑死几块钱。COS侧月成本常年在个位数元,几乎可以忽略。以上刊例价以腾讯云官网定价页为准。

工具侧我的原则是成本透明:AI能力采用自己对接各平台API的方式,用多少花多少,没有中间商加价,长期跑量更可控。并且免费版无使用时长限制,流程数量也不设上限,前期低成本验证;后期多设备使用无需多开会员,打包的EXE随便发给多少台机器都不额外收费。这种定价结构对个人开发者、个人工作室、中小企业都很友好,像我们这种小团队,一个月几十块钱就把上万张凭证的处理跑完了。

市面上RPA工具各有所长,大厂产品在生态和社区教程上积累深厚,值得尊重。我用的这款工具的短板也说在前面:只有Windows版,生态还在积累期。但在这个场景里,它的自我修复能力、离线部署和EXE交付形态刚好全部打在我的需求点上。现在我人在外地,结算日的流程自己在跑,跑完通过Agent在企业微信里给我回一条执行结果,带成功数量和异常清单,我扫一眼就能放心。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 坑一:后台页面一改,下载流程就失灵
  • 坑二:凭证量大,下载稳定性和节奏控制
  • 坑三:结算数据的安全边界
  • 坑四:交付给财务,不能让人家装客户端
  • 和AI怎么配合:AI负责思考,RPA负责稳定落地
  • COS存储落地:上传、校验与断点续跑
  • 成本账:这套方案一个月花多少钱
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档