自动接收图片并上传到服务器,适用微信、企业微信等所有应用
前言
WorkTool企微机器人可以接收客户群的消息,但接收图片一直是个问题,本文以企业微信为例,实际原理具有广泛适用性,并可扩展到微信等所有APP端。
想要接收企微消息里的图片,你在往下看之前最好确保:
- 你已经使用WorkTool企微机器人并且自己接入过第三方QA(或有回调接口开发能力)
- 有图片OCR或图像识别能力或相关接口
正文
下面开始直接进入接入步骤,首先WorkTool企微机器人是基于无障碍服务为基础的自动化框架而制作的,其读屏技术只能获取到文本内容,对图片等流媒体内容是无法获取到的,这时可能会有两种思路:方案一是图片总是要下载到本地,我们直接监控本地新文件生成就实现了图片获取;方案二是自动截图,我们在发现图片时点开查看然后进行截图,自己保存图片文件。本文讲述方案一的实现,工作流程图如下:
我们先找到目标程序的文件夹目录,使用 Android 原生提供的文件监控类 FileObserver 来进行实现,因为这个类没法直接监控文件夹下的子文件夹所有使用递归实现监控全部文件夹。
public class MultiFileObserver extends FileObserver {
/** Only modification events */
public static int CHANGES_ONLY = CREATE | MODIFY | DELETE | CLOSE_WRITE
| DELETE_SELF | MOVE_SELF | MOVED_FROM | MOVED_TO;
private List<SingleFileObserver> mObservers;
private String mPath;
private int mMask;
public MultiFileObserver(String path) {
this(path, ALL_EVENTS);
}
public MultiFileObserver(String path, int mask) {
super(path, mask);
mPath = path;
mMask = mask;
}
@Override
public void startWatching() {
if (mObservers != null)
return;
mObservers = new ArrayList<SingleFileObserver>();
Stack<String> stack = new Stack<String>();
stack.push(mPath);
while (!stack.isEmpty()) {
String parent = stack.pop();
mObservers.add(new SingleFileObserver(parent, mMask));
File path = new File(parent);
File[] files = path.listFiles();
if (null == files)
continue;
for (File f : files) {
if (f.isDirectory() && !f.getName().equals(".")
&& !f.getName().equals("..")) {
stack.push(f.getPath());
}
}
}
for (int i = 0; i < mObservers.size(); i++) {
SingleFileObserver sfo = mObservers.get(i);
sfo.startWatching();
}
}
@Override
public void stopWatching() {
if (mObservers == null)
return;
for (int i = 0; i < mObservers.size(); i++) {
SingleFileObserver sfo = mObservers.get(i);
sfo.stopWatching();
}
mObservers.clear();
mObservers = null;
}
@Override
public void onEvent(int event, String path) {
}
/**
* Monitor single directory and dispatch all events to its parent, with full
* path.
*/
class SingleFileObserver extends FileObserver {
String mPath;
public SingleFileObserver(String path) {
this(path, ALL_EVENTS);
mPath = path;
}
public SingleFileObserver(String path, int mask) {
super(path, mask);
mPath = path;
}
@Override
public void onEvent(int event, String path) {
String newPath = mPath + "/" + path;
MultiFileObserver .this.onEvent(event, newPath);
}
}
}
开启文件夹的工作可以在 Application 启动时候执行,至此只要发现了新的文件创建和写入完成,我们就可以认为有新的图片文件被获取了,然后推送到我们的目标服务器上,后台再进行对图片的处理和分析然后选择性的进行回复(调用 WorkTool 发送消息指令)即可。
WorkTool 企微机器人的API文档地址: https://worktool.apifox.cn/
总结
至此,你应该明白了自动化框架实现图片获取的原理,但这种方案还是存在不稳定的情况或者图片下载了但不知道是谁发的这种问题。后面我们继续写方案二,自动截图,稳定性理论上可以大幅度提升。WorkTool 企微机器人可以自动将接收到的图片推送给第三方系统,如果还没了解过 WorkTool 可以先看下官网 或入门教程尝试一下。