1. 前言 在之前尝试过 AI 驱动的RPA程序完成给定的任务,但是整个运行下来给人的感觉就是太慢了,当时跑一个淘宝搜索产品并获取产品信息的任务跑了快10分钟,总结下来慢的原因无非下面几点。
AI返回内容慢,通过OpenRouter调用gemini模型,一个请求要1-2分钟才能返回结果。 要实现程序 感知-决策-在感知-判断 就要调用多次模型,模型调用次数越多就越慢。 所以,之前AI驱动RPA属于对技术的探索,但没有实际意义, 这次我尝试用AI来处理在自动化中会遇到的一些复杂验证码问题
下面是这次需要解决的验证码的例子,这三个验证码都来自Temu平台。
2. 核心思路 整体思路很简单,把验证码截图给AI,让AI按要求返回坐标,程序解析坐标并点击
整体的代码设计如下图,首先是三个抽象类下面逐个解释一下。
Agent:用于调用AI接口,封装了图片解析、AI结果处理等功能,需要子类实现具体的AI接口
Capability:表示一种能力,就是给AI的提示词。
Handle:使用AI返回的结果处理问题
Agent有3个子类,分别是调用OpenAI规范的接口、调用影刀内置AI接口和调用影刀AIPower接口。
Capability的3个子类分别表示点选验证码处理、拖动验证码处理以及复选框处理
在做软件自动化时很容易遇到复选框无法判断是否勾选,这种情况就可以借助AI
Handle有2个子类分表用于,处理点击操作和处理拖动操作
3. 代码实现 ability.py
from abc import ABC, abstractmethod class Capability(ABC): """ 表示一种能力, AI能做什么操作 """ @property @abstractmethod def prompt(self): pass class ClickVerifier(Capability): @property def prompt(self): prompt = """ 请严格按照图片中给出的操作要求执行。 图片中已经明确标注了需要点击的目标及点击顺序, 你只需要根据图片内容,依次返回每一步需要点击的位置坐标。 规则: 1. 只返回图片中明确要求点击的内容,不要增加或省略步骤 2. 坐标基于当前输入图片的像素坐标 3. 坐标原点为图片左上角 (0, 0),x 向右,y 向下 4. 每个坐标应尽量位于对应目标的可点击区域中心 5. 如果图片中某一步无法明确定位,请不要猜测,在 summary 中说明 输出要求: - 仅返回 JSON,不要输出任何多余文本 - 不要使用 markdown - JSON 结构必须严格如下: { "positions": [ { "x": xxx, "y": xxx }, { "x": xxx, "y": xxx } ], "summary": "简要说明这些坐标如何对应图片中的点击要求" } """ return prompt class DragVerifier(Capability): @property def prompt(self): prompt = """ 图片中已经明确标注了需要如何拖拽内容 你只需要根据图片内容,依次返回开始拖拽和结束拖拽的位置坐标 规则: 1. 坐标基于当前输入图片的像素坐标 2. 坐标原点为图片左上角 (0, 0),x 向右,y 向下 3. 每个坐标应尽量位于对应目标的可点击区域中心 4. 如果图片中某一步无法明确定位,请不要猜测,在 summary 中说明 输出要求: - 仅返回 JSON,不要输出任何多余文本 - 不要使用 markdown - JSON 结构必须严格如下: { "positions": [ { "start": { "x": xxx, "y": xxx, }, "end": { "x": xxx, "y": xxx, } }, { "start": { "x": xxx, "y": xxx, }, "end": { "x": xxx, "y": xxx, } }, ], "summary": "简要说明理由" } """ return prompt class CheckboxProcess(Capability): @property def prompt(self): prompt = """ 给你一张界面截图,你需要根据任务要求返回需要点击的复选框坐标 如果一个复选框已经被点击则跳过该复选框 规则 1. 坐标基于当前输入图片的像素坐标 2. 坐标原点为图片左上角 (0, 0),x 向右,y 向下 3. 每个坐标应尽量位于对应目标的可点击区域中心 4. 如果图片中某一步无法明确定位,请不要猜测,在 summary 中说明 输出要求: - 仅返回 JSON,不要输出任何多余文本 - 不要使用 markdown - JSON 结构必须严格如下: { "positions": [ { "x": xxx, "y": xxx }, { "x": xxx, "y": xxx } ], "summary": "简要说明这些坐标如何对应图片中的点击要求" } """ return prompt agent.py
...