影刀RPA新手教程:配置文件管理实战——用JSON管理多环境配置
一、硬编码之痛(每个新手都踩过的坑)
你刚开始写RPA流程是不是这样写的:
在"打开网页"指令里直接写URL:https://shop-test.mysite.com/login
在"输入内容"指令里直接写账号密码:admin/123456
数据库路径写死:D:\workspace\data\product.db
换个环境——比如从测试切到生产——你得一行行改。一个流程动了8个URL、5个账号,漏改一个全流程报错。
硬编码就像用胶水粘电线:当时能用,换个地方就得全部重来。
二、认识影刀和正确的配置管理姿势
影刀安装完默认路径在C:\Users\你的用户名\AppData\Local\yingdao。流程文件(.rpa)实际是一个压缩包,里面是指令的JSON配置文件。双击.rpa是打开流程编辑器,右键解压能看到原始JSON。
核心思路:把一切会变的值——URL、账号、数据库路径、输出目录、通知地址——全部抽出来放进一个config.json文件。流程启动时读取这个文件,变量赋值。换环境只改config.json,流程代码一行不动。
三、创建config.json
项目目录结构:
你的项目文件夹/ ├── config.json ← 配置文件(改这里就行) ├── 淘宝采集.rpa ← 流程文件 ├── data/ ← 数据输出目录 └── logs/ ← 日志目录config.json内容:
{"target":{"login_url":"https://shop.mysite.com/admin/login","data_url":"https://shop.mysite.com/admin/orders","api_base":"https://shop.mysite.com/api/v1"},"auth":{"username":"admin","password":"your_password_here"},"database":{"path":"D:\\workspace\\data\\orders.db","backup_path":"D:\\workspace\\backup\\"},"output":{"excel_dir":"D:\\workspace\\output\\reports\\","csv_dir":"D:\\workspace\\output\\csv\\"},"browser":{"browser_type":"chrome","headless":false,"wait_seconds":3},"notify":{"webhook_url":"https://open.feishu.cn/open-apis/bot/v2/hook/xxxxx","on_success":true,"on_failure":true}}设计要点:
- URL分
target.login_url和target.api_base,不要揉一起,后面可能新增URL只改值不改结构 - 账号密码放
auth节点,后续做敏感信息保护时只改这个节点 database.path用双反斜杠\\,Windows路径在JSON里必须这样写browser.headless是布尔值不是字符串,别写成"false"(带引号)notify.webhook_url为null时就是不通知,判断时用如果 webhook_url != "" 则发送
踩坑:JSON文件的最后一个字段后面不要留逗号。用json.cn网站粘贴验证一下格式,格式报错整个文件读不出来。
四、读取配置并赋值(元素定位和变量赋值)
用Python自定义代码块读取JSON
影刀里新建"Python代码"指令,写入:
importjsonimportos# 获取流程文件所在目录(config.json放在同目录)flow_dir=os.path.dirname(影刀内置_流程文件路径)config_path=os.path.join(flow_dir,'config.json')withopen(config_path,'r',encoding='utf-8')asf:config=json.load(f)# 逐个赋值给影刀变量影刀变量['login_url']=config['target']['login_url']影刀变量['data_url']=config['target']['data_url']影刀变量['api_base']=config['target']['api_base']影刀变量['username']=config['auth']['username']影刀变量['password']=config['auth']['password']影刀变量['db_path']=config['database']['path']影刀变量['excel_dir']=config['output']['excel_dir']影刀变量['webhook_url']=config['notify']['webhook_url']影刀变量['browser_wait']=config['browser']['wait_seconds']执行完这个代码块后,影刀的全局变量就有了这些值。
官方指令替代方案:影刀内置"文件_读取文本"+"数据转JSON"也可以读,但路径处理不如Python灵活。Python方法一步到位,而且os.path.join自动处理路径分隔符。
流程中使用变量
打开网页指令的目标URL字段直接填:{{login_url}}(影刀里用双花括号引用变量)
输入账号:{{username}}
数据库指令路径:{{db_path}}
所有原来写死的值全部替换成变量引用。改环境只需要改JSON文件,流程代码0改动。
五、多环境配置
测试环境URL是shop-test.mysite.com,生产环境是shop.mysite.com,数据库路径、账号都不同。一个JSON不够。
分文件方案
config.dev.json ← 开发/测试环境 config.prod.json ← 生产环境 config.local.json ← 本地调试三个文件结构完全一样,值不同。启动流程时根据环境变量或命令行参数选择:
importjsonimportosimportsys flow_dir=os.path.dirname(影刀内置_流程文件路径)# 读取环境变量判断环境,默认devenv=os.environ.get('RPA_ENV','dev')config_file=os.path.join(flow_dir,f'config.{env}.json')# 如果命令行传了参数,用参数的环境iflen(影刀变量.get('启动参数',''))>0:env=影刀变量['启动参数']config_file=os.path.join(flow_dir,f'config.{env}.json')withopen(config_file,'r',encoding='utf-8')asf:config=json.load(f)平台实战:飞书+MySQL双平台配置示例
飞书审批流程采集场景——测试环境和生产环境的feishu app_id、app_secret完全不同:
config.dev.json:
{"feishu":{"app_id":"cli_a6f123_test","app_secret":"test_secret_abc","approval_code":"TEST-APPROVAL-001"},"mysql":{"host":"192.168.1.100","port":3306,"database":"test_db","user":"test_user","password":"test_pass"}}config.prod.json:
{"feishu":{"app_id":"cli_b8g987_prod","app_secret":"prod_secret_xyz_long_token_here","approval_code":"PROD-APPROVAL-001"},"mysql":{"host":"10.0.1.50","port":3306,"database":"prod_db","user":"prod_user","password":"prod_strong_pass"}}流程代码不变,切换环境只改RPA_ENV环境变量:
set RPA_ENV=prod Bot.exe -a "飞书审批采集"数据处理中的配置切换
写Excel/csv的输出路径也来自config:
# 读取输出路径配置,自动拼接日期output_base=config['output']['excel_dir']date_str=datetime.now().strftime('%Y%m%d')full_path=os.path.join(output_base,f'审批数据_{date_str}.xlsx')影刀变量['output_excel_path']=full_path这样每天的导出文件自动按日期命名,不用手动改路径。
六、敏感信息保护
config.json里有账号密码,如果这个文件提交到Git或者共享给同事,密码就泄露了。
方案A:环境变量
密码不写config.json,从Windows环境变量读取:
importos# config.json里password字段留空或写"ENV:PASSWORD"config=json.load(open('config.json'))raw_password=config['auth']['password']ifraw_password.startswith('ENV:'):env_key=raw_password.split(':')[1]password=os.environ.get(env_key)else:password=raw_password在Windows里设置环境变量:此电脑→属性→高级系统设置→环境变量→新建,变量名RPA_PASSWORD,值填真实密码。影刀重启后自动读取。
方案B:单独密钥文件
更安全的做法:密码存一个单独的.secret.json,这个文件加入.gitignore:
.secret.json:
{"feishu_app_secret":"prod_secret_xyz_long_token","mysql_password":"real_password","webhook_token":"bearer_token_abc123"}config.json里只写引用路径:
{"secret_file":".secret.json"}读取时合并:
config=json.load(open('config.json'))if'secret_file'inconfig:secret=json.load(open(config['secret_file']))config['auth']['password']=secret['mysql_password']config['feishu']['app_secret']=secret['feishu_app_secret'].gitignore内容:
.secret.json config.local.json *.log data/七、鼠标键盘和图像自动化中的配置应用
影刀里需要截图识别的地方经常因为分辨率变化跑挂。把坐标、截图文件路径也放进config:
{"ui":{"screenshot_dir":"D:\\workspace\\screenshots\\","click_positions":{"login_button":[960,540],"confirm_btn":[800,600]},"match_threshold":0.85,"retry_times":3}}代码里引用:
click_x=config['ui']['click_positions']['login_button'][0]click_y=config['ui']['click_positions']['login_button'][1]match_confidence=config['ui']['match_threshold']换台分辨率不同的机器,只改config里的坐标值和阈值。
八、流程控制中的配置化
不是所有流程行为都写死在if-else里。比如"是否发送通知"“是否保存截图”“失败重试几次”,全部配置化:
{"flow_control":{"max_retry":3,"retry_interval_seconds":10,"save_screenshot_on_error":true,"send_notification":true,"stop_on_first_error":false,"continue_after_error":true}}流程中使用:
尝试次数 = 0 循环: 如果 尝试次数 >= {{max_retry}}: 跳出循环 执行核心逻辑 如果 成功: 跳出循环 否则: 尝试次数 = 尝试次数 + 1 等待 {{retry_interval_seconds}} 秒九、进阶技能:配置热更新
流程运行中修改配置能不能不重启?用文件监听:
importosimporttime# 记录配置文件的修改时间last_mtime=os.path.getmtime(config_path)# 在每轮循环开始检查current_mtime=os.path.getmtime(config_path)ifcurrent_mtime>last_mtime:# 重新加载配置withopen(config_path,'r',encoding='utf-8')asf:config=json.load(f)影刀变量['max_retry']=config['flow_control']['max_retry']last_mtime=current_mtime跑几小时的流程中途想改成重试5次改3次,改一下config.json,几秒后就生效。
十、系统联动:钉钉+Windows计划任务结合配置
钉钉机器人通知内容也走配置:
{"dingtalk":{"webhook":"https://oapi.dingtalk.com/robot/send?access_token=xxx","at_mobiles":["13800138000"],"msg_template":"【{env}环境】采集任务完成\n成功:{success}条\n失败:{fail}条\n耗时:{duration}"}}发送时:
msg=config['dingtalk']['msg_template']msg=msg.replace('{env}',env)msg=msg.replace('{success}',str(success_count))msg=msg.replace('{duration}',str(duration))影刀变量['ding_msg']=msg# 影刀指令:发送HTTP请求 → 钉钉webhookWindows任务计划里创建定时任务:
schtasks /create /tn "RPA数据采集" /tr "D:\yingdao\Bot.exe -a 数据采集 --env prod" /sc daily /st 08:00--env prod作为启动参数传到流程里,代码读取启动参数选择对应的config文件。
十一、工程化与规范
配置文件版本规范:每次大改备份旧配置,按日期命名config.prod.20240601.bak.json。
config.json的key命名:全部小写下划线,login_url、db_path、max_retry。别一会儿驼峰一会儿下划线。
必填字段校验:启动时检查所有必需字段是否存在,缺了就报清晰错误:
required_keys=['target.login_url','auth.username','database.path']forkeyinrequired_keys:keys=key.split('.')value=configforkinkeys:value=value.get(k,{})ifnotvalue:raiseException(f'配置缺少必填字段:{key}')流程初始化全部放在一个子流程里,叫"初始化_读取配置",后面所有子流程用到的全局变量都在这里赋值。改配置逻辑时只改这一个子流程。
十二、速查表与常见报错
| 错误信息 | 原因 | 解决 |
|---|---|---|
| json.decoder.JSONDecodeError | JSON格式错误 | json.cn验证格式,检查末尾逗号 |
| FileNotFoundError: config.json | 路径不对 | 用os.path.join拼接,别硬编码路径 |
| KeyError: ‘target’ | 读取了不存在的key | 加字段存在性校验 |
| 变量未定义:login_url | Python代码块执行失败 | 检查Python代码是否有语法错误 |
| UnicodeDecodeError | 文件编码不是UTF-8 | config.json用Notepad++保存为UTF-8 |
| 打开网页URL为空 | 读取配置失败但没检测 | 启动后先打印所有配置值验证 |
| 环境变量读不到 | 设置了环境变量没重启 | 影刀需要重启才能读到新环境变量 |
更多工具链和配置模板,我在 home.linyan.cloud 持续分享。
内容标签:#RPA #影刀 #配置管理 #JSON #多环境 #自动化运维
作者:林焱