开源测试工具 Android、Browser 和 Windows API 接口开源协议,以 socket tcp 接口协议通信方式命令驱动,支持任何一门计算机语言调用。

aibote · 2022年10月28日 · 最后由 Willen 回复于 2022年10月31日 · 4107 次阅读

使用须知

Aibot能力
        1AndroidBot底层自主研发支持安卓原生APP和H5界面元素和图色定位元素元素定位速度是Appium框架的的10倍2340*1080 图色定位仅需要50毫秒
        2WindowsBot底层自主研发支持Windows应用.NETWinFormWPFQTJAVA(Swing和AWT等GUI库)和Electron 等语言开发的窗口界面元素和图色定位独家xpath算法 简洁急速
        元素/图色定位速度分别是可视化RPA的3倍和20倍
        3WebBot底层自主研发支持chromium内核的所有浏览器和应用C/C++语言基于浏览器内核协议研发而成的一款web自动化框架速度是selenium 10
        4Android远程投屏底层自主研发可在一台电脑监控观察多台安卓RPA机器人运行状态并批量管理操作
        5自建OCR服务器支持文字识别和定位免费且不限制使用次数
        6自研AiboteScriptUI界面开发工具提供人机交互功能打包exe发布机器人可以在离线环境运行

AndoridBot 开源协议

Aibote安卓云端自动化框架采用云端服务模式构建由安卓手机客户端主动连接服务器/电脑服务端程序
服务端应采用多线程TCP协议和多个安卓设备通信构架模式决定了自动化代码部署在云端能有效防止脚本被第三方恶意破解
结合Aibote远程投屏技术可直接连接远程用户设备做自动化机器人编写完美解决远程自动化测试需求独家图色定位算法
50毫秒以内的速度遍历查找2340*1080分辨率的设备为了让更多人体验到我们产品我们决议在此公布框架协议
希望有更多开发者能完善并封装成各种计算机语言封装请参考nodejs版的函数说明

发送命令协议格式len/len/len...\ndata
//len:函数名和参数的(字节)长度,统一为十进制 字符串类型
//data:函数名和参数数据 类型为 字符串或字节类型(string/byte) 

接收命令协议格式len/data
//len:返回数据包的(字节)长度
//data:返回的数据,类型为字符串或字节类型(string/byte) 

协议示例
//截图保存
sendData("saveScreenshot", "/storage/emulated/0/Android/data/com.aibot.client/files/1.png", 80, 150, 30, 30, 0, 127, 255);
// 参数一:函数名称
// 参数二:保存的图片路径(手机)
// 参数三:矩形左上角x坐标
// 参数四:矩形左上角y坐标
// 参数五:矩形右下角x坐标
// 参数六:矩形右下角y坐标
// 参数七:二值化算法类型
// 参数八:二值化阈值
// 参数九:二值化最大值
发送数据包14/61/2/3/2/2/1/3/3\nsaveScreenshot/storage/emulated/0/Android/data/com.aibot.client/files/1.png8015030300127255
返回数据包"false"或者 "true"

//获取色值
sendData("getColor", 100, 200);
// 参数一:函数名称
// 参数二:x坐标
// 参数三:y坐标
数据包8/3/3\ngetColor100200
返回数据包:#000000

//找图
sendData("findImage", "/storage/emulated/0/Android/data/com.aibot.client/files/1.png", 0, 0, 0, 0, 0.95, 0, 0, 0);
// 参数一:函数名称
// 参数二:保存的图片路径(手机)
// 参数三:矩形左上角x坐标
// 参数四:矩形左上角y坐标
// 参数五:矩形右下角x坐标
// 参数六:矩形右下角y坐标
// 参数七:相似度
// 参数八:二值化算法类型
// 参数九:二值化阈值
// 参数十:二值化最大值
数据包9/61/1/1/1/1/4/1/1/1\nfindImage/storage/emulated/0/Android/data/com.aibot.client/files/1.png00000.95000
返回数据包成功"x|y" 失败"-1.0|-1.0"

//找图2
sendData("matchTemplate", "/storage/emulated/0/Android/data/com.aibot.client/files/1.png", 0, 0, 0, 0, 0.95, 0, 0, 1);
// 参数一:函数名称
// 参数二:保存的图片路径(手机)
// 参数三:矩形左上角x坐标
// 参数四:矩形左上角y坐标
// 参数五:矩形右下角x坐标
// 参数六:矩形右下角y坐标
// 参数七:相似度
// 参数八:二值化阈值
// 参数九:二值化最大值
// 参数十:多个坐标点
数据包13/61/1/1/1/1/4/1/1/1\nmatchTemplate/storage/emulated/0/Android/data/com.aibot.client/files/1.png00000.95001
返回数据包单坐标点成功"x|y"  多坐标点成功 "x1|y1/x2|y2..."  失败"-1.0|-1.0"

