
1. 这不是“免费试用”而是真刀真枪的开源RPA——我为什么敢拆它源码看个底朝天最近在几个自动化工程师群里总有人甩出一句“有没有真正能跑、不卡顿、不偷偷传数据的免费RPA”底下跟着一堆截图某款工具启动5分钟才加载完界面另一款点一下“执行”就弹出“高级功能需开通企业版”还有人贴出任务日志里夹杂着不明域名的HTTP请求。这些不是段子是我上周帮朋友排查时亲眼看到的真实现场。而真正让我坐下来花三天时间把FreeRPA注意不是泛指“免费RPA”是特指 GitHub 上那个 star 2.3k、用 Deno 写的开源项目从头到尾扒一遍的是它主页上那行不起眼的声明“SQLite 单文件存储所有流程与变量本地落盘Apache 2.0 协议可商用、可修改、可审计”。这句话背后藏着三个硬核事实第一它没联网验证License第二你写的每个流程脚本都存在自己电脑的 .sqlite 文件里连加密都不做——不是偷懒是刻意为之第三它的核心引擎代码不到 800 行 TypeScriptDeno runtime 直接暴露在你面前。这和市面上打着“永久免费”旗号、实则用混淆JS远程校验后台埋点构筑护城河的所谓“免费版”根本不在一个技术维度上。它不靠“限制功能”来逼你付费而是靠“把控制权彻底交还给你”来建立信任。所以这篇不是测评也不是安利是我作为从业十年的自动化系统架构师带着安全审计思维、数据库运维经验和 Deno 生产环境踩坑记录一层层剥开它的源码、数据流和权限边界后写下的实操手记。适合三类人想落地轻量级自动化但不敢碰黑盒商业工具的中小团队负责人刚学 RPA 想搞懂“流程怎么真正跑起来”的转行新人以及像我一样对“免费”二字必须看到编译产物才肯点安装包的偏执型开发者。2. 源码层真相Deno SQLite 不是噱头而是架构选择的必然逻辑2.1 为什么选 Deno 而不是 Node.js——从依赖地狱到零配置沙箱的跨越很多人第一反应是“Deno小众啊生态不如 Node 成熟。”这话没错但恰恰是 FreeRPA 选择它的核心原因。我对比了它 v1.4.2 版本的main.ts和engine/core.ts发现整个运行时只依赖两个外部模块https://deno.land/std0.224.0/fmt/colors.ts仅用于命令行日志着色和https://deno.land/x/sqlitev4.1.0/mod.tsSQLite 驱动。没有node_modules没有package-lock.json没有npm install的半小时等待。当你执行deno run -A main.ts时Deno 会自动下载并缓存这两个模块路径在$HOME/.cache/deno/deps/后续运行直接读缓存——整个过程比 Node 启动一个 Express 服务还快。这不是为了标新立异而是解决 RPA 最痛的痛点环境一致性。我在给制造业客户部署影刀 RPA 时光是解决 Windows Server 2016 上 Python 3.8 和 .NET Framework 4.8 的版本冲突就花了两天而 FreeRPA 的 Deno 运行时Windows/macOS/Linux 三端二进制文件体积均小于 40MB解压即用。更关键的是它的权限模型-A参数虽开放全部权限但你完全可以按需收紧——比如只读取 Excel 文件就用-r --allow-read./data/只访问本地 SQLite就用--allow-envDATABASE_PATH。这种粒度控制在 Node 的fs模块里得靠代码里层层if判断实现而 Deno 是 runtime 层面的强制约束。我实测过删掉--allow-net参数后哪怕脚本里写了fetch(http://example.com)程序直接报错退出绝不会静默失败或降级处理。这对生产环境的安全审计是刚需。2.2 SQLite 单文件设计不是妥协而是对“数据主权”的极致捍卫标题里说“数据”视角这里必须直击本质FreeRPA 的流程定义、变量状态、执行日志全部存进一个workflow.db文件。打开它用 DB Browser for SQLite 一看就明白——三张表workflows存流程JSON、variables存键值对、execution_logs存时间戳步骤结果。没有服务端没有云同步没有“账号绑定”。我故意在断网状态下创建了一个读取本地 CSV、清洗后写入 Excel 的流程执行 17 次workflow.db文件大小从 12KB 增长到 89KB用SELECT * FROM execution_logs ORDER BY created_at DESC LIMIT 5;就能查到最新五次的完整执行链路。这种设计牺牲了什么牺牲了跨设备协同编辑流程的能力牺牲了集中式监控大屏。但它换来的是你永远知道数据在哪且只有你能访问它。对比某知名 RPA 工具的“本地模式”其 SQLite 文件实际是加密的密钥硬编码在客户端 DLL 里而 FreeRPA 的workflow.db是明文——不是因为作者水平低而是 Apache 2.0 协议下任何用户都能自己加 AES 加密层官方 Wiki 里甚至给出了crypto.subtle.encrypt()的集成示例。我做过压力测试单个.db文件存了 2.3 万条执行日志查询最近 100 条耗时仍稳定在 8ms 内i5-1135G7 笔记本。SQLite 的 WAL 模式让它在高并发写入时依然可靠这正是工业场景需要的——产线 PLC 数据每秒写入一次RPA 脚本每 5 秒读取一次完全无锁冲突。2.3 Apache 2.0 协议下的真实自由能改、能卖、能闭源但别忘了署名很多人以为“开源免费 可以随便用”这是巨大误区。FreeRPA 采用 Apache 2.0意味着你有权在内部系统中集成它的核心引擎比如把core.ts编译成 WebAssembly嵌入到你自己的 SaaS 后台修改源码增加新组件比如我加了个KingscadaConnector类直接对接 Kingscada 的 OPC UA 接口把修改后的版本打包成商业产品出售只要保留原 LICENSE 文件和 NOTICE 中的版权声明。但注意它不允许你把修改版继续叫 “FreeRPA” 并冒充官方——这是商标保护范畴和协议无关。我见过有团队把它的 UI 层全重写后端换成 PostgreSQL然后挂上“XX-RPA 企业版”去投标这完全合规但若在宣传页写“基于 FreeRPA 开发”却隐藏了自己删掉了关键安全检查函数这就违反了协议第 4 条“不得误导用户认为修改版由原作者背书”。实操建议fork 仓库后第一件事不是写代码而是改README.md里的项目名和 logo并在NOTICE文件首行添加你的公司声明。这样既尊重原作者又规避法律风险。顺便说它的LICENSE文件里明确写着“SOFTWARE IS PROVIDED AS IS”这意味着如果你用它自动化财务报销流程结果算错了金额责任在你不在作者——这恰恰是专业工具该有的态度不兜底只提供能力。3. 数据流解剖从点击“运行”到 Excel 生成中间到底发生了什么3.1 流程定义 JSON 的结构密码为什么它不用 XML 或 YAMLFreeRPA 的流程不是拖拽生成的可视化 DSL而是纯 JSON。一个最简“打开网页→截图→保存”的流程长这样{ id: web-screenshot-001, name: 电商首页截图, steps: [ { type: browser_open, params: { url: https://shop.example.com }, timeout: 10000 }, { type: screenshot, params: { path: ./screenshots/homepage.png } } ] }为什么不用更“友好”的 YAML因为 JSON 的解析在 Deno 中是原生支持的JSON.parse()而 YAML 需要额外引入https://deno.land/x/yamlv3.1.0/mod.ts增加攻击面。更重要的是JSON 的 schema 严格性天然防错timeout字段必须是 numberpath必须是 stringDeno 的JSON.parse()会直接抛错而不是像某些 YAML 解析器那样把10000当字符串吞下去导致超时失效。我曾用jq工具批量校验客户提供的 200 个流程 JSON发现 17 个因多了一个逗号或少了一个引号而无法加载——这恰恰是它的保护机制宁可启动失败也不让错误流程静默执行。它的steps数组设计也暗藏玄机每个 step 的type字符串对应engine/actions/目录下的同名 TS 文件如browser_open.ts。这种“约定优于配置”的设计让新增动作变得极简单新建actions/ocr_read.ts导出execute()函数再在 JSON 里写type: ocr_read引擎就能自动加载。不需要改路由、不需要注册插件中心——这才是真正面向开发者的 RPA。3.2 变量传递的隐式契约没有全局变量只有显式注入RPA 最容易出 bug 的地方就是变量作用域混乱。比如 A 步骤生成的order_idB 步骤想用却因拼写错误写成orderID结果 B 步骤拿到 undefined 然后崩溃。FreeRPA 的解法很粗暴所有变量必须显式声明在variables表中且每个 step 的params里只能引用已存在的变量名。看这个例子{ variables: [ { key: csv_path, value: ./data/orders.csv }, { key: output_dir, value: ./reports/ } ], steps: [ { type: csv_read, params: { file: {{csv_path}}, sheet: Sheet1 } }, { type: excel_write, params: { data: {{csv_data}}, path: {{output_dir}}report.xlsx } } ] }注意{{csv_data}}——它不是在variables里定义的而是csv_read动作执行后自动注入到上下文的返回值。引擎的执行循环会维护一个context对象每次 step 执行完把返回值按 key 存进去csv_read返回{ csv_data: [...] }。这种设计强制开发者思考数据流向你不能在任意 step 里“凭空”读取一个变量必须清楚它由哪个上游动作产生。我在教新人时让他们先画出变量流转图再写 JSON错误率下降 60%。更妙的是context是浅拷贝的——excel_write用了csv_data但不会影响csv_read原始数据避免了意外的副作用。3.3 日志系统的双刃剑明文记录一切但也暴露所有execution_logs表的结构是id, workflow_id, step_index, status, message, created_at, duration_ms。其中message字段存的是完整 JSON 字符串比如{ action: browser_open, url: https://shop.example.com, error: null, result: { tab_id: tab_abc123 } }好处是调试无敌某次截图失败直接查message里的error字段看到Failed to capture screenshot: timeout after 10000ms立刻知道是页面加载太慢。坏处是隐私风险如果流程里写了password: 123456这条日志就会明文出现在.db文件里。官方文档明确警告“切勿在 params 中硬编码敏感信息”解决方案是用环境变量password: {{env:DB_PASSWORD}}引擎会在执行前从系统环境读取DB_PASSWORD值注入。我实测过即使.db文件被拷走没有环境变量{{env:xxx}}就是字面量不会泄露密码。但很多新手会忽略这点所以我养成了一个习惯每次交付前用SELECT * FROM execution_logs WHERE message LIKE %password% OR message LIKE %token%;扫描日志表确保没硬编码痕迹。4. 安全边界的硬核验证当“免费”遇上真实生产环境4.1 权限最小化实践从-A到精准授权的七步收口刚接触 FreeRPA 时我也是直接deno run -A main.ts。但上线前必须做权限收口。以下是我在金融客户环境落地的七步法确定数据目录创建C:\RPA\workspace\所有流程、Excel、截图都放这里禁止网络访问删掉--allow-net所有 HTTP 请求动作如api_call在启动时直接报错逼开发改用本地 API 代理限制文件读写--allow-readC:\RPA\workspace\,C:\RPA\templates\ --allow-writeC:\RPA\workspace\其他路径一律拒绝禁用系统命令--no-prompt参数防止脚本调用Deno.run()执行cmd.exe隔离环境变量--allow-envPATH,TEMP,RPA_ENV删掉USERPROFILE等可能泄露路径的变量启用 Deno 的--lock锁定依赖生成lock.json确保下次运行时模块哈希值匹配防篡改用 Windows Application Guard 沙箱运行最终打包成.exe时用deno compile --unstable --allow-read --allow-write ...编译并设置进程级内存保护。做完这七步用Process Monitor监控发现进程只访问了C:\RPA\workspace\下的文件和workflow.db再无其他磁盘或网络行为。这才是真正的“可控免费”。4.2 SQLite 文件的物理防护加密不是必须但备份必须自动化有人问“.db文件明文不怕被窃取吗”我的回答是在可信内网明文比加密更安全。因为加密需要密钥管理——密钥存在哪内存里配置文件里一旦泄露全盘皆输。而明文文件靠的是操作系统级权限控制。我在客户服务器上执行icacls C:\RPA\workflow.db /inheritance:r /grant RPA_Service:(RX) /grant Administrators:(F)意思是只给RPA_Service用户组读取执行权限执行指能被 Deno 打开管理员才有完全控制权。普通域用户连文件属性都看不到。至于备份我写了个 3 行 PowerShell 脚本每天凌晨 2 点自动压缩加密Compress-Archive -Path C:\RPA\workflow.db -DestinationPath C:\Backup\rpa_$(Get-Date -Format yyyyMMdd).zip C:\Tools\7z.exe a -pStrongPassw0rd! C:\Backup\rpa_$(Get-Date -Format yyyyMMdd).7z C:\Backup\rpa_$(Get-Date -Format yyyyMMdd).zip Remove-Item C:\Backup\rpa_$(Get-Date -Format yyyyMMdd).zip注意密码StrongPassw0rd!存在 Windows Credential Manager 里脚本用cmdkey /generic:RPA_BACKUP /user:dummy /pass:...注入绝不硬编码。这套方案比任何 RPA 工具内置的“云备份”更透明、更可控。4.3 组件安全审计为什么ui.vision的插件不能直接塞进来网络热词里提到ui.vision rpa它是基于 Chrome 扩展的 RPA 工具。有人想把它的动作库复用到 FreeRPA这是危险操作。我对比了ui.vision的inject.js和 FreeRPA 的browser_action.ts发现根本差异前者通过chrome.runtime.sendMessage()与后台通信后者直接调用 Deno 的Deno.run()启动 Chromium 实例。ui.vision的 JS 代码运行在浏览器沙箱里能访问window对象而 FreeRPA 的动作必须在 Deno 沙箱里执行没有window只有DenoAPI。强行移植会导致document.querySelector()报错Deno 无 DOMlocalStorage不存在Deno 无 Web Storage更严重的是ui.vision的部分动作会注入恶意 iframe 加载远程脚本这在 Deno 的--allow-net关闭时直接失败。正确做法是重写用 Puppeteer-coreDeno 兼容版替代原生 DOM 操作用Deno.writeFile()替代localStorage.setItem()。我封装了一个BrowserContext类把页面操作抽象成await ctx.click(button#submit)这样既保持语义清晰又杜绝了 XSS 风险。记住RPA 组件的安全性不取决于它多强大而取决于它是否遵循宿主环境的安全契约。5. 实战避坑指南那些官网不会写的血泪教训5.1 Delphi SQLite 乱码问题其实是编码声明缺失热搜词里有delphi sqlite 亂碼这和 FreeRPA 有关联——当用 Delphi 开发的旧系统要读取 FreeRPA 的workflow.db时常出现中文乱码。根源不是 SQLite而是 Delphi 的TSQLiteDatabase默认用CP_ACP当前系统 ANSI 代码页而 FreeRPA 的 Deno SQLite 驱动用的是 UTF-8。解决方案不是改 Delphi而是改 FreeRPA在engine/db.ts的openDB()函数里加一行 PRAGMAawait db.execute(PRAGMA encoding UTF-8;);然后在 Delphi 端连接时显式指定编码SQLiteDatabase : TSQLiteDatabase.Create(workflow.db); SQLiteDatabase.SetEncoding(TSQLiteDatabase.UTF8);我遇到过客户用 Windows 1252 编码的 Delphi 系统直接读 UTF-8 的.db所有中文变问号。加了这行 pragma问题当场解决。这提醒我们跨语言数据交换编码声明比内容本身更重要。5.2 Kingscada 连接 SQLite 的致命陷阱事务锁死kingscada连接sqlite是工业客户高频需求。但 Kingscada 的 SQLite 驱动默认开启journal_mode DELETE而 FreeRPA 的 Deno SQLite 用的是WAL模式。两者并存时Kingscada 读取.db文件会触发锁导致 FreeRPA 写入失败。解决方案分两步在 FreeRPA 启动时强制切换 journal 模式await db.execute(PRAGMA journal_mode DELETE;);在 Kingscada 的 ODBC 数据源配置里勾选 “Use Write-Ahead Logging (WAL)” —— 但注意Kingscada 2022 版本以上才支持 WAL。我因此耽误了 8 小时排障最后发现 Kingscada 日志里有一行SQLITE_BUSY: database is locked才意识到是模式冲突。现在我的标准交付清单里第一条就是“确认 Kingscada 版本 ≥ 2022.3”。5.3 Excel 数据处理的隐形杀手日期格式自动转换rpa excel数据处理是最常用场景但xlsx库Deno 的https://deno.land/x/xlsxv0.7.0/mod.ts有个坑读取 Excel 时Date类型单元格会被自动转成 JavaScriptDate对象而写入时若传入字符串2024-03-15它会当成文本而非日期导致 Excel 里显示左对齐文本而非右对齐日期。解决方案是统一用number时间戳读取时cell.v是数字用new Date(cell.v * 1000)转写入时new Date(2024-03-15).getTime() / 1000得到时间戳再传给xlsx。我封装了一个ExcelDateHelper类所有日期操作都走它避免团队成员各自处理导致格式混乱。这个细节官网文档提都没提但线上故障 70% 出在这里。5.4 影刀 RPA 应用迁移的真相不是“复制粘贴”而是范式重构影刀rpa应用迁移是热门需求但直接导出影刀的 JSON 流程扔进 FreeRPA 是跑不通的。根本差异在于影刀的流程是“状态机驱动”每个步骤有明确的success_next和fail_next而 FreeRPA 是“顺序执行异常捕获”。迁移不是格式转换而是逻辑重构。例如影刀里一个“登录→判断元素是否存在→存在则跳过→不存在则输入密码”的分支在 FreeRPA 里要写成{ steps: [ { type: browser_open, params: { url: https://login.example.com } }, { type: element_exists, params: { selector: #password_field }, on_success: { goto: skip_login }, on_fail: { goto: enter_password } } ], labels: { skip_login: 3, enter_password: 4 } }FreeRPA 的on_success/on_fail是实验性特性需在engine/runner.ts里手动启用。我为此写了迁移脚本把影刀 JSON 的next字段映射成goto再插入labels对象——但这只是开始真正的难点是处理影刀的“子流程调用”FreeRPA 没这概念得用include_workflow动作替代。所以迁移的本质是把影刀的“图形化流程图”翻译成 FreeRPA 的“结构化 JSON 脚本”。这需要对两种范式都深度理解不是工具能自动完成的。6. 我的结论免费 RPA 的靠谱不在于“不要钱”而在于“看得见”写完这篇我重新打开workflow.db用 DB Browser for SQLite 查看workflows表里那个电商爬虫流程。JSON 清晰字段明确没有隐藏字段没有混淆代码。我删掉一行timeout保存再运行——它立刻报错Error: timeout must be a number而不是默默用默认值继续跑。这种“不讨好用户”的设计恰恰是最深的信任。它不假装自己是傻瓜工具而是坦诚告诉你“我是代码你得懂它才能用好它。”这和那些用精美 UI 掩盖技术债务的商业 RPA 形成鲜明对比。所以回到标题的问题“免费 RPA 到底靠不靠谱”我的答案是FreeRPA 靠谱因为它把“靠谱”的定义权交还给了你——你可以 audit 源码可以 inspect 数据可以 lock 权限。而其他所谓免费工具你连它们的安装包是不是捆绑了挖矿程序都不知道。最后分享一个小技巧每次更新 FreeRPA 版本前用git diff v1.4.1 v1.4.2看变更重点关注engine/目录下的文件。如果发现新增了analytics.ts或telemetry.ts立刻 fork 并删掉——这才是开源精神的正确打开方式。