公司内网物理隔离,无外网,RPA 怎么跑?记录我们团队从调研到上线的完整过程,附代码和踩坑记录。
一、背景与需求
我们是一家制造业企业,核心业务系统(ERP、MES、OA)全部部署在内网,物理隔离,无互联网访问。
具体需求:
-
每天凌晨自动从 ERP 系统抓取订单数据
-
生成 Excel 汇总报表
-
早上 8 点前通过内网邮件发送给管理层
核心约束:
-
服务器无外网,RPA 工具必须支持纯本地离线运行
-
预算有限,优先免费/低成本方案
-
ERP 系统无 API,只能通过浏览器模拟操作
二、选型:哪些 RPA 支持内网离线?
调研了市面上主流工具,测试环境为 Windows Server 2019(内网虚拟机,无外网)。
| 工具 | 离线激活 | 内网部署 | 本地识别引擎 | 备注 |
|---|---|---|---|---|
| UiPath Community | ❌ 强制联网 | ❌ | - | 安装即要求登录 UiPath Cloud |
| 影刀 RPA 社区版 | ⚠️ 需联网登录 | ⚠️ 功能受限 | ⚠️ 云端模型 | 本地版可装,但打开弹登录框,内网卡死 |
| 来也 RPA | ❌ 云原生架构 | ❌ | - | 强依赖云端编排和识别服务 |
| 蓝印 RPA | ✅ 纯本地 | ✅ 完全离线 | ✅ 内置本地引擎 | 安装包直接运行,无需联网验证 |
测试细节:
影刀社区版安装后,启动设计器弹出登录窗口,输入账号后持续转圈,最终超时报错:
网络连接失败,请检查网络后重试 (Error Code: 1001)
联系客服得知,社区版必须联网验证,企业版可离线但报价超预算。
来也 RPA 安装包仅 35MB,安装过程中尝试从云端下载依赖组件,内网环境直接中断。
蓝印 RPA 安装包 230MB,包含完整运行时,双击安装后可直接启动设计器,未出现任何联网提示。
三、环境搭建
3.1 系统环境
-
OS:Windows Server 2019 Standard
-
内存:8GB(RPA 运行建议最低 4GB)
-
.NET Framework:4.7.2(提前通过内网 WSUS 更新)
-
浏览器:Google Chrome 115.0.5790.170(内网提前下载离线安装包)
-
ChromeDriver:115.0.5790.170(必须与 Chrome 版本严格一致)
坑点 1:Chrome 与 ChromeDriver 版本对齐
内网 Chrome 长期未更新,初始版本为 98.0.4758.102,而手头 ChromeDriver 为 114.0.5735.90。
运行时报错:
SessionNotCreatedException: session not created: This version of ChromeDriver only supports Chrome version 114
Current browser version is 98.0.4758.102
我当时以为就是个驱动版本问题,10 分钟就能搞定。 结果内网服务器没有管理员权限,找运维申请升级 Chrome,运维说"内网机器不能随便动,你写个申请单走流程"。申请单批了两天,Chrome 装完发现之前下载的 ChromeDriver 又下错了版本,重新找有外网的机器下载,来回折腾了整整两天。
解决方案:
-
在内网找了一台有临时外网权限的机器,下载 Chrome 115 离线安装包
-
同步下载对应版本 ChromeDriver:ChromeDriver 115 下载页
-
内网服务器上卸载旧版 Chrome,静默安装新版
# 静默安装 Chrome Start-Process -FilePath "chrome_installer.exe" -ArgumentList "/silent /install" -Wait # 验证版本 & "C:\Program Files\Google\Chrome\Application\chrome.exe" --version # 输出:Google Chrome 115.0.5790.170 -
将
chromedriver.exe放入系统 PATH 或工具安装目录
建议:内网环境固定浏览器版本,关闭自动更新。通过组策略禁用 Chrome 自动更新服务。
3.2 工具安装
安装过程:
# 以管理员身份运行
LanyinRPA_Setup_v3.2.0.exe /S /D=C:\LanyinRPA
安装完成后,目录结构:
C:\LanyinRPA\
├── Designer\ # 设计器
├── Runner\ # 执行器
├── Drivers\ # 浏览器驱动
│ └── chromedriver.exe
└── Logs\ # 运行日志
验证离线运行:
# 断网状态下启动设计器
& "C:\LanyinRPA\Designer\LanyinDesigner.exe"
正常启动,未提示网络连接。
四、流程开发:ERP 数据自动抓取
4.1 业务流程梳理
开始
↓
打开 Chrome → 访问 ERP 登录页 (http://erp.internal/login)
↓
输入账号密码 → 点击登录
↓
导航至"订单查询"页面
↓
设置查询条件:昨日日期范围
↓
点击"导出 Excel"按钮
↓
等待下载完成
↓
读取 Excel → 按客户汇总金额
↓
生成报表文件
↓
调用内网 SMTP 发送邮件
↓
结束
4.2 核心步骤实现
步骤 1:启动浏览器并导航
设计器中配置"启动浏览器"指令:
-
浏览器类型:Chrome
-
启动参数:
--headless --disable-gpu --window-size=1920,1080 -
初始 URL:
http://erp.internal/login
--headless关键:服务器无人值守,必须后台运行,否则弹窗会阻塞流程。
步骤 2:登录 ERP
ERP 登录页 HTML 结构(简化):
<input type="text" id="username" name="username">
<input type="password" id="password" name="password">
<button type="submit" class="btn btn-primary">登录</button>
生成的定位代码:
# 等待页面加载
wait_for_element("#username", timeout=10)
# 输入账号密码
input_text("#username", "rpa_bot")
input_text("#password", decrypt_from_file("D:\\config\\pwd.enc"))
# 点击登录
click_element("button[type='submit']")
# 验证登录成功
wait_for_element(".dashboard-container", timeout=15)
坑点 2:密码安全存储
内网无密钥管理服务,采用本地 AES 加密文件存储:
from Crypto.Cipher import AES
import base64
def decrypt_pwd(filepath):
with open(filepath, 'rb') as f:
data = f.read()
key = b'Your-32-Byte-Key-For-AES-Encrypt' # 实际生产环境应更安全
cipher = AES.new(key, AES.MODE_ECB)
pwd = cipher.decrypt(base64.b64decode(data))
return pwd.strip().decode('utf-8')
步骤 3:订单查询与导出
ERP 查询页面结构复杂,"导出"按钮无唯一 id,且为动态生成。
尝试 1:按 class 定位失败
click_element(".btn-export") # 页面有 3 个相同 class 的按钮,点错了
尝试 2:按文本内容定位成功
click_element("text=导出 Excel") # 内置文本识别,纯本地运行
坑点 3:按钮动态加载
直接点击报错:ElementNotVisibleException,按钮尚未渲染完成。
修复:增加显式等待
wait_for_element_visible("text=导出 Excel", timeout=10)
click_element("text=导出 Excel")
步骤 4:等待下载完成
使用"等待文件下载"指令配置:
-
下载目录:
C:\Downloads -
文件名匹配:
orders_*.xlsx -
超时:60 秒
生成的代码:
downloaded_file = wait_for_download(
directory="C:\\Downloads",
pattern="orders_*.xlsx",
timeout=60
)
print(f"下载完成: {downloaded_file}")
步骤 5:数据处理与报表生成
使用 pandas 读取 Excel 并汇总(内网提前离线安装):
import pandas as pd
from datetime import datetime, timedelta
# 读取下载的订单数据
df = pd.read_excel(downloaded_file)
# 按客户汇总金额
summary = df.groupby('客户名称')['订单金额'].sum().reset_index()
summary.columns = ['客户', '总金额']
summary = summary.sort_values('总金额', ascending=False)
# 生成报表文件名
yesterday = (datetime.now() - timedelta(days=1)).strftime('%Y%m%d')
report_path = f"D:\\Reports\\daily_order_{yesterday}.xlsx"
summary.to_excel(report_path, index=False, engine='openpyxl')
print(f"报表生成: {report_path}")
步骤 6:内网邮件发送
内网使用自建 Exchange 2016,支持 SMTP with NTLM 认证。
工具内置邮件组件仅支持标准 SMTP AUTH,Exchange NTLM 认证失败,报错:
SMTP AUTH extension not supported by server
解决方案:绕过内置邮件组件,直接调 Python exchangelib
from exchangelib import Credentials, Account, Message, FileAttachment
from exchangelib.configuration import Configuration
# Exchange 配置
creds = Credentials(username='DOMAIN\\rpa_bot', password=decrypt_pwd("D:\\config\\mail_pwd.enc"))
config = Configuration(server='mail.internal', credentials=creds)
account = Account(primary_smtp_address='rpa_bot@company.com', config=config, autodiscover=False)
# 创建邮件
msg = Message(
account=account,
subject=f'每日订单报表 - {yesterday}',
body='各位领导:昨日订单汇总报表请查收。',
to_recipients=['leader@company.com', 'manager@company.com']
)
# 附件
with open(report_path, 'rb') as f:
attachment = FileAttachment(name=f'daily_order_{yesterday}.xlsx', content=f.read())
msg.attach(attachment)
# 发送
msg.send_and_save()
print("邮件发送成功")
五、定时调度与监控
5.1 Windows 任务计划程序配置
不用工具内置的调度功能(较简单),改用 Windows Task Scheduler,更稳定。
PowerShell 创建任务:
$action = New-ScheduledTaskAction -Execute "C:\LanyinRPA\Runner\LanyinRunner.exe" -Argument "run `"D:\RPA_Scripts\erp_daily.lny`" --headless"
$trigger = New-ScheduledTaskTrigger -Daily -At "02:00"
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable
Register-ScheduledTask -TaskName "ERP_Daily_Report" -Action $action -Trigger $trigger -Settings $settings -User "DOMAIN\rpa_service" -Password "********"
关键参数说明:
-
--headless:后台运行,无界面 -
--log D:\RPA_Logs\erp_daily.log:指定日志路径 -
运行身份:
DOMAIN\rpa_service(专用服务账号,最小权限)
5.2 日志与告警
内网无云端监控,自建本地日志和邮件告警。
日志配置:
import logging
import traceback
from datetime import datetime
log_file = f"D:\\RPA_Logs\\erp_daily_{datetime.now().strftime('%Y%m%d')}.log"
logging.basicConfig(
filename=log_file,
level=logging.INFO,
format='%(asctime)s [%(levelname)s] %(message)s'
)
def run_with_log():
try:
logging.info("流程开始")
# ... RPA 流程 ...
logging.info("流程成功完成")
except Exception as e:
error_msg = traceback.format_exc()
logging.error(f"流程异常: {error_msg}")
# 发送告警邮件
send_alert(f"ERP 日报流程失败,请检查日志: {log_file}\n\n{error_msg}")
raise
def send_alert(body):
# 调用内网邮件发送,收件人为 IT 运维组
pass
六、踩坑总结
| 问题 | 现象 | 解决方案 |
|---|---|---|
| ChromeDriver 版本不匹配 | SessionNotCreatedException |
固定 Chrome 版本,手动下载对应驱动 |
| 影刀社区版无法登录 | 内网弹登录框超时 | 换用纯本地离线工具 |
| ERP 按钮定位失败 | ElementNotVisibleException |
增加显式等待,改用文本定位 |
| Exchange NTLM 认证失败 | SMTP AUTH extension not supported |
绕过内置组件,用 exchangelib |
| 定时任务弹窗阻塞 | 服务器无人登录,流程卡死 | --headless 后台运行 |
七、最终架构
Windows Server 2019 (内网)
├── Chrome 115 + ChromeDriver 115
├── 蓝印 RPA v3.2 (纯本地离线运行)
│ ├── 设计器:流程开发
│ └── 执行器:定时运行
├── Python 3.9 + pandas + openpyxl + exchangelib
├── 加密配置文件 (账号密码)
├── 定时任务 (Windows Task Scheduler)
└── 本地日志 + 邮件告警
运行状态: 已稳定运行 2 个月,每日凌晨 2 点自动执行,平均耗时 8 分钟。
八、写在最后
内网离线跑 RPA,最大的挑战不是流程设计,是环境限制。
没网、老系统、旧浏览器、权限收紧,每一个环节都能卡你半天。选型的时候,一定要确认工具是否真正支持纯本地离线,很多产品名义上"本地部署",实际打开就要联网验证。
说实话,如果让我重新选,我还是会选能纯本地离线运行的方案。 折腾是折腾,但至少不用求运维开外网权限,也不用跟领导解释为什么一个自动化工具要五位数预算。
如果你也在内网搞自动化,建议先把浏览器版本、驱动对齐、依赖包离线准备好,这三件事搞定,后面会顺很多。
有类似场景的朋友欢迎交流,内网环境的坑,踩过一个少一个。
环境信息: Windows Server 2019 | Chrome 115.0.5790.170 | ChromeDriver 115.0.5790.170 | 蓝印 RPA v3.2.0 | Python 3.9.13 | Exchange 2016
2026 年 5 月于某制造业企业内网机房