//找动态图
sendData("findAnimation", 100, 0, 0, 0, 0);
// 参数一:函数名称
// 参数二:前后两张图相隔的时间,单位毫秒
// 参数三:矩形左上角x坐标
// 参数四:矩形左上角y坐标
// 参数五:矩形右下角x坐标
// 参数六:矩形右下角y坐标
数据包13/3/0/0/0/0\nfindAnimation1000000
返回数据包单坐标点成功"x|y"  多坐标点成功 "x1|y1/x2|y2..."  失败"-1.0|-1.0"

//找色
sendData("findColor", "#e8f2f8", "1020#e7f0f7", 0, 0, 0, 0, 1);
// 参数一:函数名称
// 参数二:主颜色值
// 参数三:相对偏移的颜色点,以 "x坐标+y坐标+色值" 字符串形式
// 参数四:矩形左上角x坐标
// 参数五:矩形左上角y坐标
// 参数六:矩形右下角x坐标
// 参数七:矩形右下角y坐标
// 参数八:相似度
数据包9/7/11/1/1/1/1/1\nfindColor#e8f2f81020#e7f0f700001
返回数据包成功"x|y" 失败"-1.0|-1.0"

//比色
sendData("compareColor", 100, 200, "#e8f2f8", "1020#e7f0f7", 0, 0, 0, 0, 1);
// 参数一:函数名称
// 参数二:主颜色值所在的X坐标
// 参数三:主颜色值所在的Y坐标
// 参数四:主颜色值
// 参数五:相对偏移的颜色点,以 "x坐标+y坐标+色值" 字符串形式
// 参数六:矩形左上角x坐标
// 参数七:矩形左上角y坐标
// 参数八:矩形右下角x坐标
// 参数九:矩形右下角y坐标
// 参数十:相似度
数据包12/3/3/7/11/1/1/1/1/1\ncompareColor100200#e8f2f81020#e7f0f700001
返回数据包"false"或者 "true"

//手指按下
sendData("press", 10, 20, 3000);
// 参数一:函数名称
// 参数二:x坐标
// 参数三:y坐标
// 参数四:按下持续时间
数据包5/2/2/4\npress10203000
返回数据包"false"或者 "true"

//手指移动
sendData("move", 10, 20, 3000);
// 参数一:函数名称
// 参数二:x坐标
// 参数三:y坐标
// 参数四:移动持续时间
数据包4/2/2/4\nmove10203000
返回数据包"false"或者 "true"

//手指抬起
sendData("release");
// 参数一:函数名称
数据包7\nrelease
返回数据包"false"或者 "true"

//点击坐标
sendData("click", 200, 500);
// 参数一:函数名称
// 参数二:x坐标
// 参数三:y坐标
数据包5/3/3\nclick200500
返回数据包"false"或者 "true"

//双击坐标
sendData("doubleClick", 200, 500);
// 参数一:函数名称
// 参数二:x坐标
// 参数三:y坐标
数据包11/3/3\ndoubleClick200500
返回数据包"false"或者 "true"

//长按坐标
sendData("longClick", 10, 20, 3000);
// 参数一:函数名称
// 参数二:x坐标
// 参数三:y坐标
// 参数四:长按持续时间
数据包9/2/2/4\nlongClick10203000
返回数据包"false"或者 "true"

//滑动坐标
sendData("swipe", 10, 10, 200, 200, 1000);
// 参数一:函数名称
// 参数二:开始x坐标
// 参数三:开始y坐标
// 参数四:结束x坐标
// 参数五:结束y坐标
// 参数六:滑动耗时
数据包5/2/2/3/3/4\nswipe10102002001000
返回数据包"false"或者 "true"

//执行手势
sendData("dispatchGesture", "1000/1558\n100/100\n799/800\n234/89", 3000);
// 参数一:函数名称
// 参数二:执行手势坐标位, 以"/"分割横纵坐标 "\n"分割坐标点。注意:末尾坐标点没有\n结束
// 参数三:手势耗时
数据包15/35/4\ndispatchGesture1000/1558\n100/100\n799/800\n234/893000
返回数据包"false"或者 "true"

//发送文本
sendData("sendKeys", "aibot");
// 参数一:函数名称
// 参数二:文本内容
数据包8/5\nsendKeysaibot
返回数据包"false"或者 "true"

//返回
sendData("back");
// 参数一:函数名称
数据包4\nback
返回数据包"false"或者 "true"

//home
sendData("home");
// 参数一:函数名称
数据包4\nhome
返回数据包"false"或者 "true"

//最近任务列表
sendData("recents");
// 参数一:函数名称
数据包7\nrecents
返回数据包"false"或者 "true"

//发送按键
sendData("sendVk", 187);
// 参数一:函数名称
// 参数二:虚拟键值 按键对照表 https://blog.csdn.net/yaoyaozaiye/article/details/122826340
数据包6/3\nsendVk187
返回数据包"false"或者 "true"

