Go RPA!快速联动一个封闭系统

Created
Aug 2, 2021 11:32 PM
Tags
rpa
golang

何为封闭系统(开发者视野)

想必大家都使用过学校(或单位、组织)的某某管理系统。它们没有任何开放的接口对外,对于开发者来讲是完全封闭的
可能受限于安全和开发成本的考量,封闭系统无法公开任何接口,优雅的 API 和 WebHook,在这里毫无用武之地
如果大家不幸要与类似系统交互,需要将封闭系统上的数据上传到其它平台实现其它丰富的功能,比如转发管理系统上边的通知内容到飞书群下载 OA 系统下发的文件上传到图床、根据教务系统成绩更新即时通知到微信等等,此文希望能提供一种解决方案,打通封闭系统的局限
相反地,提供了对外接口的系统就是开放的,比如飞书、Notion、aPass 平台、Saas 平台 等

解决思路

  1. 从封闭系统取数据
      • 合法地逆向工程,分析内部接口取得数据
      • 对于浏览器应用,可以开发浏览器扩展,实现数据的抓取;也可以使用 Headless browser 实现自动化,比如开源的 Playwright
  1. 向目标系统发数据
      • 如果目标系统是封闭的,类比第一步的取数据方法完成上传操作
      • 如果目标系统是开放的,利用目标平台的开放接口上传到目标系统

实战示例

问题分析

下载 OA 系统上文件类通知,上传到明道云平台,利用明道云的工作流审核功能完成更多任务
  • 封闭系统:OA 管理系统
  • 目标系统:明道云 aPass 平台

解决方案选择

可以看到上文我建议的解决方案每一步有多个解决方案,合并起来就有2~4种方案。我选择利用 RPA 工具 + 开放系统接口 来解决这个问题,原因有下:
  • 此例 OA 系统使用 ASP 技术,Cookie 实现也不规范,逆向工程得不偿失;同样,和 RPA 的易用性比较起来,浏览器扩展也不香了
  • 明道云平台有较为完善的上传 API,能完成文件上传的需求

技术栈选择

有了方案,我们就需要具体实现啦!先来选择技术栈:
  • RPA 工具:国内很多场景下需要中文识别和处理,所以我选择了国内的 UIBOT 而不是 UIPATH
  • 明道云上传实现:UIBOT 也能完成这个任务,但速度太慢,不能并发;你说说并发最近最火的是什么?当然是 Go Lang 呀,当然,我只能用到 Go concurrency 能力的一点点,真正原因是它编译又快又方便,还多平台。
    • 等 UIBOT 取得数据后,我们只需要调用 Go 编译好的二进制文件就可以了

具体实现

使用 UIBOT 循环遍历 OA 网站上要下载的内容,下载到一个约定好的目录里,这个过程很简单,只是一些基本的界面操作
利用 Go 遍历下载好的目录,提取文件基本信息,利用 API 将信息和文件上传到明道云里,并且在里面写上并发的语法,怎么快怎么来!具体代码在下面这个 Repo 里,作为一个简单的参考
具体使用时,在 Release 界面下载对应操作系统的二进制文件,再使用 UIBOT 的执行命令行功能调用此程序即可