何为封闭系统(开发者视野)
想必大家都使用过学校(或单位、组织)的某某管理系统。它们没有任何开放的接口对外,对于开发者来讲是完全封闭的
可能受限于安全和开发成本的考量,封闭系统无法公开任何接口,优雅的 API 和 WebHook,在这里毫无用武之地
如果大家不幸要与类似系统交互,需要将封闭系统上的数据上传到其它平台实现其它丰富的功能,比如转发管理系统上边的通知内容到飞书群、下载 OA 系统下发的文件上传到图床、根据教务系统成绩更新即时通知到微信等等,此文希望能提供一种解决方案,打通封闭系统的局限
相反地,提供了对外接口的系统就是开放的,比如飞书、Notion、aPass 平台、Saas 平台 等
解决思路
- 从封闭系统取数据:
- 合法地逆向工程,分析内部接口取得数据
- 对于浏览器应用,可以开发浏览器扩展,实现数据的抓取;也可以使用 Headless browser 实现自动化,比如开源的 Playwright
- 利用 RPA(机器人流程自动化) 工具从封闭系统取得数据,批量保存到本地
- 向目标系统发数据:
- 如果目标系统是封闭的,类比第一步的取数据方法完成上传操作
- 如果目标系统是开放的,利用目标平台的开放接口上传到目标系统
实战示例
问题分析
下载 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 的
执行命令行
功能调用此程序即可