//启动App
sendData("startApp", "QQ");
// 参数一:函数名称
// 参数二:启动APP的名称或者包名
数据包8/2\nstartAppQQ
返回数据包"false"或者 "true"

//屏幕大小
sendData("getWindowSize");
数据包13\ngetWindowSize
返回数据包"width|height"

//图片大小
sendData("getImageSize", "/storage/emulated/0/Android/data/com.aibot.client/files/1.png");
数据包12/61\nsaveScreenshot/storage/emulated/0/Android/data/com.aibot.client/files/1.png
返回数据包"width|height"

//获取安卓ID
sendData("getAndroidId");
数据包12\ngetAndroidId
返回数据包"1f73c8f2f3b2f108"

//ocr
sendData("ocr",  0, 0, 0, 0, 1.0);
数据包3/1/1/1/1\3\nocr00001.0
返回数据包[[[7.0, 18.0], [61.0, 18.0], [61.0, 38.0], [7.0, 38.0]], ('办公自动化', 0.8806074261665344)][[[4.0, 94.0], [49.0, 94.0], [49.0, 118.0], [4.0, 118.0]], ('rpa', 0.978314220905304)]

//URL请求
sendData("urlRequest", "http://www.baidu.com", "GET", "null", "null");
数据包10/20/3/4/4\nurlRequesthttp://www.baidu.comGETnullnull
返回数据包返回请求数据内容

//Toast消息提示
sendData("showToast", "rpa");
数据包9/2\nshowToastrpa
返回数据包"false"或者 "true"

//识别验证码
sendData("getCaptcha", "/storage/emulated/0/Android/data/com.aibot.client/files/1.png", "username", "password", "123456", "1004", "0");
数据包10/61/8/8/6/4/1\n/storage/emulated/0/Android/data/com.aibot.client/files/1.pngusernamepassword12345610040
返回数据包"{"err_no":0,"err_str":"OK","pic_id":"9160109360600112681","pic_str":"8vka","md5":"35d5c7f6f53223fbdc5b72783db0c2c0"}"

//识别报错返分
sendData("errorCaptcha", "username", "password", "123456", "9160109360600112681");
数据包12/8/8/6/19\nerrorCaptchausernamepassword1234569160109360600112681
返回数据包"{"err_no":0,"err_str":"OK"}"

//查询验证码剩余题分
sendData("scoreCaptcha", "username", "password");
数据包12/8/8\nscoreCaptchausernamepassword
返回数据包"{"err_no":0,"err_str":"OK","tifen":821690,"tifen_lock":0}"

//获取元素位置
sendData("getElementRect", "com.aibot.client/com.aibot.client:id=inputServer");
数据包14/48\ngetElementRectcom.aibot.client/com.aibot.client:id=inputServer
返回数据包"239|628|989|764"

//获取元素描述内容
sendData("getElementDescription", "com.aibot.client/com.aibot.client:id=inputServer");
数据包21/48\ngetElementDescriptioncom.aibot.client/com.aibot.client:id=inputServer
返回数据包"192.168.2.7"

//获取元素文本
sendData("getElementText", "com.aibot.client/com.aibot.client:id=inputServer");
数据包14/48\ngetElementTextcom.aibot.client/com.aibot.client:id=inputServer
返回数据包"192.168.2.7"

//设置元素文本
sendData("setElementText", "com.aibot.client/com.aibot.client:id=inputServer", "rpa");
数据包14/48/3\nsetElementTextcom.aibot.client/com.aibot.client:id=inputServerrpa
返回数据包"false"或者 "true"

//点击元素
sendData("clickElement", "com.aibot.client/com.aibot.client:id=inputServer");
数据包12/48\nclickElementcom.aibot.client/com.aibot.client:id=inputServer
返回数据包"false"或者 "true"

//滚动元素
sendData("scrollElement", "com.aibot.client/com.aibot.client:id=inputServer", 0);
数据包13/48/1\nclickElementcom.aibot.client/com.aibot.client:id=inputServer0
返回数据包"false"或者 "true"

//判断元素是否存在
sendData("existsElement", "com.aibot.client/com.aibot.client:id=inputServer");
数据包13/48\nexistsElementcom.aibot.client/com.aibot.client:id=inputServer
返回数据包"false"或者 "true"

//判断元素是否选中
sendData("isSelectedElement", "com.aibot.client/com.aibot.client:id=inputServer");
数据包17/48\nisSelectedElementcom.aibot.client/com.aibot.client:id=inputServer
返回数据包"false"或者 "true"

//上传文件
sendData("pushFile", "/storage/emulated/0/1.png", fileData);
//fileData 文件字节数据
数据包8/25/655423\npushFile/storage/emulated/0/1.pngfileData
返回数据包"false"或者 "true"

//拉取文件
sendData("pullFile", "/storage/emulated/0/1.png");
数据包8/25\npullFile/storage/emulated/0/1.png
返回数据包文件字节数据

