☰
影刀RPA新手教程:配置文件管理实战——用JSON管理多环境配置
2026/10/11 12:44:03 网站建设 项目流程

影刀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:'):![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a25bb48250814a2189c17b2ed45fa872.png#pic_center)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]},![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0bc0da5c37364939a19c7e9acd15e69a.png#pic_center)"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请求 → 钉钉webhook

Windows任务计划里创建定时任务:

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.JSONDecodeErrorJSON格式错误json.cn验证格式,检查末尾逗号
FileNotFoundError: config.json路径不对用os.path.join拼接,别硬编码路径
KeyError: ‘target’读取了不存在的key加字段存在性校验
变量未定义:login_urlPython代码块执行失败检查Python代码是否有语法错误
UnicodeDecodeError文件编码不是UTF-8config.json用Notepad++保存为UTF-8
打开网页URL为空读取配置失败但没检测启动后先打印所有配置值验证
环境变量读不到设置了环境变量没重启影刀需要重启才能读到新环境变量

更多工具链和配置模板,我在 home.linyan.cloud 持续分享。

内容标签:#RPA #影刀 #配置管理 #JSON #多环境 #自动化运维
作者:林焱

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询