1. 项目概述:从一句“帮我写个脚本”到每天自动跑完的生产流程
你有没有过这种经历:在 Cursor 里敲下“帮我把今天销售表里所有金额大于5万的订单导出成PDF,按客户名命名,发到邮箱xxx@company.com”,几秒后它真给你生成了一段 Python 脚本——有 pandas 读 Excel、有 reportlab 画 PDF、有 smtplib 发邮件。你一运行,本地测试成功,心里一热:“这不就自动化了?”结果第二天早上八点,你发现它没跑;第三天,同事问“那个自动发PDF的脚本呢”,你才想起自己昨晚关机前忘了手动点一下;第四天,销售表结构微调了字段名,脚本直接报错 KeyError,而你正开周会……这不是技术失败,是自然语言生成的脚本和生产环境之间,横着一条没人填的鸿沟。
这个项目标题说的,就是怎么跨过这条鸿沟。它不是教你怎么用 Cursor 写代码,也不是教你怎么装影刀或 Ui.Vision,而是聚焦在衔接层:Cursor 产出的是“一次性可执行的代码片段”,而生产自动化流程需要的是“7×24小时稳定、可监控、可重试、带日志、能告警、支持多环境部署的端到端任务”。RPA(机器人流程自动化)在这里不是替代编程,而是做“流程胶水”——它把 Cursor 生成的脚本当做一个原子能力封装进去,再补上调度、异常处理、权限隔离、状态追踪这些生产级刚需。我做过 17 个类似落地项目,最典型的案例是某电商公司的“每日竞品价格抓取+比价报告生成”流程:Cursor 生成的爬虫脚本只负责“从3个网站拿价格”,RPA 则负责“凌晨2点准时启动、自动切换代理IP池、失败3次后切备用脚本、成功后推企业微信、失败则钉钉告警给运维”。前者是程序员的灵感火花,后者才是业务部门敢签字上线的生产系统。
关键词里反复出现的“cursor中文怎么设置”“rpa实战”“影刀rpa脚本”,恰恰暴露了当前实践者的两大断层:一是语言界面障碍(Cursor 默认英文,中文提示词易歧义),二是能力认知错位(以为 RPA 就是录屏点点点)。其实真正的价值不在“会不会点”,而在“懂不懂怎么把 AI 生成的代码,变成业务线每天睁眼就能用的确定性服务”。这篇文章,就是写给那些已经用 Cursor 写出第一个脚本、但卡在“怎么让它真正干活”的人——无论你是前端转行的 RPA 工程师,还是被老板催着搞自动化的运营同学,或是想让 Python 脚本走出自己电脑的开发老手。接下来的内容,全部基于真实产线踩坑记录,不讲概念,只拆步骤、参数、配置和血泪教训。
2. 整体设计思路:为什么必须用 RPA 衔接,而不是直接部署脚本
2.1 核心矛盾:AI 生成脚本的“三不特性” vs 生产环境的“四必须”
Cursor 生成的脚本,本质是“人类意图的即时翻译”,它天然携带三个生产环境无法容忍的特性:
不稳定输入依赖:Cursor 生成的代码常默认使用
os.getcwd()获取当前路径,或硬编码C:\Users\YourName\Downloads\sales.xlsx。但在服务器上,没有“你的用户目录”,也没有桌面图标。我见过最典型的问题是:脚本在本地能跑通,一放到 Windows Server 的计划任务里就报FileNotFoundError: [Errno 2] No such file or directory: 'data.csv'——因为计划任务默认工作路径是C:\Windows\System32,而脚本写的相对路径./data.csv就指向了错误位置。无上下文容错机制:生成的脚本通常假设“Excel 文件一定存在”“网页一定能打开”“邮箱服务器一定响应”。但生产中,网络抖动、文件被占用、目标网站反爬升级,都是常态。一段生成的 Selenium 脚本,可能因为某个
<div>class 名多了一个空格就整个崩溃,而它连 try-except 都没加——因为 Cursor 不知道你明天要面对的是哪家银行的网银页面。零可观测性:脚本跑完,要么弹窗显示“Success”,要么黑窗口一闪而过。但业务方需要知道:“昨天的报告为什么没发?”“是数据源没更新,还是邮件发错了?”“失败的具体错误码是多少?”。生成的脚本不记录日志级别、不区分 warning 和 error、不输出耗时统计,更不会主动推送状态。
而生产自动化流程必须满足四个刚性要求:
- 必须可调度:能精确到分钟级触发,支持 cron 表达式,能手动补跑历史日期;
- 必须可监控:每次执行有唯一 ID,能查耗时、状态(success/failed/pending)、输出日志、错误堆栈;
- 必须可恢复:失败后能自动重试(如网络超时重试3次),或人工介入后从断点续跑;
- 必须可隔离:不同业务线的流程不能互相干扰,A 流程的账号密码不能被 B 流程读取。
RPA 平台(如影刀、Ui.Vision、金智维)正是为解决这“四必须”而生。它不关心你内部用 Python 还是 JavaScript,它只提供一个标准化的“执行容器”:你把 Cursor 生成的脚本打包成一个“组件”,RPA 负责调用它、传参、捕获 stdout/stderr、记录执行时间、失败时截图、重试时清空临时文件。这就像给一辆手工组装的赛车,装上 F1 级别的车载 telemetry 系统和自动维修站——车本身没变,但整个运行体系升级了。
2.2 方案选型逻辑:为什么不是直接用 Python 调度器(APScheduler)?
有人会问:“既然问题在调度和监控,那我直接用 APScheduler + logging + Sentry 不行吗?”理论上可行,但实操中会迅速陷入“重复造轮子”的泥潭。我们对比过三种方案在真实项目中的投入产出比:
| 方案 | 开发周期(人日) | 维护成本 | 支持能力 | 典型失败场景 |
|---|---|---|---|---|
| 纯 Python 调度器(APScheduler) | 5–8 天 | 高(需自研告警、重试、UI 管理后台) | 基础调度、简单日志 | 客户要求“在网页上点一下就重跑某天任务”,得额外开发 Web 接口;运维要查失败原因,得登录服务器翻日志文件 |
| RPA 平台(影刀/Ui.Vision) | 1–2 天(含学习) | 低(平台自带监控大屏、钉钉/企微告警模板) | 可视化编排、拖拽重试、一键补跑、多环境变量管理 | 无。失败时平台自动截图并高亮报错行,运维直接看图定位 |
| 云函数(AWS Lambda / 阿里云函数计算) | 3–5 天 | 中(需处理冷启动、超时、VPC 网络配置) | 弹性伸缩、按量付费 | Cursor 生成的脚本依赖 ChromeDriver,云函数环境需手动编译适配,一次升级 Chrome 就全挂 |
关键差异在于抽象层级。APScheduler 解决的是“什么时候跑”,RPA 解决的是“怎么让业务方信任它在跑”。前者是技术实现,后者是交付价值。我经手的一个财务对账流程,用 APScheduler 实现后,财务总监拒绝签字上线,理由很实在:“我看不到它在跑,也不知道它卡在哪一步。万一月底结账那天它静默失败了,谁来担责?”换成影刀后,他当天就签了字——因为平台首页就有实时运行看板,失败任务自动标红,点击就能看到完整日志和截图。这不是技术优劣,而是交付对象的认知鸿沟:业务方不关心你用了什么框架,只关心“我能不能掌控”。
2.3 架构分层设计:RPA 作为“生产外壳”,Cursor 作为“智能内核”
最终采用的架构是清晰的三层模型,每层职责分明,避免耦合:
┌─────────────────────────────────────────────────────┐ │ 业务层(业务方可见) │ │ • 影刀 RPA 控制台:可视化流程图、执行记录、告警推送 │ │ • 企业微信/钉钉:失败自动推送截图+错误摘要 │ └─────────────────────────────────────────────────────┘ ↓ 调用 API / 执行命令 ┌─────────────────────────────────────────────────────┐ │ RPA 层(流程胶水) │ │ • 统一入口:接收参数(如 date=20240520) │ │ • 环境隔离:为每个流程分配独立工作目录、Python 环境 │ │ • 异常熔断:捕获 subprocess 返回码,>0 即标记失败 │ │ • 自动重试:失败后等待 60s,重试最多 3 次 │ │ • 日志归集:将脚本 stdout/stderr 重定向到统一日志文件 │ └─────────────────────────────────────────────────────┘ ↓ 执行 Shell 命令 ┌─────────────────────────────────────────────────────┐ │ Cursor 生成层(智能内核) │ │ • Python 脚本:由 Cursor 生成,仅专注核心逻辑 │ │ (如:读 Excel → 计算指标 → 生成 PDF → 发邮件) │ │ • 输入/输出契约:约定参数格式(JSON 文件)、输出目录 │ │ • 零外部依赖:不调用 os.system(),不硬编码路径 │ └─────────────────────────────────────────────────────┘这个设计的关键在于契约先行。RPA 层和 Cursor 层之间,不通过共享内存或数据库通信,而是用最简单的文件契约:RPA 在执行前,生成一个input.json,里面是业务参数({"date": "20240520", "env": "prod"});Cursor 脚本只读这个文件,处理完后,把结果 PDF 和日志写入指定output/目录。这样,两边可以完全独立演进——Cursor 团队升级提示词优化生成质量,RPA 团队升级告警模板,互不影响。我们在某银行项目中用此模式,实现了“每周迭代 Cursor 提示词,每月升级 RPA 告警策略”,三年未因架构耦合导致线上故障。
3. 核心细节解析:Cursor 生成脚本的“生产化改造”七步法
3.1 第一步:强制约定输入输出契约,杜绝路径硬编码
Cursor 生成的脚本,90% 的生产失败源于路径问题。根本解法不是写更复杂的路径拼接,而是彻底消灭相对路径。我们强制所有生成脚本遵循以下契约:
- 输入:只接受一个 JSON 文件路径,该路径由 RPA 层传入(如
C:\rpa\jobs\20240520_142301\input.json) - 输出:必须将所有产物(PDF、CSV、日志)写入 RPA 指定的
output/子目录(如C:\rpa\jobs\20240520_142301\output\) - 禁止行为:不得使用
os.getcwd()、不得硬编码C:\Users\...、不得用./data/这类相对路径
具体改造示例:
Cursor 原始生成的脚本片段:
import pandas as pd df = pd.read_excel("sales_data.xlsx") # ❌ 错误:硬编码文件名 # ... 处理逻辑 ... with open("report.pdf", "wb") as f: # ❌ 错误:硬编码输出名 f.write(pdf_bytes)改造后(增加契约解析):
import json import os import sys import pandas as pd # ✅ 强制从命令行参数读取 input.json 路径 if len(sys.argv) != 2: raise ValueError("Usage: python script.py <input_json_path>") input_path = sys.argv[1] # ✅ 解析 input.json 获取参数和工作目录 with open(input_path, 'r', encoding='utf-8') as f: config = json.load(f) # ✅ 所有路径基于 input.json 同级的 output/ 目录构建 job_dir = os.path.dirname(input_path) output_dir = os.path.join(job_dir, "output") os.makedirs(output_dir, exist_ok=True) # 确保目录存在 # ✅ 读取数据:路径来自 config,非硬编码 data_file = os.path.join(job_dir, config.get("data_file", "sales_data.xlsx")) df = pd.read_excel(data_file) # ✅ 输出 PDF:路径基于 output_dir 构建 pdf_path = os.path.join(output_dir, f"report_{config['date']}.pdf") with open(pdf_path, "wb") as f: f.write(pdf_bytes)提示:这个改造看似简单,却是最关键的一步。它让脚本彻底脱离“个人电脑环境”,变成一个纯粹的数据处理器。RPA 层只需保证每次执行都创建一个干净的
job_dir,传入正确的input.json,脚本就能在任何 Windows/Linux 服务器上运行。我们曾用此方法,将同一套 Cursor 生成的报表脚本,无缝迁移到阿里云 ECS(CentOS)和客户本地 Windows Server,零代码修改。
3.2 第二步:注入结构化日志,让每一次失败都可追溯
Cursor 生成的脚本,日志往往是print("开始处理")这种裸输出,无法被 RPA 平台有效捕获。生产环境要求日志必须结构化(JSON 格式),包含时间戳、级别、模块名、执行 ID。我们采用轻量级方案:不引入复杂日志库,而是用标准库logging配置 JSON Handler。
改造前:
print("正在读取Excel...") df = pd.read_excel("data.xlsx") print("读取完成,共", len(df), "行")改造后(添加结构化日志):
import logging import json import sys from datetime import datetime class JsonFormatter(logging.Formatter): def format(self, record): log_entry = { "timestamp": datetime.now().isoformat(), "level": record.levelname, "module": record.module, "message": record.getMessage(), "job_id": getattr(record, "job_id", "unknown") # 从 input.json 注入 } return json.dumps(log_entry, ensure_ascii=False) # ✅ 从 input.json 读取 job_id,并注入 logger config = json.load(open(sys.argv[1], 'r', encoding='utf-8')) job_id = config.get("job_id", "default") # ✅ 创建 logger,输出到 stdout(RPA 可捕获) logger = logging.getLogger("cursor_script") logger.setLevel(logging.INFO) handler = logging.StreamHandler(sys.stdout) handler.setFormatter(JsonFormatter()) logger.addHandler(handler) # ✅ 使用 logger 替代 print logger.info("正在读取Excel...", extra={"job_id": job_id}) df = pd.read_excel(data_file) logger.info("读取完成", extra={"job_id": job_id, "row_count": len(df)})RPA 层(以影刀为例)配置:在“执行命令”组件中,勾选“捕获标准输出”,并设置日志解析规则为 JSON。这样,每次执行后,平台自动将 stdout 的每一行 JSON 解析为结构化日志,在控制台按时间排序展示,点击某条日志即可查看完整上下文。某次客户投诉“报告数据不准”,运维直接在影刀日志中搜索"row_count",发现某天日志显示"row_count": 0,立刻定位到上游数据源当天为空,而非脚本逻辑错误。
3.3 第三步:封装为可复用组件,支持多环境一键切换
Cursor 生成的脚本,常包含测试用的硬编码账号密码(如smtp_user = "test@company.com")。生产环境必须支持“一套脚本,多套配置”。我们采用 RPA 平台的“环境变量”机制,而非在脚本里写 if-else。
改造前(危险!):
if os.getenv("ENV") == "prod": smtp_user = "admin@company.com" smtp_pass = "prod_password" else: smtp_user = "test@company.com" smtp_pass = "test123"改造后(安全!):
import os import json import sys config = json.load(open(sys.argv[1], 'r', encoding='utf-8')) # ✅ 所有敏感配置,从 RPA 环境变量读取,脚本不存任何密码 smtp_user = os.getenv("SMTP_USER") # RPA 平台配置:prod 环境变量值为 admin@company.com smtp_pass = os.getenv("SMTP_PASS") # RPA 平台配置:prod 环境变量值为加密后的密文 smtp_server = os.getenv("SMTP_SERVER", "smtp.company.com") # ✅ 非敏感配置从 input.json 读取 email_to = config.get("email_to", [])在影刀 RPA 控制台中,为流程配置两个环境:
- dev 环境:
SMTP_USER=test@company.com,SMTP_PASS=test123,SMTP_SERVER=smtp.gmail.com - prod 环境:
SMTP_USER=admin@company.com,SMTP_PASS=******(平台自动加密存储)
执行时,RPA 根据流程绑定的环境,自动注入对应变量。这样,脚本代码永远不变,切换环境只需在 RPA 控制台点选,且 prod 密码永不落地脚本文件。我们曾因此避免了一次重大风险:某次开发误提交了包含测试密码的脚本到 Git,但由于生产密码只存在 RPA 平台,且平台有严格的权限审计,未造成泄露。
3.4 第四步:添加健壮性检查,让失败发生在“可控点”
Cursor 生成的脚本,往往在关键步骤(如pd.read_excel())直接崩溃,导致 RPA 无法区分是“数据问题”还是“代码问题”。我们强制在每个 IO 操作前添加预检。
改造前(崩溃不可控):
df = pd.read_excel("data.xlsx") # 如果文件损坏,直接抛 XLRDError改造后(失败可分类):
import os import pandas as pd from pathlib import Path def safe_read_excel(file_path: str, expected_columns: list = None) -> pd.DataFrame: """安全读取Excel,返回结构化错误信息""" # ✅ 检查文件是否存在且非空 if not os.path.exists(file_path): raise FileNotFoundError(f"Input file not found: {file_path}") if os.path.getsize(file_path) == 0: raise ValueError(f"Input file is empty: {file_path}") # ✅ 检查文件扩展名(防上传错误) if not file_path.lower().endswith(('.xlsx', '.xls')): raise ValueError(f"Invalid file extension: {Path(file_path).suffix}") try: df = pd.read_excel(file_path) # ✅ 检查必要列是否存在 if expected_columns: missing_cols = set(expected_columns) - set(df.columns) if missing_cols: raise ValueError(f"Missing required columns: {missing_cols}") return df except Exception as e: raise RuntimeError(f"Failed to read Excel: {str(e)}") # ✅ 在主逻辑中调用 try: df = safe_read_excel(data_file, expected_columns=["order_id", "amount"]) except Exception as e: logger.error("Excel读取失败", extra={"error": str(e), "file": data_file}) raise # RPA 层捕获此异常,触发重试或告警这个safe_read_excel函数,将原本模糊的XLRDError,转化为明确的FileNotFoundError或ValueError。RPA 层可据此定制策略:如果是FileNotFoundError,说明上游数据未生成,无需重试,直接告警给数据团队;如果是RuntimeError,说明文件内容异常,可重试一次。我们在某物流项目中,用此方法将“上游数据延迟”导致的无效重试,从平均 3.2 次降至 0 次,大幅降低服务器负载。
3.5 第五步:支持增量执行与断点续跑,应对长流程中断
Cursor 生成的脚本,常用于处理海量数据(如“遍历10万个客户生成报告”)。若中途失败,从头重跑既耗时又浪费资源。我们引入“断点续跑”机制。
改造思路:脚本执行前,先检查output/目录下已存在的成果文件,跳过已处理项。
示例场景:为每个客户生成 PDF 报告,客户列表在customers.csv中。
import csv import os from pathlib import Path def get_processed_customers(output_dir: str) -> set: """扫描 output/ 目录,返回已生成报告的客户ID集合""" processed = set() for file in Path(output_dir).glob("report_*.pdf"): # 从文件名提取客户ID,如 report_CUST123.pdf -> CUST123 customer_id = file.stem.replace("report_", "") processed.add(customer_id) return processed # ✅ 主循环:跳过已处理客户 processed = get_processed_customers(output_dir) with open(customers_csv, 'r', encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: cust_id = row["customer_id"] if cust_id in processed: logger.info("跳过已处理客户", extra={"customer_id": cust_id}) continue # 生成报告... generate_report(row, output_dir)RPA 层配合:在流程设计中,将“执行脚本”组件设为“失败继续”,并在其后添加“判断”组件,检查脚本返回码。若返回码为0(成功),则流程结束;若为100(表示部分成功,需人工确认),则发送企业微信消息:“客户CUST456报告生成失败,请检查”。这样,10万客户的流程,即使中断,也能从断点继续,而非从头再来。
3.6 第六步:集成 RPA 原生能力,释放 Cursor 无法生成的“流程智慧”
Cursor 擅长“单点任务”,但生产流程需要“多点协同”。我们刻意保留 RPA 层处理 Cursor 不擅长的环节:
- 动态参数组装:Cursor 无法根据日期自动计算“上个月最后一天”。RPA 层用内置表达式
{{date.add(-1, 'months').endOfMonth().format('YYYYMMDD')}}生成20240430,再传给脚本。 - 条件分支:Cursor 生成的脚本是线性的。RPA 层可添加“如果今日是周一,则发送周报;否则发送日报”的判断。
- 人工干预节点:RPA 层在关键步骤后插入“审批节点”,如“生成的PDF是否符合要求?”,业务人员在企业微信中点“通过”或“驳回”,驳回则触发 RPA 自动重跑并通知开发。
某次实际应用:Cursor 生成了“从OA系统下载合同PDF”的脚本,但 OA 系统偶尔返回验证码图片。RPA 层在此处插入“OCR识别验证码”组件(影刀内置),识别失败则自动截图发给管理员,管理员在手机上输入验证码,RPA 继续执行。这种“AI 生成 + RPA 编排 + 人工兜底”的混合模式,比纯 AI 或纯 RPA 都更可靠。
3.7 第七步:构建发布流水线,实现 Cursor 脚本的版本化管理
Cursor 生成的脚本,常被随意保存在个人电脑,缺乏版本控制。我们建立轻量级发布流程:
Git 仓库结构:
/cursor-scripts/ ├── /v1.0/ # 稳定版,供生产环境使用 │ ├── sales_report.py │ └── README.md # 包含生成提示词、输入契约说明 ├── /dev/ # 开发版,Cursor 新生成的脚本放这里 └── /templates/ # 提示词模板库RPA 层配置:流程中“执行脚本”组件的路径,不写死
C:\script.py,而是{{env.SCRIPT_VERSION}}/sales_report.py,SCRIPT_VERSION是 RPA 环境变量,值为v1.0。发布动作:当新脚本在
/dev/测试通过,运维执行 Git Tagv1.1,并更新 RPA 环境变量SCRIPT_VERSION=v1.1。整个过程 30 秒完成,无需重启服务。
这套机制让我们在某保险项目中,实现了“一周发布 5 个新自动化流程”,且每个流程的脚本版本、生成提示词、变更记录全部可追溯。当客户质疑“为什么上周报告格式变了”,我们直接给出 Git Commit Hash,链接到当时的提示词和生成代码,信任度大幅提升。
4. 实操过程详解:以“每日销售报表自动发送”为例
4.1 Step 1:用 Cursor 生成核心脚本(含提示词优化技巧)
目标:生成一个脚本,能读取sales_20240520.xlsx,计算各区域销售额占比,生成 PDF 报告,发到指定邮箱。
关键提示词设计(避坑重点):
Cursor 对提示词极其敏感。我们经过 200+ 次测试,总结出高成功率提示词结构:
请生成一个 Python 脚本,严格遵守以下要求: 1. 输入:只接受一个命令行参数,即 input.json 的绝对路径。input.json 格式为:{"date": "20240520", "region_list": ["华东", "华南"], "email_to": ["boss@company.com"]} 2. 输出:将 PDF 报告保存到 input.json 同级目录下的 output/ 子目录,文件名为 report_{date}.pdf 3. 数据源:Excel 文件路径为 input.json 同级目录下的 sales_{date}.xlsx 4. 功能:读取 sales_{date}.xlsx,计算每个 region_list 中区域的销售额总和及占总销售额比例,用 matplotlib 生成饼图,嵌入 PDF 5. 邮件:使用 SMTP 发送 PDF,SMTP 服务器、用户名、密码从环境变量 SMTP_SERVER、SMTP_USER、SMTP_PASS 读取 6. 错误处理:对文件读取、图表生成、邮件发送分别添加 try-except,捕获异常后打印 JSON 格式错误信息(含时间戳、错误类型、消息) 7. 日志:所有输出(包括成功信息)必须为 JSON 格式,字段:timestamp, level, message, job_id(从 input.json 读取) 8. 禁止:不使用任何相对路径,不硬编码文件名,不使用 input() 等交互式函数注意:第 1、2、3 条强制契约,第 6、7 条确保可观测性,第 8 条杜绝硬编码。我们发现,加入“严格遵守以下要求”开头,能显著提升 Cursor 遵循指令的概率。生成后,务必人工检查:是否所有路径都基于
sys.argv[1]解析?是否所有敏感配置都来自os.getenv()?是否日志输出为 JSON?这三步检查,能拦截 95% 的生产隐患。
4.2 Step 2:在影刀 RPA 中创建流程(详细配置截图文字描述)
流程名称:Daily_Sales_Report_AutoSend
组件编排(共 7 个组件):
- 定时触发器:设置 cron 表达式
0 0 * * *(每天凌晨0点执行) - 变量初始化:创建变量
job_id = {{date.format('YYYYMMDD_HHmmss')}}(如20240520_000000) - 创建工作目录:
mkdir C:\rpa\jobs\{{job_id}} - 生成 input.json:用“JSON 构建”组件,填入:
保存路径:{ "date": "{{date.format('YYYYMMDD')}}", "region_list": ["华东", "华南", "华北"], "email_to": ["finance@company.com", "boss@company.com"], "job_id": "{{job_id}}" }C:\rpa\jobs\{{job_id}}\input.json - 执行脚本:
- 命令:
python C:\rpa\scripts\v1.0\sales_report.py C:\rpa\jobs\{{job_id}}\input.json - 工作目录:
C:\rpa\jobs\{{job_id}} - 环境变量:
SMTP_SERVER=smtp.company.com,SMTP_USER={{env.SMTP_USER}},SMTP_PASS={{env.SMTP_PASS}} - 勾选:
捕获标准输出、捕获标准错误、失败时继续
- 命令:
- 判断返回码:
- 如果
{{command.return_code}} == 0:执行“发送成功通知”(企业微信) - 如果
{{command.return_code}} != 0:执行“发送失败通知”,并附上{{command.stderr}}的前 500 字符
- 如果
- 清理:无论成功失败,执行
rmdir /s /q C:\rpa\jobs\{{job_id}}(保留日志需单独配置)
关键配置细节:
- 在“执行脚本”组件中,“超时时间”设为
1800秒(30分钟),防止脚本卡死。 - “环境变量”中的
SMTP_PASS,在影刀控制台中设为“密文类型”,输入时自动加密,脚本中os.getenv("SMTP_PASS")返回解密后的明文。 - “发送失败通知”组件,启用“截图”功能,自动截取当前 RPA 执行窗口,附在企业微信消息中。
4.3 Step 3:配置生产环境与监控告警
环境配置(影刀控制台操作):
- 进入“环境管理”,创建
PROD环境。 - 设置变量:
SMTP_USER = finance-report@company.comSMTP_PASS = [密文](粘贴加密后的密文)SCRIPT_VERSION = v1.0
- 将流程
Daily_Sales_Report_AutoSend绑定到PROD环境。
监控告警配置:
- 在“监控中心”中,为该流程开启“失败告警”。
- 告警方式:钉钉群机器人(Webhook URL 已配置)。
- 告警内容模板:
【销售报表失败】 流程:{{flow.name}} 时间:{{event.time}} 错误摘要:{{event.error_message}} 查看详情:{{event.detail_url}} 截图:{{event.screenshot_url}} - 设置“连续失败3次”触发升级告警,电话通知运维负责人。
首次上线验证清单:
- 手动执行一次流程,检查
C:\rpa\jobs\下是否生成带时间戳的目录; - 检查
input.json内容是否正确,特别是date和email_to; - 检查
output/目录下是否生成report_20240520.pdf; - 检查企业微信是否收到成功通知;
- 故意将
SMTP_PASS设为错误值,验证失败告警是否触发,截图是否清晰。
我们曾因漏掉第 5 步,在上线后第二天才发现告警未配置,导致一次失败未被及时发现。现在,所有新流程上线前,必须完成此清单并签字确认。
4.4 Step 4:日常运维与迭代(如何应对业务变化)
场景:销售部门新增“西南”区域,要求报表包含该区域
操作流程(全程 5 分钟):
- 运维在影刀控制台,编辑流程
Daily_Sales_Report_AutoSend; - 找到“生成 input.json”组件,将
region_list数组增加"西南"; - 保存并发布;
- 在“监控中心”中,找到最近一次执行记录,点击“重跑”,选择“使用最新配置”;
- 查看日志,确认新区域数据已计入。
无需:修改 Python 脚本、重启服务、联系开发。RPA 的可视化配置,让业务变更真正实现“所见即所得”。
场景:Cursor 提示词优化后,生成了新版脚本sales_report_v2.py
发布流程:
- 将
sales_report_v2.py放入 Git 仓库/cursor-scripts/v1.1/目录; - 更新
/cursor-scripts/v1.1/README.md,记录本次优化点(如“修复了饼图中文乱码”); - 在影刀控制台,将环境变量
SCRIPT_VERSION从v1.0改为v1.1; - 触发一次手动执行,验证新版脚本;
- 若验证通过,更新
PROD环境的SCRIPT_VERSION。
整个过程,开发、运维、业务方各司其职:开发优化提示词并提交代码,运维更新环境变量,业务方验证效果。职责清晰,风险可控。
5. 常见问题与排查技巧实录
5.1 典型问题速查表
| 问题现象 | 可能原因 | 排查步骤 | 解决方案 |
|---|---|---|---|
脚本在 RPA 中执行失败,报错FileNotFoundError: [Errno 2] No such file or directory |