//跳转uri
sendData("openUri", "alipayqr://platformapi/startapp?saId=10000007");
数据包7/45\nopenUrialipayqr://platformapi/startapp?saId=10000007
返回数据包"false"或者 "true"

//拨打电话
sendData("callPhone", "10086");
数据包9/5\ncallPhone10086
返回数据包"false"或者 "true"

//发送短信
sendData("sendMsg", "10086", "123");
数据包7/5/3\nsendMsg10086123
返回数据包"false"或者 "true"

//获取活动窗口(activity)
sendData("getActivity");
数据包11\ngetActivity
返回数据包".MainActivity"

//获取活动包名(package)
sendData("getPackage");
数据包10\ngetPackage
返回数据包"com.aibot.client"

//设置剪切板文本
sendData("setClipboardText", "aibote");
数据包16/6\nsetClipboardTextaibote
返回数据包"false"或者 "true"

//获取剪切板文本
sendData("getClipboardText");
数据包16\ngetClipboardText
返回数据包"aibote"

//创建TextView控件
sendData("createTextView", 100, "Aibote TextView", 10, 10, 300, 100);
数据包14/3/15/2/2/3/3\ngetcreateTextView100Aibote TextView1010300100
返回数据包"false"或者 "true"

//创建EditText控件
sendData("createEditText", 101, "Aibote EditText", 10, 10, 300, 100);
数据包14/3/15/2/2/3/3\ngetcreateExitView101Aibote ExitView1010300100
返回数据包"false"或者 "true"

//创建CheckBox控件
sendData("createCheckBox", 102, "Aibote CheckBox", 10, 10, 300, 100);
数据包14/3/15/2/2/3/3\ngetcreateCheckBox102Aibote CheckBox1010300100
返回数据包"false"或者 "true"

//获取脚本配置参数
sendData("getScriptParam");
数据包14\ngetScriptParam
返回数据包{"100":"Aibote TextView"}

WindowsBot 开源协议

Aibote Windows自动化框架由node.js客户端连接 WindowsDriver.exe服务端程序采用TCP协议传输命令
全国领先xpath元素定位算法一键拾取控件元素图色 坐标等属性与安卓端代码统一书写格式降低用户学习成本
独家图色定位算法50毫秒以内的速度遍历查找1920*1080分辨率的设备为了让更多人体验到我们产品
我们决议在此公布框架协议希望有更多开发者能完善并封装成各种计算机语言封装请参考nodejs版的函数说明

发送命令协议格式len/len/len...\ndata
//len:函数名和参数的(字符串)长度,统一为十进制 字符串类型
//data:函数名和参数数据 类型为 字符串或字节类型(string/byte) 

接收命令协议格式len/data
//len:返回数据包的(字符串)长度
//data:返回的数据,类型为字符串或字节类型(string/byte) 

协议示例
//查找句柄
sendData("findWindow", "className", "windowName");
// 参数一:函数名称
// 参数二:窗口类名
// 参数三:窗口名
发送数据包10/9/10\nfindWindowclassNamewindowNmae
返回数据包成功"65862"失败 "null"

//查找句柄数组
sendData("findWindows", "className", "windowName");
// 参数一:函数名称
// 参数二:窗口类名
// 参数三:窗口名
发送数据包11/9/10\nfindWindowsclassNamewindowNmae
返回数据包成功返回多个句柄"65862|65863|65864"失败 "null"

//查找子句柄
sendData("findSubWindow", 65862, "className", "windowName");
// 参数一:函数名称
// 参数二:当前窗口句柄
// 参数三:窗口类名
// 参数四:窗口名
发送数据包13/5/9/10\nfindSubWindow65862classNamewindowNmae
返回数据包成功"460538"失败 "null"

//查找父句柄
sendData("findParentWindow", 460538);
// 参数一:函数名称
// 参数二:当前窗口句柄
发送数据包16/6/\nfindParentWindow460538
返回数据包成功"65862"失败 "null"

//获取窗口名称
sendData("getWindowName", 65862);
// 参数一:函数名称
// 参数二:窗口句柄
发送数据包13/5\ngetWindowName65862
返回数据包成功"aibote"失败 "null"

//显示/隐藏窗口
sendData("showWindow", 65862, true);
// 参数一:函数名称
// 参数二:窗口句柄
// 参数三:显示窗口 true, 隐藏窗口 false
发送数据包10/5/4\nshowWindow65862true
返回数据包"false"或者 "true"

//设置窗口到最顶层
sendData("setWindowTop", 65862);
// 参数一:函数名称
// 参数二:窗口句柄
发送数据包12/5\nsetWindowTop65862
返回数据包"false"或者 "true"

//移动鼠标
sendData("moveMouse", 65862, 100, 100, false);
// 参数一:函数名称
// 参数二:窗口句柄
// 参数三:x坐标
// 参数四:y坐标
// 参数五:操作模式
发送数据包9/5/3/3/5\nmoveMouse65862100100false
返回数据包"true"

