Aibote(python)使用须知

Aibote是江西爱伯特科技自主研发的一款纯代码RPA办公自动化框架,支持Android、Browser和Windows 三大平台。框架免费、API和接口协议开源,个人、企业商用零费用
以socket tcp接口协议通信方式命令驱动,支持任何一门计算机语言调用。OEM或特殊接口定制等商业合作联系QQ:1600381943

Aibote python是由 AiBot.py模块作者:河畔(810975099)制作而成,提供给python开发者调用
python版本是基于aibote底层api开源协议制作而成,封装格式以node.js为向导,涵盖aibote自动化平台所有功能。

拾取元素工具使用方法

Android 工具位置,Aibote/Aibote.exe->菜单项->脚本工具
Windows 工具位置,Aibote/WindowsTool.exe

Android 元素拾取工具,需要在手机端,勾选连接工具端选项

Windows 元素拾取工具,按下CTRL键,暂停拾取。支持鼠标左键/中键拾取

使用方法:
1、点击"+"按钮 单击手机投屏/windows 窗口,拾取元素和颜色信息。单击目标点会在右和下扩增20个像素点,用作放大目标位置。 再点击预览图片控件可拾取放大后 点的颜色值和坐标

2、点击"+"按钮 在手机投屏/windows 窗口滑动矩形大小,拾取元素和图片信息。截图前输入图片名称。Android端,图片保存在手机/storage/emulated/0/Android/data/com.aibot.client/files/
(根目录:/storage/emulated/0/)。Windows端,图片保存在指定路径目录,如果图片名称不包含路径,则默认保存在Aibote/Picture/windows

3、二值化阈值和最大值在0-255之间,阈值和最大值都为255时灰度化处理

4、BINARY算法,当前点值大于阈值thresh时,取最大值maxva,否则设置为0

5、BINARY_INV算法,当前点值大于阈值thresh时,设置为0,否则设置为最大值maxva

6、TOZERO算法,当前点值大于阈值thresh时,不改变,否则设置为0

7、TOZERO_INV算法,当前点值大于阈值thresh时,设置为0,否则不改变

8、TRUNC算法,当前点值大于阈值thresh时,设置为阈值thresh,否则不改变

9、ADAPTIVE_THRESH_MEAN_C算法,自适应阈值

10、ADAPTIVE_THRESH_GAUSSIAN_C算法,自适应阈值

Aibote.py 使用方法说明

下载安装 Aibote.py

pip install AiBot.py

使用 AndroidBot 编写脚本

# 1. 导入 AndroidBotMain 类
from AiBot import AndroidBotMain


# 2. 自定义一个脚本类,继承 AndroidBotMain
class CustomAndroidScript(AndroidBotMain):
    # 3. 设置等待参数
    # 3.1 设置等待时间
    wait_timeout = 3
    # 3.2 设置重试间隔时长
    interval_timeout = 0.5

    # 4. 设置日志等级
    log_level = "INFO"  # "DEBUG"

    # 5. 设置方法超时是否抛出异常
    raise_err = False  # True

    # 6. 重写方法,编写脚本
    # 注意:此方法是脚本执行入口
    def script_main(self):
        # 6.1 API 演示
        # 注意:Python 版本支持的 Api 与 Nodejs 基本相同
        # 教程中仅演示部分 Api,更多 Api 请自行探索,所有 Api 均包含详细的参数要求和返回值,请自行查看。

        # 截图
        self.save_screenshot("xxx.png")
        # 获取坐标点颜色
        self.get_color((100, 100))
        # 查找图片
        self.find_image("xxx.png")
        # 点击坐标
        self.click((100, 100))
        # 滑动
        self.swipe((100, 100), (200, 200), 3)


# 7. 执行脚本,Pycharm 中,直接右键执行
if __name__ == '__main__':
    # 注意:此处监听的端口号,必须和手机端的脚本端口号一致;
    # 监听 3333 号端口
    CustomAndroidScript.execute(3333)

教程中仅演示部分 Api,更多 Api 请自行探索,所有 Api 均包含详细的参数要求和返回值,请自行查看。

使用 WinBot 编写脚本

# 1. 导入 WinBotMain 类
from AiBot import WinBotMain


# 2. 自定义一个脚本类,继承 WinBotMain
class CustomWinScript(WinBotMain):
    # 3. 设置等待参数
    # 3.1 设置等待时间
    wait_timeout = 3
    # 3.2 设置重试间隔时长
    interval_timeout = 0.5

    # 4. 设置日志等级
    log_level = "INFO"  # "DEBUG"

    # 5. 设置方法超时是否抛出异常
    raise_err = False  # True

    # 6. 重写方法,编写脚本
    # 注意:此方法是脚本执行入口
    def script_main(self):
        # 6.1 API 演示
        # 注意:Python 版本支持的 Api 与 Nodejs 基本相同
        # 教程中仅演示部分 Api,更多 Api 请自行探索,所有 Api 均包含详细的参数要求和返回值,请自行查看。

        # 查询所有窗口句柄
        result = self.find_windows()
        print(result)  # ["1050010", "1050011", "1050012"]

        # 查询指定窗口句柄
        result = self.find_window(window_name="Ai-Bot 2群等9个会话")
        print(result)  # "1050010"


# 7. 执行脚本,Pycharm 中,直接右键执行
if __name__ == '__main__':
    # 启动脚本,监听 6666 号端口

    # local=True 时,是本地运行脚本,会自动启动 WindowsDriver.exe 驱动;
    # 在远端部署脚本时,请设置 local=False,手动启动 WindowsDriver.exe,启动 WindowsDriver.exe 时需指定远端 IP 或端口号;

    CustomWinScript.execute(6666, local=True)

教程中仅演示部分 Api,更多 Api 请自行探索,所有 Api 均包含详细的参数要求和返回值,请自行查看。

使用 WebBot 编写脚本

import time

# 1. 导入 WebBotMain 类
from AiBot import WebBotMain


# 2. 自定义一个脚本类,继承 WebBotMain
class CustomWebScript(WebBotMain):
    # 3. 设置等待参数
    # 3.1 设置等待时间
    wait_timeout = 3
    # 3.2 设置重试间隔时长
    interval_timeout = 0.5

    # 4. 设置日志等级
    log_level = "INFO"  # "DEBUG"

    # 5. 设置方法超时是否抛出异常
    raise_err = False  # True

    # 6. 重写方法,编写脚本
    # 注意:此方法是脚本执行入口
    def script_main(self):
        # 6. API 演示
        # 注意:Python 版本支持的 Api 与 Nodejs 基本相同
        # 教程中仅演示部分 Api,更多 Api 请自行探索,所有 Api 均包含详细的参数要求和返回值,请自行查看。

        self.goto("https://www.baidu.com")
        time.sleep(3)
        self.new_page("https://www.qq.com")
        time.sleep(3)

        result = self.execute_script('(()=>"aibote rpa")()')
        print(result)  # aibote rpa


# 7. 执行脚本,Pycharm 中,直接右键执行
if __name__ == '__main__':
    # 启动脚本,监听 9999 号端口
    # 默认使用 Chrome 浏览器

    # local=True 时,是本地运行脚本,会自动启动 WebDriver.exe 驱动;
    # 在远端部署脚本时,请设置 local=False,手动启动 WebDriver.exe,启动 WebDriver.exe 时需指定远端 IP 或端口号;

    # 如本地部署脚本,需要传递 WebDriver 启动参数时,参考下面方式,如不需传递启动参数,则忽略:
    driver_params = {
        "browserName": "chrome",
        "debugPort": 0,
        "userDataDir": "./UserData",
        "browserPath": None,
        "argument": None,
    }

    CustomWebScript.execute(9999, local=True, driver_params=driver_params)

教程中仅演示部分 Api,更多 Api 请自行探索,所有 Api 均包含详细的参数要求和返回值,请自行查看。

AndroidBot开发手册

图色

def save_screenshot(image_name: str, region: _Region = None, algorithm: _Algorithm = None) -> Optional[str]:
    """
    保存截图,返回图片地址(手机中)或者 None
    :param image_name: 图片名称,保存在手机 /storage/emulated/0/Android/data/com.aibot.client/files/ 路径下;
    :param region: 截图区域,默认全屏,``region = (起点x、起点y、终点x、终点y)``,得到一个矩形
    :param algorithm:
        处理截图所用算法和参数,默认保存原图,

        ``algorithm = (algorithm_type, threshold, max_val)``

        按元素顺序分别代表:

        0. ``algorithm_type`` 算法类型
        1. ``threshold`` 阈值
        2. ``max_val`` 最大值

        ``threshold`` 和 ``max_val`` 同为 255 时灰度处理.

        ``algorithm_type`` 算法类型说明:

        0. ``THRESH_BINARY``      算法,当前点值大于阈值 `threshold` 时,取最大值 ``max_val``,否则设置为 0;
        1. ``THRESH_BINARY_INV``  算法,当前点值大于阈值 `threshold` 时,设置为 0,否则设置为最大值 max_val;
        2. ``THRESH_TOZERO``      算法,当前点值大于阈值 `threshold` 时,不改变,否则设置为 0;
        3. ``THRESH_TOZERO_INV``  算法,当前点值大于阈值 ``threshold`` 时,设置为 0,否则不改变;
        4. ``THRESH_TRUNC``       算法,当前点值大于阈值 ``threshold`` 时,设置为阈值 ``threshold``,否则不改变;
        5. ``ADAPTIVE_THRESH_MEAN_C``      算法,自适应阈值;
        6. ``ADAPTIVE_THRESH_GAUSSIAN_C``  算法,自适应阈值;

    :return: 图片地址(手机中)或者 None
    """

