企业内网 RPA 离线部署实践:从选型到落地的完整方案

公司内网物理隔离,无外网,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 又下错了版本,重新找有外网的机器下载,来回折腾了整整两天。

解决方案:

  1. 在内网找了一台有临时外网权限的机器,下载 Chrome 115 离线安装包

  2. 同步下载对应版本 ChromeDriver:ChromeDriver 115 下载页

  3. 内网服务器上卸载旧版 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
  4. 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 月于某制造业企业内网机房

相关推荐
optimistic_chen2 小时前
【AI Agent 全栈开发】MCP
java·linux·运维·人工智能·ai编程·mcp
charlie1145141912 小时前
嵌入式Linux嵌入式Linux驱动开发:板级DTS实操与完整实战演练——从修改设备树到点亮LED的完整闭环
linux·运维·驱动开发
MAVER1CK9 小时前
Docker容器创建好后修改容器配置
运维·docker·容器
MY_TEUCK9 小时前
【2026最新Python+AI学习基础】Python 入门笔记篇
笔记·python·学习
赢乐9 小时前
大模型学习笔记:检索增强生成(RAG)架构
人工智能·python·深度学习·机器学习·智能体·幻觉·检索增强生成(rag)
lifewange11 小时前
Redis 集合(Set)运算完全指南
数据库·chrome·redis
NightReader11 小时前
CPU 高使用率,怎么降下来
运维·服务器
浪里行舟11 小时前
你的品牌正在被AI“遗忘”?用BuildSOM找回搜索的下一个风口
人工智能·python·程序员
SWAGGY..11 小时前
Linux系统编程:(七)Makefile入门:轻松掌握编译自动化
linux·运维·自动化