//移动鼠标(相对坐标)
sendData("moveMouseRelative", 65862, 100, 100, false);
// 参数一:函数名称
// 参数二:窗口句柄
// 参数三:x坐标
// 参数四:y坐标
// 参数五:操作模式
发送数据包17/5/3/3/5\nmoveMouseRelative65862100100false
返回数据包"true"

//滚动鼠标
sendData("rollMouse", 65862, 100, 100, 10, false);
// 参数一:函数名称
// 参数二:窗口句柄
// 参数三:x坐标
// 参数四:y坐标
// 参数五:鼠标滚动次数,负数下滚鼠标,正数上滚鼠标
// 参数六:操作模式
发送数据包9/5/3/3/2/5\nrollMouse658621001002false
返回数据包"true"

//点击鼠标
sendData("clickMouse", 65862, 100, 100, 1, false);
// 参数一:函数名称
// 参数二:窗口句柄
// 参数三:x坐标
// 参数四:y坐标
// 参数五:点击类型,单击左键:1 单击右键:2 按下左键:3 弹起左键:4 按下右键:5 弹起右键:6 双击左键:7 双击右键:8
// 参数六:操作模式
发送数据包9/5/3/3/1/5\nclickMouse658621001001false
返回数据包"true"

//发送文本
sendData("sendKeys", "rpa");
// 参数一:函数名称
// 参数二:输入的文本
发送数据包8/3\nsendKeysrpa
返回数据包"true"

//后台发送文本
sendData("sendKeysByHwnd", 65862, "rpa");
// 参数一:函数名称
// 参数二:窗口句柄
// 参数三:输入的文本
发送数据包14/5/3\nsendKeysByHwnd65862rpa
返回数据包"true"

//输入虚拟键值(VK)
sendData("sendVk", 13, 1);
// 参数一:函数名称
// 参数二:虚拟键值 回车对应 VK键值 13
// 参数三:输入类型,按下弹起:1 按下:2 弹起:3
发送数据包6/2/1\nsendVk131
返回数据包"true"

//后台输入虚拟键值(VK)
sendData("sendVkByHwnd", 65862, 13, 1);
// 参数一:函数名称
// 参数二:窗口句柄
// 参数三:虚拟键值 回车对应 VK键值 13
// 参数四:输入类型,按下弹起:1 按下:2 弹起:3
发送数据包12/5/2/1\nsendVkByHwnd65862131
返回数据包"true"

//截图保存
sendData("saveScreenshot", 65862, "d:/1.png", 80, 150, 30, 30, 0, 127, 255, false);
// 参数一:函数名称
// 参数二:窗口句柄
// 参数三:保存的图片路径(手机)
// 参数四:矩形左上角x坐标
// 参数五:矩形左上角y坐标
// 参数六:矩形右下角x坐标
// 参数七:矩形右下角y坐标
// 参数八:二值化算法类型
// 参数九:二值化阈值
// 参数十:二值化最大值
// 参数十一:前后台截图
发送数据包14/5/8/2/3/2/2/1/3/3/5\nsaveScreenshot65862d:/1.png8015030300127255false
返回数据包"false"或者 "true"

//获取色值
sendData("getColor", 65862, 100, 200, false);
// 参数一:函数名称
// 参数二:窗口句柄
// 参数三:x坐标
// 参数四:y坐标
// 参数五:前后台获取颜色值
数据包8/5/3/3/5\ngetColor65862100200false
返回数据包:#000000

//找图
sendData("findImage", 65862, "d:/1.png", 0, 0, 0, 0, 0.95, 0, 0, 1, false);
// 参数一:函数名称
// 参数二:窗口句柄
// 参数三:保存的图片路径(手机)
// 参数四:矩形左上角x坐标
// 参数五:矩形左上角y坐标
// 参数六:矩形右下角x坐标
// 参数七:矩形右下角y坐标
// 参数八:相似度
// 参数九:二值化阈值
// 参数十:二值化最大值
// 参数十一:多个坐标点
// 参数十二:前后台找图
数据包9/5/8/1/1/1/1/4/1/1/1/5\nfindImage65862d:/1.png00000.95001false
返回数据包单坐标点成功"x|y"  多坐标点成功 "x1|y1/x2|y2..."  失败"-1.0|-1.0"

//找动态图
sendData("findAnimation", 65862, 100, 0, 0, 0, 0, false);
// 参数一:函数名称
// 参数二:窗口句柄
// 参数三:前后两张图相隔的时间,单位毫秒
// 参数四:矩形左上角x坐标
// 参数五:矩形左上角y坐标
// 参数六:矩形右下角x坐标
// 参数七:矩形右下角y坐标
// 参数八:前后台找动态图
数据包13/5/3/0/0/0/0/5\nfindAnimation658621000000false
返回数据包单坐标点成功"x|y"  多坐标点成功 "x1|y1/x2|y2..."  失败"-1.0|-1.0"