def save_element_screenshot(image_name, xpath) -> Optional[str]:
    """
    保存元素截图
    :param image_name: 图片名称,保存在手机 /storage/emulated/0/Android/data/com.aibot.client/files/ 路径下
    :param xpath: xpath路径
    :return: 图片地址(手机中)或者 None
    """

def take_screenshot(region: _Region = None, algorithm: _Algorithm = None) -> Optional[bytes]:
    """
    保存截图,返回图像字节格式或者"null"的字节格式
    :param region: 截图区域,默认全屏,``region = (起点x、起点y、终点x、终点y)``,得到一个矩形
    :param algorithm:
        处理截图所用算法和参数,默认保存原图,

        ``algorithm = (algorithm_type, threshold, max_val)``

        按元素顺序分别代表:

        0. ``algorithm_type`` 算法类型
        1. ``threshold`` 阈值
        2. ``max_val`` 最大值

        ``threshold`` 和 ``max_val`` 同为 255 时灰度处理.

        ``algorithm_type`` 算法类型说明:

        0. ``THRESH_BINARY``      算法,当前点值大于阈值 `threshold` 时,取最大值 ``max_val``,否则设置为 0;
        1. ``THRESH_BINARY_INV``  算法,当前点值大于阈值 `threshold` 时,设置为 0,否则设置为最大值 max_val;
        2. ``THRESH_TOZERO``      算法,当前点值大于阈值 `threshold` 时,不改变,否则设置为 0;
        3. ``THRESH_TOZERO_INV``  算法,当前点值大于阈值 ``threshold`` 时,设置为 0,否则不改变;
        4. ``THRESH_TRUNC``       算法,当前点值大于阈值 ``threshold`` 时,设置为阈值 ``threshold``,否则不改变;
        5. ``ADAPTIVE_THRESH_MEAN_C``      算法,自适应阈值;
        6. ``ADAPTIVE_THRESH_GAUSSIAN_C``  算法,自适应阈值;

    :return: 图像字节格式或者"null"的字节格式
    """

def get_color(point: _Point_Tuple) -> Optional[str]:
    """
    获取指定坐标点的色值
    :param point: 坐标点
    :return: 色值字符串(例如: #008577)或者 None

    """

找图

def find_color(color: str, sub_colors: _SubColors = None, region: _Region = None, similarity: float = 0.9,
               wait_time: float = None, interval_time: float = None, raise_err: bool = None) -> Optional[_Point]:
    """
    获取指定色值的坐标点,返回坐标或者 None
    :param color: 颜色字符串,必须以 # 开头,例如:#008577;
    :param sub_colors: 辅助定位的其他颜色;
    :param region: 在指定区域内找色,默认全屏;
    :param similarity: 相似度,0-1 的浮点数,默认 0.9;
    :param wait_time: 等待时间,默认取 .wait_timeout;
    :param interval_time: 轮询间隔时间,默认取 .interval_timeout;
    :param raise_err: 超时是否抛出异常;
    :return:

    # 区域相关参数
    region = (0, 0, 0, 0) 按元素顺序分别代表:起点x、起点y、终点x、终点y,最终得到一个矩形。
    # 算法相关参数
    algorithm = (0, 0, 0) # 按元素顺序分别代表:algorithm_type 算法类型、threshold 阈值、max_val 最大值。
    threshold 和 max_val 同为 255 时灰度处理.
    0   THRESH_BINARY      算法,当前点值大于阈值 threshold 时,取最大值 max_val,否则设置为 0;
    1   THRESH_BINARY_INV  算法,当前点值大于阈值 threshold 时,设置为 0,否则设置为最大值 max_val;
    2   THRESH_TOZERO      算法,当前点值大于阈值 threshold 时,不改变,否则设置为 0;
    3   THRESH_TOZERO_INV  算法,当前点值大于阈值 threshold 时,设置为 0,否则不改变;
    4   THRESH_TRUNC       算法,当前点值大于阈值 threshold 时,设置为阈值 threshold,否则不改变;
    5   ADAPTIVE_THRESH_MEAN_C      算法,自适应阈值;
    6   ADAPTIVE_THRESH_GAUSSIAN_C  算法,自适应阈值;
    """

def find_image(image_name, region: _Region = None, algorithm: _Algorithm = None, similarity: float = 0.9,
               wait_time: float = None, interval_time: float = None, raise_err: bool = None) -> Optional[_Point]:
    """
    寻找图片坐标,在当前屏幕中寻找给定图片中心点的坐标,返回坐标或者 None
    :param image_name: 图片名称(手机中);
    :param region: 从指定区域中找图,默认全屏;
    :param algorithm: 处理屏幕截图所用的算法,默认原图,注意:给定图片处理时所用的算法,应该和此方法的算法一致;
    :param similarity: 相似度,0-1 的浮点数,默认 0.9;
    :param wait_time: 等待时间,默认取 .wait_timeout;
    :param interval_time: 轮询间隔时间,默认取 .interval_timeout;
    :param raise_err: 超时是否抛出异常;
    :return:

    # 区域相关参数
    region = (0, 0, 0, 0) 按元素顺序分别代表:起点x、起点y、终点x、终点y,最终得到一个矩形。
    # 算法相关参数
    algorithm = (0, 0, 0) # 按元素顺序分别代表:algorithm_type 算法类型、threshold 阈值、max_val 最大值。
    threshold 和 max_val 同为 255 时灰度处理.
    0   THRESH_BINARY      算法,当前点值大于阈值 threshold 时,取最大值 max_val,否则设置为 0;
    1   THRESH_BINARY_INV  算法,当前点值大于阈值 threshold 时,设置为 0,否则设置为最大值 max_val;
    2   THRESH_TOZERO      算法,当前点值大于阈值 threshold 时,不改变,否则设置为 0;
    3   THRESH_TOZERO_INV  算法,当前点值大于阈值 threshold 时,设置为 0,否则不改变;
    4   THRESH_TRUNC       算法,当前点值大于阈值 threshold 时,设置为阈值 threshold,否则不改变;
    5   ADAPTIVE_THRESH_MEAN_C      算法,自适应阈值;
    6   ADAPTIVE_THRESH_GAUSSIAN_C  算法,自适应阈值;
    """

def find_images(image_name,region: _Region = None,algorithm: _Algorithm = None,similarity: float = 0.9,multi: int = 1,wait_time: float = None,interval_time: float = None,raise_err: bool = None) -> List[Point]:
    """
    寻找图片坐标,在当前屏幕中寻找给定图片中心点的坐标,返回坐标列表
    :param image_name: 图片名称(手机中);
    :param region: 截图区域,默认全屏,``region = (起点x、起点y、终点x、终点y)``,得到一个矩形
    :param algorithm:
        处理屏幕截图所用的算法,默认原图,注意:给定图片处理时所用的算法,应该和此方法的算法一致;

        ``algorithm = (algorithm_type, threshold, max_val)``

        按元素顺序分别代表:

        0. ``algorithm_type`` 算法类型
        1. ``threshold`` 阈值
        2. ``max_val`` 最大值

        ``threshold`` 和 ``max_val`` 同为 255 时灰度处理.

        ``algorithm_type`` 算法类型说明:

        0. ``THRESH_BINARY``      算法,当前点值大于阈值 `threshold` 时,取最大值 ``max_val``,否则设置为 0;
        1. ``THRESH_BINARY_INV``  算法,当前点值大于阈值 `threshold` 时,设置为 0,否则设置为最大值 max_val;
        2. ``THRESH_TOZERO``      算法,当前点值大于阈值 `threshold` 时,不改变,否则设置为 0;
        3. ``THRESH_TOZERO_INV``  算法,当前点值大于阈值 ``threshold`` 时,设置为 0,否则不改变;
        4. ``THRESH_TRUNC``       算法,当前点值大于阈值 ``threshold`` 时,设置为阈值 ``threshold``,否则不改变;
        5. ``ADAPTIVE_THRESH_MEAN_C``      算法,自适应阈值;
        6. ``ADAPTIVE_THRESH_GAUSSIAN_C``  算法,自适应阈值;
    :param similarity: 相似度,0-1 的浮点数,默认 0.9;
    :param multi: 目标数量,默认为 1,找到 1 个目标后立即结束;
    :param wait_time: 等待时间,默认取 self.wait_timeout
    :param interval_time: 轮询间隔时间,默认取 self.interval_timeout
    :param raise_err: 超时是否抛出异常;
    :return:
    """