//找色
sendData("findColor", 65862, "#e8f2f8", "1020#e7f0f7", 0, 0, 0, 0, 1, false);
// 参数一:函数名称
// 参数二:窗口句柄
// 参数三:主颜色值
// 参数四:相对偏移的颜色点,以 "x坐标+y坐标+色值" 字符串形式
// 参数五:矩形左上角x坐标
// 参数六:矩形左上角y坐标
// 参数七:矩形右下角x坐标
// 参数八:矩形右下角y坐标
// 参数九:相似度
// 参数十:前后台找色
数据包9/5/7/11/1/1/1/1/1/5\nfindColor65862#e8f2f81020#e7f0f700001false
返回数据包成功"x|y" 失败"-1.0|-1.0"

//比色
sendData("compareColor", 65862, 100, 200, "#e8f2f8", "1020#e7f0f7", 0, 0, 0, 0, 1, false);
// 参数一:函数名称
// 参数二:窗口句柄
// 参数三:主颜色值所在的X坐标
// 参数四:主颜色值所在的Y坐标
// 参数五:主颜色值
// 参数六:相对偏移的颜色点,以 "x坐标+y坐标+色值" 字符串形式
// 参数七:矩形左上角x坐标
// 参数八:矩形左上角y坐标
// 参数九:矩形右下角x坐标
// 参数十:矩形右下角y坐标
// 参数十一:相似度
// 参数十二:前后台比色
数据包12/5/3/3/7/11/1/1/1/1/1/5\ncompareColor65862100200#e8f2f81020#e7f0f700001false
返回数据包"false"或者 "true"

//ocr
sendData("ocr", 65862,  0, 0, 0, 0, 1.0, false);
数据包3/5/1/1/1/1/3/5\nocr6586200001.0false
返回数据包[[[7.0, 18.0], [61.0, 18.0], [61.0, 38.0], [7.0, 38.0]], ('办公自动化', 0.8806074261665344)][[[4.0, 94.0], [49.0, 94.0], [49.0, 118.0], [4.0, 118.0]], ('rpa', 0.978314220905304)]

//ocrByFile
sendData("ocrByFile", "d:/1.png",  0, 0, 0, 0, 1.0);
数据包9/8/1/1/1/1/3\nocrByFiled:/1.png00001.0
返回数据包[[[7.0, 18.0], [61.0, 18.0], [61.0, 38.0], [7.0, 38.0]], ('办公自动化', 0.8806074261665344)][[[4.0, 94.0], [49.0, 94.0], [49.0, 118.0], [4.0, 118.0]], ('rpa', 0.978314220905304)]

//获取指定元素名称
sendData("getElementName", 65862, "Window/Text");
数据包14/5/11\ngetElementName65862Window/Text
返回数据包"aibote is pure code RPA"

//获取指定元素文本
sendData("getElementValue", 65862, "Window/Edit");
数据包15/5/11\ngetElementValue65862Window/Edit
返回数据包"aibote RPA"

//获取指定元素矩形大小
sendData("getElementRect", 65862, "Window/Button");
数据包14/5/13\ngetElementRect65862Window/Button
返回数据包"239|628|989|764"

//获取指定元素窗口句柄
sendData("getElementWindow", 65862, "Window/Button");
数据包16/5/13\ngetElementWindow65862Window/Button
返回数据包"460538"

//点击元素
sendData("clickElement", 65862, "Window/Button", 1);
数据包12/5/13/1\nclickElement65862Window/Button1
返回数据包"false"或者 "true"

//设置指定元素作为焦点
sendData("setElementFocus", 65862, "Window/Button");
数据包15/5/13\nsetElementFocus65862Window/Button
返回数据包"false"或者 "true"

//设置元素文本
sendData("setElementValue", 65862, "Window/Button", "rpa");
数据包15/5/13/3\nsetElementValue65862Window/Buttonrpa
返回数据包"false"或者 "true"

//滚动元素
sendData("setElementScroll", 65862, "Window", -1, 0.1);
数据包16/5/6/2/3\nsetElementScroll65862Window-10.1
返回数据包"false"或者 "true"

//关闭窗口
sendData("closeWindow", 65862, "Window");
数据包11/5/6\ncloseWindow65862Window
返回数据包"false"或者 "true"

//设置窗口状态
sendData("setWindowState", 65862, "Window", 2);
数据包14/5/6/1\nsetWindowState65862Window2 
返回数据包"false"或者 "true"

//设置剪切板文本
sendData("setClipboardText", "rpa");
数据包16/3\nsetClipboardTextrpa
返回数据包"false"或者 "true"

//获取剪切板文本
sendData("getClipboardText");
数据包16\ngetClipboardText
返回数据包"rpa"

//启动指定程序
sendData("startProcess", "cmd", true, false);
数据包12/3/4/5\nstartProcesscmdtruefalse
返回数据包"false"或者 "true"

//执行cmd命令
sendData("executeCommand", "ipconfig", 300);
数据包14/8/3\nexecuteCommandipconfig300
返回数据包返回cmd执行结果

//指定url下载文件
sendData("downloadFile", "http://www.gogo.com/rpa.rar", "d:/rpa.rar", true);
数据包12/27/10/4\ndownloadFilehttp://www.gogo.com/rpa.rard:/rpa.rartrue
返回数据包"true"

//打开excle
sendData("openExcel", "D:/rpa.xlsx");
数据包9/11\nopenExcelD:/rpa.xlsx
返回数据包"null"或者 {"book":"088173SDFU13","path":"D:/rpa.xlsx"}

//打开excel表格
sendData("openExcelSheet", "088173SDFU13", "D:/rpa.xlsx", "sheet1");
数据包14/12/11/6\nopenExcelSheet088173SDFU13D:/rpa.xlsxsheet1
返回数据包"null"或者 "A123HHI123F132"

//保存excel
sendData("saveExcel", "088173SDFU13", "D:/rpa.xlsx");
数据包9/12/11\nsaveExcel088173SDFU13D:/rpa.xlsx
返回数据包"false"或者 "true"

//写入数字到表格
sendData("writeExcelNum", "A123HHI123F132", 0, 0, 123);
数据包13/14/1/1/3\nwriteExcelNumA123HHI123F13200123
返回数据包"false"或者 "true"

//写入字符串到表格
sendData("writeExcelStr", "A123HHI123F132", 0, 0, "rpa");
数据包13/14/1/1/3\nwriteExcelStrA123HHI123F13200rpa
返回数据包"false"或者 "true"

//读取excel表格数字
sendData("readExcelNum", "A123HHI123F132", 0, 0);
数据包12/14/1/1\nreadExcelNumA123HHI123F13200
返回数据包123

//读取excel表格字串
sendData("readExcelStr", "A123HHI123F132", 0, 0);
数据包12/14/1/1\nreadExcelStrA123HHI123F13200
返回数据包"rpa"

删除excel表格行
sendData("removeExcelRow",  0, 0);
数据包14/1/1\nremoveExcelRow00
返回数据包"false"或者 "true"

删除excel表格列
sendData("removeExcelCol", 0, 0);
数据包14/1/1\nremoveExcelCol00
返回数据包"false"或者 "true"

WebBot 开源协议

Aibote web自动化框架由node.js客户端连接 WebDriver.exe服务端程序采用TCP协议传输命令
WebBot 基于chromium内核研发而成的一款web自动化框架因此支持chromium内核的所有浏览器和应用程序框架稳定运行速度非常快
为了让更多人体验到我们产品我们决议在此公布框架协议希望有更多开发者能完善并封装成各种计算机语言封装请参考nodejs版的函数说明

发送命令协议格式len/len/len...\ndata
//len:函数名和参数的(字符串)长度,统一为十进制 字符串类型
//data:函数名和参数数据 类型为 字符串或字节类型(string/byte) 

接收命令协议格式len/data
//len:返回数据包的(字符串)长度
//data:返回的数据,类型为字符串或字节类型(string/byte) 