def find_dynamic_image(interval_ti: int, region: _Region = None, wait_time: float = None,
                       interval_time: float = None, raise_err: bool = None) -> List[_Point]:
    """
    找动态图,对比同一张图在不同时刻是否发生变化,返回坐标列表
    :param interval_ti: 前后时刻的间隔时间,单位毫秒;
    :param region: 截图区域,默认全屏,``region = (起点x、起点y、终点x、终点y)``,得到一个矩形
    :param wait_time: 等待时间,默认取 self.wait_timeout
    :param interval_time: 轮询间隔时间,默认取 self.interval_timeout
    :param raise_err: 超时是否抛出异常;
    :return: 坐标列表

坐标操作

def click(point: _Point_Tuple, offset_x: float = 0, offset_y: float = 0) -> bool:
    """
    点击坐标
    :param point: 坐标;
    :param offset_x: 坐标 x 轴偏移量;
    :param offset_y: 坐标 y 轴偏移量;
    :return:
    """


def double_click(point: _Point_Tuple, offset_x: float = 0, offset_y: float = 0) -> bool:
    """
    双击坐标
    :param point: 坐标;
    :param offset_x: 坐标 x 轴偏移量;
    :param offset_y: 坐标 y 轴偏移量;
    :return:
    """


def long_click(point: _Point_Tuple, duration: float, offset_x: float = 0, offset_y: float = 0) -> bool:
    """
    长按坐标
    :param point: 坐标;
    :param duration: 按住时长,单位秒;
    :param offset_x: 坐标 x 轴偏移量;
    :param offset_y: 坐标 y 轴偏移量;
    :return:
    """


def swipe(start_point: _Point_Tuple, end_point: _Point_Tuple, duration: float) -> bool:
    """
    滑动坐标
    :param start_point: 起始坐标;
    :param end_point: 结束坐标;
    :param duration: 滑动时长,单位秒;
    :return:
    """


def gesture(gesture_path: List[_Point_Tuple], duration: float) -> bool:
    """
    执行手势
    :param gesture_path: 手势路径,由一系列坐标点组成
    :param duration: 手势执行时长, 单位秒
    :return:
    """


def press(point: _Point_Tuple, duration: float) -> bool:
    """
    手指按下
    :param point: 坐标
    :param duration: 持续时间,单位秒
    :return:
    """


def move(point: _Point_Tuple, duration: float) -> bool:
    """
    手指移动
    :param point: 坐标
    :param duration: 持续时间
    :return:
    """


def release() -> bool:
    """手指抬起
    """


def press_release(point: _Point_Tuple, duration: float) -> bool:
    """
    按下屏幕坐标点并释放
    :param point: 按压坐标
    :param duration: 按压时长,单位秒
    :return:
    """


def press_release_by_ele(xpath, duration: float, wait_time: float = None,
                             interval_time: float = None, ) -> bool:
    """
    按压元素并释放
    :param xpath: 要按压的元素
    :param duration: 按压时长,单位秒
    :param wait_time: 查找元素的最长等待时间
    :param interval_time: 查找元素的轮询间隔时间
    :return:
    """

OCR

def init_ocr_server(ip: str, port: int = 9752) -> bool:
    """
    初始化 OCR 服务
    :param ip:
    :param port:
    :return:
    """


def get_text(region: _Region = None, scale: float = 1.0) -> List[str]:
    """
    通过 OCR 识别屏幕中的文字,返回文字列表
    :param region: 识别区域,默认全屏;
    :param algorithm: 处理图片/屏幕所用算法和参数,默认保存原图;
    :param scale: 图片缩放率,默认为 1.0,1.0 以下为缩小,1.0 以上为放大;
    :return: 文字列表
    """


def find_text(text: str, region: _Region = None, scale: float = 1.0) -> List[_Point]:
    """
    查找文字所在的坐标,返回坐标列表(坐标是文本区域中心位置)
    :param text: 要查找的文字;
    :param region: 识别区域,默认全屏;
    :param algorithm: 处理图片/屏幕所用算法和参数,默认保存原图;
    :param scale: 图片缩放率,默认为 1.0,1.0 以下为缩小,1.0 以上为放大;
    :return: 坐标列表(坐标是文本区域中心位置)
    """

元素操作

def get_element_rect(xpath: str, wait_time: float = None, interval_time: float = None,
                     raise_err: bool = None) -> Optional[Tuple[_Point, _Point]]:
    """
    获取元素位置,返回元素区域左上角和右下角坐标
    :param xpath: xpath 路径
    :param wait_time: 等待时间,默认取 self.wait_timeout
    :param interval_time: 轮询间隔时间,默认取 self.interval_timeout
    :param raise_err: 超时是否抛出异常;
    :return: 元素区域左上角和右下角坐标
    """


def get_element_desc(xpath: str, wait_time: float = None, interval_time: float = None,
                     raise_err: bool = None) -> Optional[str]:
    """
    获取元素描述
    :param xpath: xpath 路径
    :param wait_time: 等待时间,默认取 self.wait_timeout
    :param interval_time: 轮询间隔时间,默认取 self.interval_timeout
    :param raise_err: 超时是否抛出异常;
    :return: 元素描述字符串
    """


def get_element_text(xpath: str, wait_time: float = None, interval_time: float = None,
                     raise_err: bool = None) -> Optional[str]:
    """
    获取元素文本
    :param xpath: xpath 路径
    :param wait_time: 等待时间,默认取 self.wait_timeout
    :param interval_time: 轮询间隔时间,默认取 self.interval_timeout
    :param raise_err: 超时是否抛出异常;
    :return: 元素文本
    """


def set_element_text(xpath: str, text: str, wait_time: float = None, interval_time: float = None,
                     raise_err: bool = None) -> bool:
    """
    设置元素文本
    :param xpath:
    :param text:
    :param wait_time: 等待时间,默认取 .wait_timeout
    :param interval_time: 轮询间隔时间,默认取 .interval_timeout
    :param raise_err: 超时是否抛出异常;
    :return:
    """


def click_element(xpath: str, wait_time: float = None, interval_time: float = None,
                  raise_err: bool = None) -> bool:
    """
    点击元素
    :param xpath:
    :param wait_time: 等待时间,默认取 .wait_timeout
    :param interval_time: 轮询间隔时间,默认取 .interval_timeout
    :param raise_err: 超时是否抛出异常;
    :return:
    """


def click_any_elements(xpath_list: List[str], wait_time: float = None, interval_time: float = None,
                       raise_err: bool = None) -> bool:
    """
    遍历点击列表中的元素,直到任意一个元素返回 True
    :param xpath_list: xpath 列表
    :param wait_time: 等待时间,默认取 .wait_timeout
    :param interval_time: 轮询间隔时间,默认取 .interval_timeout
    :param raise_err: 超时是否抛出异常;
    :return:
    """


def scroll_element(xpath: str, direction: int = 0) -> bool:
    """
    滚动元素,0 向上滑动,1 向下滑动
    :param xpath: xpath 路径
    :param direction: 滚动方向,0 向上滑动,1 向下滑动
    :return:
    """


def element_not_exists(xpath: str, wait_time: float = None, interval_time: float = None) -> bool:
    """
    元素是否不存在
    :param xpath: xpath 路径
    :param wait_time: 等待时间,默认取 self.wait_timeout
    :param interval_time: 轮询间隔时间,默认取 self.interval_timeout
    :return:
    """


def element_exists(xpath: str, wait_time: float = None, interval_time: float = None) -> bool:
    """
    元素是否存在
    :param xpath: xpath 路径
    :param wait_time: 等待时间,默认取 self.wait_timeout
    :param interval_time: 轮询间隔时间,默认取 self.interval_timeout
    :return:
    """


def any_elements_exists(xpath_list: List[str], wait_time: float = None, interval_time: float = None) -> Optional[str]:
    """
    遍历列表中的元素,只要任意一个元素存在就返回 True
    :param xpath_list: xpath 列表
    :param wait_time: 等待时间,默认取 self.wait_timeout
    :param interval_time: 轮询间隔时间,默认取 self.interval_timeout
    :return: 任意一个元素存在就返回 True
    """


def element_is_selected(xpath: str) -> bool:
    """
    元素是否存在
    :param xpath: xpath 路径
    :return:
    """


def click_element_by_slide(xpath, distance: int = 1000, duration: float = 0.5, direction: int = 1,
                           count: int = 999, end_flag_xpath: str = None, wait_time: float = 600,
                           interval_time: float = 0.5, raise_err: bool = None) -> bool:
    """
    滑动列表,查找并点击指定元素
    :param xpath:
    :param distance: 滑动距离,默认 1000
    :param duration: 滑动时间,默认 0.5 秒
    :param direction: 滑动方向,默认为 1; 1=上滑,2=下滑
    :param count: 滑动次数
    :param end_flag_xpath: 结束标志 xpath
    :param wait_time: 等待时间,默认 10 分钟
    :param interval_time: 轮询间隔时间,默认 0.5 秒
    :param raise_err: 超时是否抛出异常;
    :return:
    """

文件传输

def push_file(origin_path: str, to_path: str) -> bool:
    """
    将电脑文件传输到手机端
    :param origin_path: 源文件路径
    :param to_path: 目标存储路径
    :return:

    ex:
    origin_path: /
    to_path: /storage/emulated/0/Android/data/com.aibot.client/files/code479259.png
    """


def pull_file(remote_path: str, local_path: str) -> bool:
    """
    将手机文件传输到电脑端
    :param remote_path: 手机端文件路径
    :param local_path: 电脑本地文件存储路径
    :return:

    ex:
    remote_path: /storage/emulated/0/Android/data/com.aibot.client/files/code479259.png
    local_path: /
    """

设备操作

def start_app(name: str, wait_time: float = None, interval_time: float = None) -> bool:
    """
    启动 APP
    :param name: APP名字或者包名
    :param wait_time: 等待时间,默认取 .wait_timeout
    :param interval_time: 轮询间隔时间,默认取 .interval_timeout
    :return:
    """


def get_device_ip() -> str:
    """
    获取设备IP地址
    :return:
    """


def get_android_id() -> str:
    """
    获取 Android 设备 ID
    :return:
    """


def get_window_size() -> Dict[str, float]:
    """
    获取屏幕大小
    :return:
    """


def get_image_size(image_path) -> Dict[str, float]:
    """
    获取图片大小
    :param image_path: 图片路径;
    :return:
    """


def show_toast(text: str) -> bool:
    """
    Toast 弹窗
    :param text: 弹窗内容;
    :return:
    """


def sleep(wait_time: float, interval_time: float = 1.5):
    """
    强制等待
    :param wait_time: 等待时长
    :param interval_time: 等待时轮询间隔时间
    :return:
    """


def send_keys(text: str) -> bool:
    """
    发送文本,需要打开 AiBot 输入法
    :param text: 文本内容
    :return:
    """


def send_vk(vk: int) -> bool:
    """
    发送文本,需要打开 AiBot 输入法
    :param vk: 虚拟键值
    :return:

    虚拟键值按键对照表 https://blog.csdn.net/yaoyaozaiye/article/details/122826340
    """


def write_android_file(remote_path: str, text: str, append: bool) -> bool:
    """
    写入安卓文件
    :param remote_path: 安卓文件路径
    :param text: 要写入的文本内容
    :param append: 是否追加模式
    :return:
    """


def read_android_file(remote_path: str) -> Optional[str]:
    """
    读取安卓文件
    :param remote_path: 安卓文件路径
    :return:
    """


def delete_android_file(remote_path: str) -> bool:
    """
    删除安卓文件
    :param remote_path: 安卓文件路径
    :return:
    """


def exists_android_file(remote_path: str) -> bool:
    """
    安卓文件是否存在
    :param remote_path: 安卓文件路径
    :return:
    """


def back() -> bool:
    """
    返回
    :return:
    """


def home() -> bool:
    """
    返回桌面
    :return:
    """


def recent_tasks() -> bool:
    """
    显示最近任务
    :return:
    """


def open_uri(uri: str) -> bool:
    """
    唤起 app
    :param uri: app 唤醒协议
    :return:

    open_uri("alipayqr://platformapi/startapp?saId=10000007")
    """


def start_activity(action: str,uri: str = '',package_name: str = '',class_name: str = '',typ: str = '') -> bool:
    """
    Intent 跳转
    :param action: 动作,例如 "android.intent.action.VIEW"
    :param uri: 跳转链接,例如:打开支付宝扫一扫界面,"alipayqr://platformapi/startapp?saId=10000007"
    :param package_name: 包名,"com.xxx.xxxxx"
    :param class_name: 类名
    :param typ: 类型
    :return: True或者 False
    """


def call_phone(mobile: str) -> bool:
    """
    拨打电话
    :param mobile: 手机号码
    :return:
    """


def send_msg(mobile, text) -> bool:
    """
    发送短信
    :param mobile: 手机号码
    :param text: 短信内容
    :return:
    """


def get_activity() -> str:
    """
    获取活动页
    :return:
    """


def get_package() -> str:
    """
    获取包名
    :return:
    """


def set_clipboard_text(text: str) -> bool:
    """
    设置剪切板文本
    :param text:
    :return:
    """


def get_clipboard_text() -> str:
    """
    获取剪切板内容
    :return:
    """

控件与参数

def create_text_view(_id: int, text: str, x: int, y: int, width: int = 400, height: int = 60):
    """
    创建文本框控件
    :param _id:  控件ID,不可与其他控件重复
    :param text:  控件文本
    :param x:  控件在屏幕上x坐标
    :param y:  控件在屏幕上y坐标
    :param width:  控件宽度,默认 400
    :param height:  控件高度,默认 60
    :return:
    """


def create_edit_view(_id: int, text: str, x: int, y: int, width: int = 400, height: int = 150):
    """
    创建编辑框控件
    :param _id:  控件ID,不可与其他控件重复
    :param text:  控件文本
    :param x:  控件在屏幕上x坐标
    :param y:  控件在屏幕上y坐标
    :param width:  控件宽度,默认 400
    :param height:  控件高度,默认 150
    :return:
    """


def create_check_box(_id: int, text: str, x: int, y: int, width: int = 400, height: int = 60):
    """
    创建复选框控件
    :param _id:  控件ID,不可与其他控件重复
    :param text:  控件文本
    :param x:  控件在屏幕上x坐标
    :param y:  控件在屏幕上y坐标
    :param width:  控件宽度,默认 400
    :param height:  控件高度,默认 60
    :return:
    """


def create_web_view(_id: int, url: str, x: int = -1, y: int = -1, width: int = -1, height: int = -1) -> bool:
    """
    创建WebView控件
    :param _id: 控件ID,不可与其他控件重复
    :param url: 加载的链接
    :param x: 控件在屏幕上 x 坐标,值为 -1 时自动填充宽高
    :param y: 控件在屏幕上 y 坐标,值为 -1 时自动填充宽高
    :param width: 控件宽度,值为 -1 时自动填充宽高
    :param height: 控件高度,值为 -1 时自动填充宽高
    :return:
    """


def clear_script_widget() -> bool:
    """
    清除脚本控件
    :return:
    """


def get_script_params() -> Optional[dict]:
    """
    获取脚本参数
    :return:
    """

验证码

def get_captcha(file_path: str, username: str, password: str, soft_id: str, code_type: str, len_min: str = '0') -> Optional[dict]:
    """
    识别验证码
    :param file_path: 图片文件路径
    :param username: 用户名
    :param password: 密码
    :param soft_id: 软件ID
    :param code_type: 图片类型 参考https://www.chaojiying.com/price.html
    :param len_min: 最小位数 默认0为不启用,图片类型为可变位长时可启用这个参数
    :return: JSON
        err_no,(数值) 返回代码  为0 表示正常,错误代码 参考https://www.chaojiying.com/api-23.html
        err_str,(字符串) 中文描述的返回信息 
        pic_id,(字符串) 图片标识号,或图片id号
        pic_str,(字符串) 识别出的结果
        md5,(字符串) md5校验值,用来校验此条数据返回是否真实有效
    """


def error_captcha(username: str, password: str, soft_id: str,pic_id: str)  -> Optional[dict]:
    """
    识别报错返分
    :param username: 用户名
    :param password: 密码
    :param soft_id: 软件ID
    :param pic_id: 图片ID 对应 getCaptcha返回值的pic_id 字段
    :return: JSON
        err_no,(数值) 返回代码
        err_str,(字符串) 中文描述的返回信息
    """


def score_captcha(username: str, password: str)  -> Optional[dict]:
    """
    查询验证码剩余题分
    :param username: 用户名
    :param password: 密码
    :return: JSON
        err_no,(数值) 返回代码
        err_str,(字符串) 中文描述的返回信息
        tifen,(数值) 题分
        tifen_lock,(数值) 锁定题分
    """


WinBot开发手册

窗口操作

def find_window(class_name: str = None, window_name: str = None) -> Optional[str]:
    """
    查找窗口句柄,仅查找顶级窗口,不包含子窗口
    :param class_name: 窗口类名
    :param window_name: 窗口名
    :return:
    """


def find_windows(class_name: str = None, window_name: str = None) -> List[str]:
    """
    查找窗口句柄数组,仅查找顶级窗口,不包含子窗口
    class_name 和 window_name 都为 None,则返回所有窗口句柄
    :param class_name: 窗口类名
    :param window_name: 窗口名
    :return: 窗口句柄的列表
    """


def find_sub_window(hwnd: str, class_name: str = None, window_name: str = None) -> Optional[str]:
    """
    查找子窗口句柄
    :param hwnd: 当前窗口句柄
    :param class_name: 窗口类名
    :param window_name: 窗口名
    :return: 子窗口句柄或 None
    """


def find_parent_window(hwnd: str) -> Optional[str]:
    """
    查找父窗口句柄
    :param hwnd: 当前窗口句柄
    :return: 父窗口句柄或 None
    """


def find_desktop_window() -> Optional[str]:
    """
    查找桌面窗口句柄
    :return: 桌面窗口句柄或 None
    """


def get_window_name(hwnd: str) -> Optional[str]:
    """
    获取窗口名称
    :param hwnd: 当前窗口句柄
    :return: 窗口名称或 None
    """


def show_window(hwnd: str, show: bool) -> bool:
    """
    显示/隐藏窗口
    :param hwnd: 当前窗口句柄
    :param show: 是否显示窗口
    :return:
    """


def set_window_top(hwnd: str, top: bool) -> bool:
    """
    设置窗口到最顶层
    :param hwnd: 当前窗口句柄
    :param top: 是否置顶,True 置顶, False 取消置顶
    :return:
    """


def get_window_pos(hwnd: str, wait_time: float = None, interval_time: float = None) -> Optional[Tuple[Point, Point]]:
    """
    获取窗口位置
    :param hwnd: 窗口句柄
    :return:
    """


def set_window_pos(hwnd: str, left: float, top: float, width: float, height: float) -> bool:
    """
    设置窗口位置
    :param hwnd: 当前窗口句柄
    :param left: 左上角横坐标
    :param top: 左上角纵坐标
    :param width: 窗口宽度
    :param height: 窗口高度
    :return:
    """

键鼠操作

def move_mouse(hwnd: str, x: float, y: float, mode: bool = False, ele_hwnd: str = "0") -> bool:
    """
    移动鼠标
    :param hwnd: 当前窗口句柄
    :param x: 横坐标
    :param y: 纵坐标
    :param mode: 操作模式,后台 true,前台 false, 默认前台操作
    :param ele_hwnd: 元素句柄,如果 mode=True 且目标控件有单独的句柄,则需要通过 get_element_window 获得元素句柄,指定 ele_hwnd 的值(极少应用窗口由父窗口响应消息,则无需指定);
    :return:
    """


def move_mouse_relative(hwnd: str, x: float, y: float, mode: bool = False) -> bool:
    """
    移动鼠标(相对坐标)
    :param hwnd: 当前窗口句柄
    :param x: 相对横坐标
    :param y: 相对纵坐标
    :param mode: 操作模式,后台 true,前台 false, 默认前台操作
    :return:
    """


def scroll_mouse(hwnd: str, x: float, y: float, count: int, mode: bool = False) -> bool:
    """
    滚动鼠标
    :param hwnd: 当前窗口句柄
    :param x: 横坐标
    :param y: 纵坐标
    :param count: 鼠标滚动次数, 负数下滚鼠标, 正数上滚鼠标
    :param mode: 操作模式,后台 true,前台 false, 默认前台操作
    :return:
    """


def click_mouse(hwnd: str, x: float, y: float, typ: int, mode: bool = False, ele_hwnd: str = "0") -> bool:
    """
    鼠标点击
    :param hwnd: 当前窗口句柄
    :param x: 横坐标
    :param y: 纵坐标
    :param typ: 点击类型,单击左键:1 单击右键:2 按下左键:3 弹起左键:4 按下右键:5 弹起右键:6 双击左键:7 双击右键:8
    :param mode: 操作模式,后台 true,前台 false, 默认前台操作
    :param ele_hwnd: 元素句柄,如果 mode=True 且目标控件有单独的句柄,则需要通过 get_element_window 获得元素句柄,指定 ele_hwnd 的值(极少应用窗口由父窗口响应消息,则无需指定);
    :return:
    """


def send_keys(text: str) -> bool:
    """
    输入文本
    :param text: 输入的文本
    :return:
    """


def send_keys_by_hwnd(hwnd: str, text: str) -> bool:
    """
    后台输入文本(杀毒软件可能会拦截)
    :param hwnd: 窗口句柄
    :param text: 输入的文本
    :return:
    """


def send_vk(vk: int, typ: int) -> bool:
    """
    输入虚拟键值(VK)
    :param vk: VK键值
    :param typ: 输入类型,按下弹起:1 按下:2 弹起:3
    :return:
    """


def send_vk_by_hwnd(hwnd: str, vk: int, typ: int) -> bool:
    """
    后台输入虚拟键值(VK)
    :param hwnd: 窗口句柄
    :param vk: VK键值
    :param typ: 输入类型,按下弹起:1 按下:2 弹起:3
    :return:
    """

图色操作

def save_screenshot(hwnd: str, save_path: str, region: _Region = None, algorithm: _Algorithm = None, mode: bool = False) -> bool:
    """
    截图
    :param hwnd: 窗口句柄;
    :param save_path: 图片存储路径;
    :param region: 截图区域,默认全屏;
    :param algorithm: 处理截图所用算法和参数,默认保存原图;
    :param mode: 操作模式,后台 true,前台 false, 默认前台操作;
    :return:

    # 区域相关参数
    region = (0, 0, 0, 0) 按元素顺序分别代表:起点x、起点y、终点x、终点y,最终得到一个矩形。
    # 算法相关参数
    algorithm = (0, 0, 0) # 按元素顺序分别代表:algorithm_type 算法类型、threshold 阈值、max_val 最大值。
    threshold 和 max_val 同为 255 时灰度处理.
    0   THRESH_BINARY      算法,当前点值大于阈值 threshold 时,取最大值 max_val,否则设置为 0;
    1   THRESH_BINARY_INV  算法,当前点值大于阈值 threshold 时,设置为 0,否则设置为最大值 max_val;
    2   THRESH_TOZERO      算法,当前点值大于阈值 threshold 时,不改变,否则设置为 0;
    3   THRESH_TOZERO_INV  算法,当前点值大于阈值 threshold 时,设置为 0,否则不改变;
    4   THRESH_TRUNC       算法,当前点值大于阈值 threshold 时,设置为阈值 threshold,否则不改变;
    5   ADAPTIVE_THRESH_MEAN_C      算法,自适应阈值;
    6   ADAPTIVE_THRESH_GAUSSIAN_C  算法,自适应阈值;
    """


def get_color(hwnd: str, x: float, y: float, mode: bool = False) -> Optional[str]:
    """
    获取指定坐标点的色值,返回色值字符串(#008577)或者 None
    :param hwnd: 窗口句柄;
    :param x: x 坐标;
    :param y: y 坐标;
    :param mode: 操作模式,后台 true,前台 false, 默认前台操作;
    :return:
    """


def find_color(hwnd: str, color: str, sub_colors: _SubColors = None, region: _Region = None,
               similarity: float = 0.9, mode: bool = False, wait_time: float = None,
               interval_time: float = None):
    """
    获取指定色值的坐标点,返回坐标或者 None
    :param hwnd: 窗口句柄;
    :param color: 颜色字符串,必须以 # 开头,例如:#008577;
    :param sub_colors: 辅助定位的其他颜色;
    :param region: 在指定区域内找色,默认全屏;
    :param similarity: 相似度,0-1 的浮点数,默认 0.9;
    :param mode: 操作模式,后台 true,前台 false, 默认前台操作;
    :param wait_time: 等待时间,默认取 .wait_timeout;
    :param interval_time: 轮询间隔时间,默认取 .interval_timeout;
    :return:

    # 区域相关参数
    region = (0, 0, 0, 0) 按元素顺序分别代表:起点x、起点y、终点x、终点y,最终得到一个矩形。
    # 算法相关参数
    algorithm = (0, 0, 0) # 按元素顺序分别代表:algorithm_type 算法类型、threshold 阈值、max_val 最大值。
    threshold 和 max_val 同为 255 时灰度处理.
    0   THRESH_BINARY      算法,当前点值大于阈值 threshold 时,取最大值 max_val,否则设置为 0;
    1   THRESH_BINARY_INV  算法,当前点值大于阈值 threshold 时,设置为 0,否则设置为最大值 max_val;
    2   THRESH_TOZERO      算法,当前点值大于阈值 threshold 时,不改变,否则设置为 0;
    3   THRESH_TOZERO_INV  算法,当前点值大于阈值 threshold 时,设置为 0,否则不改变;
    4   THRESH_TRUNC       算法,当前点值大于阈值 threshold 时,设置为阈值 threshold,否则不改变;
    5   ADAPTIVE_THRESH_MEAN_C      算法,自适应阈值;
    6   ADAPTIVE_THRESH_GAUSSIAN_C  算法,自适应阈值;
    """


def compare_color(hwnd: str,main_x: float,main_y: float,color: str,sub_colors: _SubColors = None,region: _Region = None,similarity: float = 0.9,mode: bool = False,wait_time: float = None,interval_time: float = None,raise_err: bool = None) -> Optional[Point]:
    """
    比较指定坐标点的颜色值
    :param hwnd: 窗口句柄;
    :param main_x: 主颜色所在的X坐标;
    :param main_y: 主颜色所在的Y坐标;
    :param color: 颜色字符串,必须以 # 开头,例如:#008577;
    :param sub_colors: 辅助定位的其他颜色;
    :param region: 截图区域,默认全屏,``region = (起点x、起点y、终点x、终点y)``,得到一个矩形
    :param similarity: 相似度,0-1 的浮点数,默认 0.9;
    :param mode: 操作模式,后台 true,前台 false, 默认前台操作;
    :param wait_time: 等待时间,默认取 self.wait_timeout;
    :param interval_time: 轮询间隔时间,默认取 self.interval_timeout;
    :param raise_err: 超时是否抛出异常;
    :return: True或者 False
    """


def extract_image_by_video(video_path: str, save_folder: str, jump_frame: int = 1) -> bool:
    """
    提取视频帧
    :param video_path: 视频路径
    :param save_folder: 提取的图片保存的文件夹目录
    :param jump_frame: 跳帧,默认为1 不跳帧
    :return: True或者False
    """


def crop_image(image_path, save_path, left, top, rigth, bottom) -> bool:
    """
    裁剪图片
    :param image_path: 图片路径
    :param save_path: 裁剪后保存的图片路径
    :param left: 裁剪的左上角横坐标
    :param top: 裁剪的左上角纵坐标
    :param rigth: 裁剪的右下角横坐标
    :param bottom: 裁剪的右下角纵坐标
    :return: True或者False
    """


def find_images(hwnd: str, image_path: str, region: _Region = None, algorithm: _Algorithm = None,
                similarity: float = 0.9, mode: bool = False, multi: int = 1, wait_time: float = None,
                interval_time: float = None) -> List[_Point]:
    """
    寻找图片坐标,在当前屏幕中寻找给定图片中心点的坐标,返回坐标列表
    :param hwnd: 窗口句柄;
    :param image_path: 图片的绝对路径;
    :param region: 从指定区域中找图,默认全屏;
    :param algorithm: 处理屏幕截图所用的算法,默认原图,注意:给定图片处理时所用的算法,应该和此方法的算法一致;
    :param similarity: 相似度,0-1 的浮点数,默认 0.9;
    :param mode: 操作模式,后台 true,前台 false, 默认前台操作;
    :param multi: 返回图片数量,默认1张;
    :param wait_time: 等待时间,默认取 .wait_timeout;
    :param interval_time: 轮询间隔时间,默认取 .interval_timeout;
    :return:

    # 区域相关参数
    region = (0, 0, 0, 0) 按元素顺序分别代表:起点x、起点y、终点x、终点y,最终得到一个矩形。
    # 算法相关参数
    algorithm = (0, 0, 0) # 按元素顺序分别代表:algorithm_type 算法类型、threshold 阈值、max_val 最大值。
    threshold 和 max_val 同为 255 时灰度处理.
    0   THRESH_BINARY      算法,当前点值大于阈值 threshold 时,取最大值 max_val,否则设置为 0;
    1   THRESH_BINARY_INV  算法,当前点值大于阈值 threshold 时,设置为 0,否则设置为最大值 max_val;
    2   THRESH_TOZERO      算法,当前点值大于阈值 threshold 时,不改变,否则设置为 0;
    3   THRESH_TOZERO_INV  算法,当前点值大于阈值 threshold 时,设置为 0,否则不改变;
    4   THRESH_TRUNC       算法,当前点值大于阈值 threshold 时,设置为阈值 threshold,否则不改变;
    5   ADAPTIVE_THRESH_MEAN_C      算法,自适应阈值;
    6   ADAPTIVE_THRESH_GAUSSIAN_C  算法,自适应阈值;
    """


def find_dynamic_image(hwnd: str, interval_ti: int, region: _Region = None, mode: bool = False,
                       wait_time: float = None, interval_time: float = None) -> List[_Point]:
    """
    找动态图,对比同一张图在不同时刻是否发生变化,返回坐标列表
    :param hwnd: 窗口句柄;
    :param interval_ti: 前后时刻的间隔时间,单位毫秒;
    :param region: 在指定区域找图,默认全屏;
    :param mode: 操作模式,后台 true,前台 false, 默认前台操作;
    :param wait_time: 等待时间,默认取 .wait_timeout;
    :param interval_time: 轮询间隔时间,默认取 .interval_timeout;
    :return:
    """

OCR

def init_ocr_server(ip: str, port: int = 9752) -> bool:
    """
    初始化 OCR 服务
    :param ip:
    :param port:
    :return:
    """


def get_text(hwnd_or_image_path: str, region: _Region = None, algorithm: _Algorithm = None,mode: bool = False) -> List[str]:
    """
    通过 OCR 识别窗口/图片中的文字,返回文字列表
    :param hwnd_or_image_path: 窗口句柄或者图片路径;
    :param region: 识别区域,默认全屏;
    :param algorithm: 处理图片/屏幕所用算法和参数,默认保存原图;
    :param mode: 操作模式,后台 true,前台 false, 默认前台操作;
    :return:
    """


def find_text(hwnd_or_image_path: str, text: str, region: _Region = None, algorithm: _Algorithm = None,mode: bool = False) -> List[Point]:
    """
    通过 OCR 识别窗口/图片中的文字,返回文字列表
    :param hwnd_or_image_path: 句柄或者图片路径
    :param text: 要查找的文字
    :param region: 识别区域,默认全屏
    :param algorithm: 处理图片/屏幕所用算法和参数,默认保存原图
    :param mode: 操作模式,后台 true,前台 false, 默认前台操作
    :return: 文字列表
    """

元素操作

def get_element_name(hwnd: str, xpath: str, wait_time: float = None, interval_time: float = None) -> Optional[str]:
    """
    获取元素名称
    :param hwnd: 窗口句柄
    :param xpath: 元素路径
    :param wait_time: 等待时间,默认取 .wait_timeout;
    :param interval_time: 轮询间隔时间,默认取 .interval_timeout;
    :return: 元素名称字符串或 None
    """


def get_element_value(hwnd: str, xpath: str, wait_time: float = None, interval_time: float = None) -> Optional[str]:
    """
    获取元素文本
    :param hwnd: 窗口句柄
    :param xpath: 元素路径
    :param wait_time: 等待时间,默认取 .wait_timeout;
    :param interval_time: 轮询间隔时间,默认取 .interval_timeout;
    :return: 元素文本字符串或 None
    """


def get_element_rect(hwnd: str, xpath: str, wait_time: float = None, interval_time: float = None) -> Optional[Tuple[_Point, _Point]]:
    """
    获取元素矩形,返回左上和右下坐标
    :param hwnd: 窗口句柄
    :param xpath: 元素路径
    :param wait_time: 等待时间,默认取 .wait_timeout;
    :param interval_time: 轮询间隔时间,默认取 .interval_timeout;
    :return: 左上和右下坐标
    """


def get_element_window(hwnd: str, xpath: str, wait_time: float = None, interval_time: float = None) -> Optional[str]:
    """
    获取元素窗口句柄
    :param hwnd: 窗口句柄
    :param xpath: 元素路径
    :param wait_time: 等待时间,默认取 .wait_timeout;
    :param interval_time: 轮询间隔时间,默认取 .interval_timeout;
    :return: 元素窗口句柄字符串或 None
    """


def click_element(hwnd: str, xpath: str, typ: int, wait_time: float = None,
                  interval_time: float = None) -> bool:
    """
    获取元素窗口句柄
    :param hwnd: 窗口句柄
    :param xpath: 元素路径
    :param typ: 操作类型,单击左键:1 单击右键:2 按下左键:3 弹起左键:4 按下右键:5 弹起右键:6 双击左键:7 双击右键:8
    :param wait_time: 等待时间,默认取 .wait_timeout;
    :param interval_time: 轮询间隔时间,默认取 .interval_timeout;
    :return:
    """


def invoke_element(hwnd: str, xpath: str, wait_time: float = None,
                      interval_time: float = None) -> bool:
    """
    执行元素默认操作(一般是点击操作)
    :param hwnd: 窗口句柄
    :param xpath: 元素路径
    :param wait_time: 等待时间,默认取 self.wait_timeout;
    :param interval_time: 轮询间隔时间,默认取 self.interval_timeout;
    :return:
    """


def set_element_focus(hwnd: str, xpath: str, wait_time: float = None,
                      interval_time: float = None) -> bool:
    """
    设置元素作为焦点
    :param hwnd: 窗口句柄
    :param xpath: 元素路径
    :param wait_time: 等待时间,默认取 .wait_timeout;
    :param interval_time: 轮询间隔时间,默认取 .interval_timeout;
    :return:
    """


def set_element_value(hwnd: str, xpath: str, value: str,
                      wait_time: float = None, interval_time: float = None) -> bool:
    """
    设置元素文本
    :param hwnd: 窗口句柄
    :param xpath: 元素路径
    :param value: 要设置的内容
    :param wait_time: 等待时间,默认取 .wait_timeout;
    :param interval_time: 轮询间隔时间,默认取 .interval_timeout;
    :return:
    """


def scroll_element(hwnd: str, xpath: str, horizontal: int, vertical: int,
                   wait_time: float = None, interval_time: float = None) -> bool:
    """
    滚动元素
    :param hwnd: 窗口句柄
    :param xpath: 元素路径
    :param horizontal: 水平百分比 -1不滚动
    :param vertical: 垂直百分比 -1不滚动
    :param wait_time: 等待时间,默认取 .wait_timeout;
    :param interval_time: 轮询间隔时间,默认取 .interval_timeout;
    :return:
    """


def is_selected(hwnd: str, xpath: str,
                       wait_time: float = None, interval_time: float = None) -> bool:
    """
    单/复选框是否选中
    :param hwnd: 窗口句柄
    :param xpath: 元素路径
    :param wait_time: 等待时间,默认取 self.wait_timeout;
    :param interval_time: 轮询间隔时间,默认取 self.interval_timeout;
    :return:
    """


def close_window(hwnd: str, xpath: str) -> bool:
    """
    关闭窗口
    :param hwnd: 窗口句柄
    :param xpath: 元素路径
    :return:
    """


def set_element_state(hwnd: str, xpath: str, state: str) -> bool:
    """
    设置窗口状态
    :param hwnd: 窗口句柄
    :param xpath: 元素路径
    :param state: 0正常 1最大化 2 最小化
    :return:
    """

系统剪切板

def set_clipboard_text(text: str) -> bool:
    """
    设置剪切板内容
    :param text: 要设置的内容
    :return:
    """


def get_clipboard_text() -> str:
    """
    设置剪切板内容
    :return:
    """

启动进程

def start_process(cmd: str, show_window=True, is_wait=False) -> bool:
    """
    执行cmd命令
    :param cmd: 命令
    :param show_window: 是否显示窗口,默认显示
    :param is_wait: 是否等待程序结束, 默认不等待
    :return:
    """


def execute_command(command: str, waitTimeout: int = 300) -> str:
    """
    执行cmd命令
    :param command: cmd命令,不能含 "cmd"字串
    :param waitTimeout: 可选参数,等待结果返回超时,单位毫秒,默认300毫秒
    :return: cmd执行结果
    """


def download_file(url: str, file_path: str, is_wait: bool) -> bool:
    """

    :param url: 文件地址
    :param file_path: 文件保存的路径
    :param is_wait: 是否等待下载完成
    :return:
    """

EXCEL操作

def open_excel(excel_path: str) -> Optional[dict]:
    """
    打开excel文档
    :param excel_path: excle路径
    :return: excel对象或者None
    """


def open_excel_sheet(excel_object: dict, sheet_name: str) -> Optional[dict]:
    """
    打开excel表格
    :param excel_object: excel对象
    :param sheet_name: 表名
    :return: sheet对象或者None
    """


def save_excel(excel_object: dict)  -> bool:
    """
    保存excel文档
    :param excel_object: excel对象
    :return: True或者False
    """


def write_excel_num(excel_object: dict, row: int, col: int, value: int)  -> bool:
    """
    写入数字到excel表格
    :param excel_object: excel对象
    :param row: 行
    :param col: 列
    :param value: 写入的值
    :return: True或者False
    """


def write_excel_str(excel_object: dict, row: int, col: int, str_value: str)  -> bool:
    """
    写入字符串到excel表格
    :param excel_object: excel对象
    :param row: 行
    :param col: 列
    :param str_value: 写入的值
    :return: True或者False
    """


def read_excel_num(excel_object: dict, row: int, col: int)  -> int:
    """
    读取excel表格数字
    :param excel_object: excel对象
    :param row: 行
    :param col: 列
    :return: 读取到的数字
    """


def read_excel_str(excel_object: dict, row: int, col: int)  -> str:
    """
    读取excel表格字符串
    :param excel_object: excel对象
    :param row: 行
    :param col: 列
    :return: 读取到的字符
    """


def remove_excel_row(excel_object: dict, row_first: int, row_last: int)  -> bool:
    """
    删除excel表格行
    :param excel_object: excel对象
    :param row_first: 起始行
    :param row_last: 结束行
    :return: True或者False
    """


def remove_excel_col(excel_object: dict, col_first: int, col_last: int)  -> bool:
    """
    删除excel表格列
    :param excel_object: excel对象
    :param col_first: 起始列
    :param col_last: 结束列
    :return: True或者False
    """

验证码

def get_captcha(file_path: str, username: str, password: str, soft_id: str, code_type: str, len_min: str = '0') -> Optional[dict]:
    """
    识别验证码
    :param file_path: 图片文件路径
    :param username: 用户名
    :param password: 密码
    :param soft_id: 软件ID
    :param code_type: 图片类型 参考https://www.chaojiying.com/price.html
    :param len_min: 最小位数 默认0为不启用,图片类型为可变位长时可启用这个参数
    :return: JSON
        err_no,(数值) 返回代码  为0 表示正常,错误代码 参考https://www.chaojiying.com/api-23.html
        err_str,(字符串) 中文描述的返回信息 
        pic_id,(字符串) 图片标识号,或图片id号
        pic_str,(字符串) 识别出的结果
        md5,(字符串) md5校验值,用来校验此条数据返回是否真实有效
    """


def error_captcha(username: str, password: str, soft_id: str,pic_id: str)  -> Optional[dict]:
    """
    识别报错返分
    :param username: 用户名
    :param password: 密码
    :param soft_id: 软件ID
    :param pic_id: 图片ID 对应 getCaptcha返回值的pic_id 字段
    :return: JSON
        err_no,(数值) 返回代码
        err_str,(字符串) 中文描述的返回信息
    """


def score_captcha(username: str, password: str)  -> Optional[dict]:
    """
    查询验证码剩余题分
    :param username: 用户名
    :param password: 密码
    :return: JSON
        err_no,(数值) 返回代码
        err_str,(字符串) 中文描述的返回信息
        tifen,(数值) 题分
        tifen_lock,(数值) 锁定题分
    """

语音服务

 def activate_speech_service(activate_key: str)  -> bool:
    """
    激活 initSpeechService (不支持win7)
    :param activate_key: 激活密钥,联系管理员
    :return: True或者False
    """


def init_speech_service(speech_key: str, speech_region: str)  -> bool:
    """
    初始化语音服务(不支持win7),需要调用 activateSpeechService 激活
    :param speech_key: 密钥
    :param speech_region: 区域
    :return: True或者False
    """


def audio_file_to_text(file_path, language: str) -> Optional[str]:
    """
    音频文件转文本
    :param file_path: 音频文件路径
    :param language: 语言,参考开发文档 语言和发音人
    :return: 转换后的音频文本或者None
    """


def microphone_to_text(language: str) -> Optional[str]:
    """
    麦克风输入流转换文本
    :param language: 语言,参考开发文档 语言和发音人
    :return: 转换后的音频文本或者None
    """


def text_to_bullhorn(ssmlPath_or_text: str, language: str, voice_name: str)  -> bool:
    """
    文本合成音频到扬声器
    :param ssmlPath_or_text: 要转换语音的文本或者".xml"格式文件路径
    :param language: 语言,参考开发文档 语言和发音人
    :param voice_name: 发音人,参考开发文档 语言和发音人
    :return: True或者False
    """


def text_to_audio_file(ssmlPath_or_text: str, language: str, voice_name: str, audio_path: str)  -> bool:
    """
    文本合成音频并保存到文件
    :param ssmlPath_or_text: 要转换语音的文本或者".xml"格式文件路径
    :param language: 语言,参考开发文档 语言和发音人
    :param voice_name: 发音人,参考开发文档 语言和发音人
    :param audio_path: 保存音频文件路径
    :return: True或者False
    """


def microphone_translation_text(source_language: str, target_language: str) -> Optional[str]:
    """
    麦克风输入流转换文本
    :param source_language: 要翻译的语言,参考开发文档 语言和发音人
    :param target_language: 翻译后的语言,参考开发文档 语言和发音人
    :return: 转换后的音频文本或者None
    """


def audio_file_translation_text(audio_path: str, source_language: str, target_language: str) -> Optional[str]:
    """
    麦克风输入流转换文本
    :param audio_path: 要翻译的音频文件路径
    :param source_language: 要翻译的语言,参考开发文档 语言和发音人
    :param target_language: 翻译后的语言,参考开发文档 语言和发音人
    :return: 转换后的音频文本或者None
    """

数字人

def init_metahuman(metahuman_mde_path: str, metahuman_scale_value: str, is_update_metahuman: bool = False)  -> bool:
    """
    初始化数字人,第一次初始化需要一些时间
    :param metahuman_mde_path: 数字人模型路径
    :param metahuman_scale_value: 数字人缩放倍数,1为原始大小。为0.5时放大一倍,2则缩小一半
    :param is_update_metahuman: 是否强制更新,默认fasle。为true时强制更新会拖慢初始化速度
    :return: True或者False
    """


def metahuman_speech(save_voice_folder: str, text: str, language: str, voice_name: str, 
                         quality: int = 0, wait_play_sound: bool = True, speech_rate: int = 0, voice_style: str = "General")  -> bool:
    """
    数字人说话,此函数需要调用 initSpeechService 初始化语音服务

    :param save_voice_folder: 保存的发音文件目录,文件名以0开始依次增加,扩展为.wav格式
    :param text: 要转换语音的文本
    :param language: 语言,参考开发文档 语言和发音人
    :param voice_name: 发音人,参考开发文档 语言和发音人
    :param quality: 音质,0低品质  1中品质  2高品质, 默认为0低品质
    :param wait_play_sound: 等待音频播报完毕,默认为 true等待
    :param speech_rate:  语速,默认为0,取值范围 -100 至 200
    :param voice_style: 语音风格,默认General常规风格,其他风格参考开发文档 语言和发音人
    :return: True或者False
    """


def metahuman_speech_cache(save_voice_folder: str, text: str, language: str, voice_name: str, 
                         quality: int = 0, wait_play_sound: bool = True, speech_rate: int = 0, voice_style: str = "General")  -> bool:
        """
        *数字人说话缓存模式,需要调用 initSpeechService 初始化语音服务。函数一般用于常用的话术播报,非常用话术切勿使用,否则内存泄漏
        :param save_voice_folder: 保存的发音文件目录,文件名以0开始依次增加,扩展为.wav格式
        :param text: 要转换语音的文本
        :param language: 语言,参考开发文档 语言和发音人
        :param voice_name: 发音人,参考开发文档 语言和发音人
        :param quality: 音质,0低品质  1中品质  2高品质, 默认为0低品质
        :param wait_play_sound: 等待音频播报完毕,默认为 true等待
        :param speech_rate:  语速,默认为0,取值范围 -100 至 200
        :param voice_style: 语音风格,默认General常规风格,其他风格参考开发文档 语言和发音人
        :return: True或者False
        """


def metahuman_insert_video(video_file_path: str, audio_file_path: str, wait_play_video:bool = True)  -> bool:
    """
    数字人插入视频
    :param video_file_path: 插入的视频文件路径
    :param audio_file_path: 插入的音频文件路径
    :param wait_play_video: 等待视频播放完毕,默认为 true等待
    :return: True或者False
    """


def replace_background(bg_file_path: str, replace_red: int = -1, replace_green: int = -1, replace_blue: int = -1, sim_value: int = 0)  -> bool:
    """
    替换数字人背景
    :param bg_file_path: 数字人背景 图片/视频 路径,默认不替换背景。仅替换绿幕背景的数字人模型
    :param replace_red: 数字人背景的三通道之一的 R通道色值。默认-1 自动提取
    :param replace_green: 数字人背景的三通道之一的 G通道色值。默认-1 自动提取
    :param replace_blue: 数字人背景的三通道之一的 B通道色值。默认-1 自动提取
    :param sim_value: 相似度。 默认为0,取值应当大于等于0
    :return: True或者False
    """


def show_speech_text(origin_y: int = 0, font_type: str = "Arial", font_size: int = 30, font_red: int = 128,
                          font_green: int = 255, font_blue: int = 0, italic:bool = False, underline:bool = False)  -> bool:
    """
    显示数字人说话的文本
    :param origin_y, 第一个字显示的起始Y坐标点。 默认0 自适应高度
    :param font_type, 字体样式,支持操作系统已安装的字体。例如"Arial"、"微软雅黑"、"楷体"
    :param font_size, 字体的大小。默认30
    :param font_red, 字体颜色三通道之一的 R通道色值。默认128
    :param font_green, 字体颜色三通道之一的 G通道色值。默认255
    :param font_blue, 字体颜色三通道之一的 B通道色值。默认0
    :param italic, 是否斜体,默认false
    :param underline, 是否有下划线,默认false
    :return: True或者False
    """

驱动程序相关

def get_extend_param() -> Optional[str]:
    """
    获取WindowsDriver.exe 命令扩展参数
    :return: WindowsDriver 驱动程序的命令行["extendParam"] 字段的参数
    """


def close_driver() -> bool:
    """
    关闭WindowsDriver.exe驱动程序
    :return:
    """

WebBot开发手册

页面和导航

def goto(url: str) -> bool:
    """
    跳转页面
    :param url: url 地址
    :return:
    """


def new_page(url: str) -> bool:
    """
    新建 Tab 并跳转页面
    :param url: url 地址
    :return:
    """


def back() -> bool:
    """
    后退
    :return:
    """


def forward() -> bool:
    """
    前进
    :return:
    """


def refresh() -> bool:
    """
    刷新
    :return:
    """


def save_screenshot(xpath: str = None) -> Optional[str]:
    """
    截图,返回 PNG 格式的 base64
    :param xpath: 元素路径,如果指定该参数则截取元素图片;
    :return: PNG 格式的 base64 的字符串或 None
    """


def get_current_page_id() -> Optional[str]:
    """
    获取当前页面 ID
    :return:
    """


def get_all_page_id() -> list:
    """
    获取所有页面 ID
    :return:
    """


def switch_to_page(page_id: str) -> bool:
    """
    切换到指定页面
    :param page_id:
    :return:
    """


def close_current_page() -> bool:
    """
    关闭当前页面
    :return:
    """


def ger_current_url() -> Optional[str]:
    """
    获取当前页面 URL
    :return: 当前页面 URL 字符串或 None
    """


def get_current_title() -> Optional[str]:
    """
    获取当前页面标题
    :return:
    """

iframe 操作

def switch_to_frame(xpath) -> bool:
    """
    切换到指定 frame
    :param xpath: xpath 路径
    :return:
    """


def switch_to_main_frame() -> bool:
    """
    切回主 frame
    :return:
    """

元素操作

def click_element(xpath: str) -> bool:
    """
    点击元素
    :param xpath:
    :return:
    """


def get_element_text(xpath: str) -> Optional[str]:
    """
    获取元素文本
    :param xpath: xpath 路径
        :return: 元素文本字符串或 None
    """


def get_element_rect(xpath: str) -> Optional[Tuple[_Point, _Point]]:
    """
    获取元素矩形坐标
    :param xpath: xpath 路径
        :return: 元素矩形坐标或None
    """


def get_element_attr(xpath: str, attr_name: str) -> Optional[str]:
    """
    获取元素的属性
    :param xpath: xpath 路径
    :param attr_name: 属性名称字符串
    :return:
    """


def get_element_outer_html(xpath: str) -> Optional[str]:
    """
    获取元素的 outerHtml
    :param xpath: xpath 路径
    :return:
    """


def get_element_inner_html(xpath: str) -> Optional[str]:
    """
    获取元素的 innerHtml
    :param xpath: xpath 路径
    :return:
    """


def is_selected(xpath: str) -> bool:
    """
    元素是否已选中
    :param xpath: xpath 路径
    :return:
    """


def is_displayed(xpath: str) -> bool:
    """
    元素是否可见
    :param xpath: xpath 路径
    :return:
    """


def is_available(xpath: str) -> bool:
    """
    元素是否可用
    :param xpath: xpath 路径
    :return:
    """


def clear_element(xpath: str) -> bool:
    """
    清除元素值
    :param xpath: xpath 路径
    :return:
    """


def set_element_focus(xpath: str) -> bool:
    """
    设置元素焦点
    :param xpath: xpath 路径
    :return:
    """


def upload_file_by_element(xpath: str, file_path: str) -> bool:
    """
    通过元素上传文件
    :param xpath:  元素 xpath 路径
    :param file_path: 文件路径
    :return:
    """


def send_keys(xpath: str, value: str) -> bool:
    """
    输入值;如果元素不能设置焦点,应先 click_mouse 点击元素获得焦点后再输入
    :param xpath: 元素 xpath 路径
    :param value: 输入的内容
    :return:
    """


def set_element_value(xpath: str, value: str) -> bool:
    """
    设置元素值
    :param xpath: 元素 xpath 路径
    :param value: 设置的内容
    :return:
    """


def set_element_attr(xpath: str, attr_name: str, attr_value: str) -> bool:
    """
    设置元素属性
    :param xpath: 元素 xpath 路径
    :param attr_name: 属性名称
    :param attr_value: 属性值
    :return:
    """


def send_vk(vk: str) -> bool:
    """
    输入值
    :param vk: 输入内容
    :return:
    """

键鼠操作

def click_mouse(point: _Point_Tuple, typ: int) -> bool:
    """
    点击鼠标
    :param point: 坐标点
    :param typ: 点击类型,单击左键:1 单击右键:2 按下左键:3 弹起左键:4 按下右键:5 弹起右键:6 双击左键:7
    :return:
    """


def move_mouse(point: _Point_Tuple) -> bool:
    """
    移动鼠标
    :param point: 坐标点
    :return:
    """


def scroll_mouse(offset_x: float, offset_y: float, x: float = 0, y: float = 0) -> bool:
    """
    滚动鼠标
    :param offset_x: 水平滚动条移动的距离
    :param offset_y: 垂直滚动条移动的距离
    :param x: 鼠标横坐标位置, 默认为0
    :param y: 鼠标纵坐标位置, 默认为0
    :return:
    """


def click_mouse_by_element(xpath: str, typ: int) -> bool:
    """
    根据元素位置点击鼠标(元素中心点)
    :param xpath: 元素 xpath 路径
    :param typ: 点击类型,单击左键:1 单击右键:2 按下左键:3 弹起左键:4 按下右键:5 弹起右键:6 双击左键:7
    :return:
    """


def move_to_element(xpath: str) -> bool:
    """
    移动鼠标到元素位置(元素中心点)
    :param xpath: 元素 xpath 路径
    :return:
    """


def scroll_mouse_by_element(xpath: str, offset_x: float, offset_y: float) -> bool:
    """
    根据元素位置滚动鼠标
    :param xpath: 元素路径
    :param offset_x: 水平滚动条移动的距离
    :param offset_y: 垂直滚动条移动的距离
    :return:
    """

Alert

def click_alert(accept: bool, prompt_text: str) -> bool:
    """
    点击警告框
    :param accept: 确认或取消
    :param prompt_text: 警告框文本
    :return:
    """


def get_alert_text() -> Optional[str]:
    """
    获取警告框文本
    :return: 警告框文本字符串
    """

窗口操作

def get_window_pos():
    """
    获取窗口位置和状态
    :return: 返回窗口左上角坐标点,宽度和高度,状态
    """


def set_window_pos(left: float, top: float, width: float, height: float, status) -> bool:
    """
    设置窗口位置和状态
    :param left: 窗口 x 坐标
    :param top: 窗口 y 坐标
    :param width: 宽度
    :param height: 高度
    :param status: 状态
    :return:
    """


def mobile_emulation(width: int, height: int, ua: str, _sys: Literal["Android", "iOS"], sys_version: str,
                         lang: str = "", tz: str = "", latitude: float = 0, longitude: float = 0,
                         accuracy: float = 0) -> bool:
    """
    模拟移动端浏览器
    :param width: 宽度
    :param height: 高度
    :param ua: 用户代理
    :param _sys: 系统
    :param sys_version: 系统版本
    :param lang: 语言
    :param tz: 时区
    :param latitude: 纬度
    :param longitude: 经度
    :param accuracy: 准确度
    :return:
    """

Cookies

def get_cookies(url: str) -> Optional[list]:
    """
    获取指定 url 的 Cookies
    :param url: url 字符串
    :return:
    """


def get_all_cookies() -> Optional[list]:
    """
    获取所有的 Cookies
    :return: 列表格式的 cookies
    """


def set_cookies(url: str, name: str, value: str, options: dict = None) -> bool:
    """
    设置指定 url 的 Cookies
    :param url: 要设置 Cookie 的域
    :param name: Cookie 名
    :param value: Cookie 值
    :param options: 其他属性
    :return:
    """


def delete_cookies(name: str, url: str = "", domain: str = "", path: str = "") -> bool:
    """
    删除指定 Cookie
    :param name: 要删除的 Cookie 的名称
    :param url: 删除所有匹配 url 和 name 的 Cookie
    :param domain: 删除所有匹配 domain 和 name 的 Cookie
    :param path: 删除所有匹配 path 和 name 的 Cookie
    :return:
    """


def delete_all_cookies() -> bool:
    """
    删除所有 Cookie
    :return:
    """


def clear_cache() -> bool:
    """
    清除缓存
    :return:
    """

JS 注入

def execute_script(script: str) -> Optional[Any]:
    """
    注入执行 JS
    :param script: 要执行的 JS 代码
    :return: 假如注入代码有返回值,则返回此值,否则返回 None;

    result = execute_script('(()=>"aibote rpa")()')
    print(result)  # "aibote rpa"
    """

浏览器操作

def quit() -> bool:
    """
    退出浏览器
    :return:
    """

驱动程序相关

def get_extend_param() -> Optional[str]:
    """
    获取WebDriver.exe 命令扩展参数
    :return: WebDriver 驱动程序的命令行["extendParam"] 字段的参数
    """


def close_driver(self) -> bool:
    """
    关闭WebDriver.exe驱动程序
    :return:
    """