协议示例
//跳转url
sendData("goto", "http://www.ai-bot.net);
数据包:4/21\ngotohttp://www.ai-bot.net
返回数据包:"false"或者 "true"

//新建tab页面并跳转到指定url
sendData("newPage", "http://www.ai-bot.net);
数据包7/21\nnewPagehttp://www.ai-bot.net
返回数据包"false"或者 "true"

//返回
sendData("back");
数据包4\nback
返回数据包"false"或者 "true"

//前进
sendData("forward");
数据包7\nforward
返回数据包"false"或者 "true"

//刷新
sendData("refresh");
数据包7\nrefresh
返回数据包"false"或者 "true"

//获取当前页面id
sendData("getCurPageId");
数据包12\ngetCurPageId
返回数据包"E2DB8A0856D83C4C3C194B79BBC2235F"

//获取所有页面id
sendData("getAllPageId");
数据包12\ngetAllPageId
返回数据包"E2DB8A0856D83C4C3C194B79BBC2235F|E2DB8A0856D83C4C3C194B79BBC22352"

//切换当前页面
sendData("switchCurPage");
数据包13\nswitchCurPage
返回数据包"false"或者 "true"

//切换指定页面
sendData("switchPage", "E2DB8A0856D83C4C3C194B79BBC2235F");
数据包10/32\nswitchPageE2DB8A0856D83C4C3C194B79BBC2235F
返回数据包"false"或者 "true"

//关闭当前页面
sendData("closePage");
数据包9\nclosePage
返回数据包"false"或者 "true"

//获取当前url
sendData("getCurrentUrl");
数据包13\ngetCurrentUrl
返回数据包"http://www.ai-bot.net"失败返回 "webdriver error"

//获取当前标题
sendData("getTitle");
数据包8\ngetTitle
返回数据包"RPA自动化平台"失败返回 "webdriver error"

//切换frame
sendData("switchFrame", "https://passport.126.com/webzj");
数据包11/30\nswitchFramehttps://passport.126.com/webzj
返回数据包"false"或者 "true"

//切换到主frame
sendData("switchMainFrame");
数据包15\nswitchMainFrame
返回数据包"false"或者 "true"

//点击元素
sendData("clickElement", "/html/body/header/div/nav/ul/li[5]/a");
数据包12/36\nclickElement/html/body/header/div/nav/ul/li[5]/a
返回数据包"false"或者 "true"

//设置编辑框值
sendData("setElementValue", "/html/body/header/div/nav/ul/li[5]/a", "rpa");
数据包15/36/3\nclickElement/html/body/header/div/nav/ul/li[5]/arpa
返回数据包"false"或者 "true"

//获取文本
sendData("getElementText", "/html/body/header/div/nav/ul/li[5]/a");
数据包14/36\ngetElementText/html/body/header/div/nav/ul/li[5]/a
返回数据包"rpa"

//设置属性值
sendData("setElementAttribute", "/html/body/header/div/nav/ul/li[5]/a", "src", "http://www.ai-bot.net");
数据包19/36/3/22\nsetElementAttribute/html/body/header/div/nav/ul/li[5]/asrchttp://www.ai-bot.net
返回数据包"false"或者 "true"

//获取指定属性的值
sendData("getElementAttribute", "/html/body/header/div/nav/ul/li[5]/a", "src");
数据包19/36/3\ngetElementAttribute/html/body/header/div/nav/ul/li[5]/asrc
返回数据包"http://www.ai-bot.net"

//获取矩形位置
sendData("getElementRect", "/html/body/header/div/nav/ul/li[5]/a");
数据包14/36\ngetElementRect/html/body/header/div/nav/ul/li[5]/a
返回数据包'{"left":74,"top":19,"right":117, "bottom":42,"width":43, "height":23}'

//判断元素是否选中
sendData("isSelected", "/html/body/header/div/nav/ul/li[5]/a");
数据包10/36\nisSelected/html/body/header/div/nav/ul/li[5]/a
返回数据包成功返回"true"失败返回"webdriver error"

//判断元素是否可见
sendData("isDisplayed", "/html/body/header/div/nav/ul/li[5]/a");
数据包11/36\nisDisplayed/html/body/header/div/nav/ul/li[5]/a
返回数据包成功返回"true"失败返回"webdriver error"

//清空元素
sendData("clearElement", "/html/body/header/div/nav/ul/li[5]/a");
数据包12/36\nclearElement/html/body/header/div/nav/ul/li[5]/a
返回数据包"false"或者 "true"

//输入文本
sendData("sendKeys", "/html/body/header/div/nav/ul/li[5]/a", "aibote");
数据包8/36/6\nsendKeys/html/body/header/div/nav/ul/li[5]/aaibote
返回数据包"false"或者 "true"

//发送回车键
sendData("sendEnter");
数据包9\nsendEnter
返回数据包"false"或者 "true"

//点击鼠标
sendData("moveMouse", "100", "200");
数据包9/3/3\nmoveMouse100200
返回数据包"false"或者 "true"

//滚动鼠标
sendData("wheelMouse", "0", "100");
数据包10/1/3\nwheelMouse0100
返回数据包"false"或者 "true"

//截图
sendData("takeScreenshot");
数据包14\ntakeScreenshot
返回数据包成功返回PNG图片格式 base64 字符串失败返回null

//元素截图
sendData("takeScreenshot", "/html/body/header/div/nav/ul/li[5]/a");
数据包14/36\ntakeScreenshot/html/body/header/div/nav/ul/li[5]/a
返回数据包成功返回PNG图片格式 base64 字符串失败返回null

//点击警告框
sendData("clickAlert", "true", "promptText");
数据包10/4/10\nclickAlerttruepromptText
返回数据包"false"或者 "true"

//获取警告框文本
sendData("getAlertText");
数据包12\ngetAlertText
返回数据包"aibote rpa"

//获取指定url匹配的cookies
sendData("getCookies", "http://www.ai-bot.net");
数据包10/21\ngetCookieshttp://www.ai-bot.net
返回数据包成功返回json格式的字符串失败返回null

//获取所有cookies
sendData("getAllCookies");
数据包13\ngetAllCookies
返回数据包成功返回json格式的字符串失败返回null

//注入JavaScript
sendData("executeScript", "(function () {return 'aibote rpa'})();");
数据包13/38\nexecuteScript(function () {return 'aibote rpa'})();
返回数据包"aibote rpa"  假如注入代码为函数且有return语句则返回retrun 的值否则返回null;
共收到 1 条回复 时间 点赞

好东西

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册