保存时间:2026/3/29 22:18:04
| 设备名称 | 具体型号/关键词 | 价格 | 核心用途 | 采购渠道 |
|---|---|---|---|---|
| USB虚拟键鼠盒 | 易键鼠6.4版/飞易来VIP/USB键盘鼠标模拟器 | 50-150元 | 硬件层模拟键鼠,防系统检测,兼容性100% | 淘宝/1688搜索"USB键鼠模拟器" |
| USB摄像头 | 1080P免驱(如Logitech C270) | 30-80元 | 拍屏幕做视觉识别(实验阶段可省) | 京东/淘宝 |
| 二手工控机/笔记本 | 双核4G内存 | 100-500元 | 跑控制程序,发键鼠指令 | 闲鱼/本地二手 |
sudo apt update
sudo apt install tesseract-ocr tesseract-ocr-chi-sim # 中文语言包
sudo snap install umi-ocr # 或官网下载deb包
| 工具名称 | 优势 | 适用场景 | 安装方式 |
|---|---|---|---|
| xdotool | 最成熟,支持鼠标移动、点击、键盘输入,X11下完美运行 | 快速原型、简单自动化 | sudo apt install xdotool |
| uinput | 内核级虚拟输入,支持Wayland/X11,模拟真实硬件 | 深度开发、防检测 | 内核自带,安装libevdev:sudo apt install libevdev-dev |
| python-uinput | Python接口,编程友好 | 复杂逻辑、AI集成 | pip install python-uinput |
| pynput | 跨平台,支持监听+模拟,API简洁 | 快速开发、脚本编写 | pip install pynput |
sudo apt update && sudo apt install scrot xdotool tesseract-ocr tesseract-ocr-chi-sim
pip install pynput opencv-python
# 1. 打开记事本(测试目标)
gedit &
sleep 2 # 等待窗口加载
# 2. 抓屏识别标题(验证OCR)
scrot -s /tmp/screen.png # 手动框选标题栏
tesseract /tmp/screen.png /tmp/result -l chi_sim+eng
cat /tmp/result.txt
# 3. 模拟输入(核心操作)
xdotool type "Hello! 我是虚拟键鼠,正在自动输入..." # 键盘输入
xdotool click 1 # 左键点击
xdotool mousemove 500 500 # 移动鼠标到坐标(500,500)
from pynput import mouse, keyboard
import time
# 鼠标控制
mouse_controller = mouse.Controller()
mouse_controller.position = (500, 500) # 移动
mouse_controller.click(mouse.Button.left, 1) # 点击
# 键盘控制
keyboard_controller = keyboard.Controller()
keyboard_controller.type("Hello World!") # 输入文字
keyboard_controller.press(keyboard.Key.enter) # 按回车
keyboard_controller.release(keyboard.Key.enter)
import subprocess
import time
from pynput import mouse, keyboard
def capture_screen(region=None):
"""截图函数,region格式:x,y,w,h"""
if region:
x,y,w,h = region
subprocess.run(f"scrot -a {x},{y},{w},{h} /tmp/screen.png", shell=True)
else:
subprocess.run("scrot /tmp/screen.png", shell=True)
def ocr_image(image_path):
"""OCR识别函数"""
result = subprocess.run(
f"tesseract {image_path} /tmp/ocr_result -l chi_sim+eng",
shell=True, capture_output=True, text=True
)
with open("/tmp/ocr_result.txt", "r") as f:
return f.read().strip()
# 完整流程示例:打开记事本→输入文字→保存
capture_screen() # 抓全屏
text = ocr_image("/tmp/screen.png")
print("识别结果:", text)
# 控制键鼠操作
keyboard_controller = keyboard.Controller()
mouse_controller = mouse.Controller()
keyboard_controller.press(keyboard.Key.cmd) # Windows键
keyboard_controller.press('r')
keyboard_controller.release('r')
keyboard_controller.release(keyboard.Key.cmd)
time.sleep(1)
keyboard_controller.type("gedit")
keyboard_controller.press(keyboard.Key.enter)
keyboard_controller.release(keyboard.Key.enter)
time.sleep(2)
keyboard_controller.type("这是自动化输入的内容!")
sudo apt update
sudo apt install x11vnc vncdotool python3-vncdotool tesseract-ocr
x11vnc -display :0 -forever -shared
vncdotool -s localhost capture screen.png
vncdotool -s localhost move 500 300 click 1
vncdotool -s localhost type "我是AI,正在通过VNC输入"
vncdotool -s localhost key enter
远程桌面 VNC 早就把“眼+手”全套标准化了,我们根本不需要自己写抓屏、写坐标、写键鼠,直接在 VNC 之上做 AI 就行,这是最省力、最稳定、最通用的方案。
写死步骤 → 顺序跑 → 错了就挂看屏幕 → AI 想一步 → 执行一步 → 再看屏幕 → AI 再想是交互式、闭环、动态的。pip install vncdotool openai
from vncdotool import api
import time
# ====================== 配置 ======================
VNC_HOST = "localhost"
VNC_PASS = "" # 没密码就空
# 大模型接口(本地ollama/在线都可以,这里用通用格式示意)
def ask_llm(prompt):
# 你换成本地大模型API也行
from openai import OpenAI
client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")
resp = client.chat.completions.create(
model="qwen:7b",
messages=[{"role":"user", "content": prompt}]
)
return resp.choices[0].message.content.strip()
# ====================== VNC 动作封装 ======================
def vnc_act(client, cmd):
"""cmd 例子: "click 500 300" / "type 你好" / "enter" """
parts = cmd.split()
if parts[0] == "click":
x, y = int(parts[1]), int(parts[2])
client.mouseMove(x, y)
client.mouseDown(1)
client.mouseUp(1)
elif parts[0] == "type":
client.type(" ".join(parts[1:]))
elif parts[0] == "enter":
client.keyPress("enter")
time.sleep(0.5)
# ====================== 主循环:AI 手眼闭环 ======================
if __name__ == "__main__":
client = api.connect(VNC_HOST, password=VNC_PASS)
client.timeout = 60
# 1. 眼:抓屏
client.captureScreen("screen.png")
# 2. 给AI看屏幕+问下一步
prompt = """
这是电脑屏幕,你只返回可执行动作,格式3选1:
1) click x y
2) type 内容
3) enter
不要解释,只返回一行动作。
"""
action = ask_llm(prompt)
print("AI 决定:", action)
# 3. 手:执行
vnc_act(client, action)
client.close()
x11vnc| 工具名 | 核心能力 | 最适合你的场景 |
|---|---|---|
| vncdotool | VNC自动化,命令行/API控制,抓屏+键鼠 | 你之前说的本机模拟、手眼结合原型 |
| PyAutoGUI | 本地键鼠模拟+屏幕截图,跨平台 | 本机实验,不用VNC,直接控制自己 |
| xdotool | Linux下的X11窗口/键鼠控制 | Ubuntu 22.04下做本地自动化,超轻量 |
| FreeRDP | RDP协议的开源实现,带命令行自动化接口 | 控制Windows远程桌面,比VNC更适合Windows环境 |
| QuickDesk | AI原生远程桌面,内置MCP协议,支持AI Agent接入 | 直接对接大模型,不用自己写胶水层 |
| VNCRobot | 可视化VNC脚本录制/执行,支持循环、条件判断 | 快速录制操作,生成可重复执行的脚本 |
写死脚本 → 顺序执行 → 错了就停抓屏(眼)→ 大模型分析(脑)→ 生成动态动作(手)→ 执行 → 再抓屏x11vnc + xdotool(本地VNC服务+本地键鼠控制,不用远程)ollama + qwen:7b(本地大模型,完全离线)sudo apt update && sudo apt install x11vnc xdotool tesseract-ocr python3-pip
pip install vncdotool ollama
ollama pull qwen:7b # 拉取本地大模型
x11vnc -display :0 -forever -shared -nopw # 无密码,方便测试
from vncdotool import api
import subprocess
import ollama
# 1. 抓屏(眼)
def capture_screen(client):
client.captureScreen("screen.png")
# 用tesseract做OCR,提取屏幕文字
text = subprocess.check_output(["tesseract", "screen.png", "stdout"]).decode()
return text
# 2. 问本地大模型(脑)
def ask_ai(screen_text):
prompt = f"""
屏幕文字:{screen_text[:500]} # 只传前500字,避免太长
任务:打开浏览器,访问百度
要求:只返回xdotool命令,一行完成,比如"xdotool mousemove 500 300 click 1"
不要解释,只返回命令!
"""
response = ollama.chat(model="qwen:7b", messages=[{"role": "user", "content": prompt}])
return response["message"]["content"].strip()
# 3. 执行动作(手)
def execute_action(action):
subprocess.run(action, shell=True)
print(f"执行动作:{action}")
# 主循环
if __name__ == "__main__":
client = api.connect("localhost")
screen_text = capture_screen(client)
action = ask_ai(screen_text)
execute_action(action)
client.close()
scrot、gnome-screenshot)是通过 X11 协议去“问”窗口管理器要画面,而不是直接读帧缓存,所以会漏掉这些合成器直接画的元素。ffmpeg 抓屏(推荐)# 抓整个屏幕,包括所有合成器元素
ffmpeg -f x11grab -r 1 -s $(xdpyinfo | grep dimensions | awk '{print $2}') -i :0.0 -vframes 1 screen_full.png
wlroots 相关的工具,如 grim。grim(Wayland 专用)# Wayland 下抓屏
grim screen.png
x11vnc)的核心工作就是 把整个屏幕的帧缓存编码后发出去,它不管你是 X11 窗口还是 compositor 画的 tooltip,只要是显示在屏幕上的,它都能抓到。vncdotool)抓屏时,得到的画面是 完整的、包含所有视觉元素的,不会漏掉 tooltip。PropertyNotify 或 Damage 事件,当屏幕内容发生变化时再抓屏,而不是定时抓屏,这样能精准抓住 tooltip 弹出的瞬间。ffmpeg + vncdotool 结合的 Python 脚本,专门解决 tooltip 漏抓和 timing 问题,你直接在 Ubuntu 上跑就能看到完整的屏幕画面,包括所有浮动提示框。要不要?| 模型名称 | 能力 | 适用场景 |
|---|---|---|
| Qwen-VL | 支持图像/视频理解,OCR、物体检测、空间推理,中文支持好 | 国内部署首选,适合办公自动化 |
| LLaVA | 基于 LLaMA,开源可微调,视觉理解能力强 | 学术研究、自定义场景 |
| InternVL | 支持 4K 分辨率图像,细节识别能力强 | 高精度视觉任务 |
| MiniGPT-4 | 轻量版视觉模型,适合端侧部署 | 低算力设备 |
| 量化方式 | 显存需求 | 硬件示例 | 推理速度 |
|---|---|---|---|
| FP16 | 16-24GB | RTX 3090/4080 | 流畅 |
| 8-bit | 10-12GB | RTX 3060/4050 | 可接受 |
| 4-bit | 6-8GB | RTX 2060/3050 | 稍慢,但可用 |
00:00:02 → 鼠标移动到 (500, 300)
00:00:03 → 左键点击
00:00:05 → 输入 "username"
| 模型 | 量化方式 | 显存需求 | 硬件成本(参考) |
|---|---|---|---|
| Qwen-VL-7B | 4-bit | 8GB | RTX 4050M(12GB)笔记本,约8000-10000元 |
| DeepSeek-VL-7B | 8-bit | 10GB | RTX 3060(12GB)台式机,约5000-7000元 |
| LLaVA-1.6-7B | 4-bit | 6GB | RTX 2060(8GB)台式机,约3000-5000元 |
[被操作电脑:ERP/CRM/办公机]
↓ 屏幕光
[摄像头:眼睛]
↓ 画面传给大脑
[本地小主机:跑多模态VL模型]
↓ 决策:点哪里、输什么
[USB键鼠控制器:手]
↓ 物理信号
[被操作电脑:正常响应,以为是人]
fswebcam / OpenCV 拍照click(520,330) 这种click(500,300)),转换成电脑能理解的 USB 信号。move() click() type() 等命令,非常适合原型开发。pyautogui、pynput直接控制本机键鼠move(x,y)、click()、type()pyautogui+摄像头就行本地跑一个量化多模态VL模型,看图 → 直接输出鼠标键盘动作。
curl -fsSL https://ollama.com/install.sh | sh
ollama run llava:7b
>>> 这是电脑桌面,告诉我点哪里可以打开浏览器,输出 click(x,y)
click(20, 30)
ollama run llava:7b-q4_K_M
ollama run qwen-vl:7b-q4_K_M
click(100, 200)
type("abc")
整个系统的成败 99% 靠模型能力,不靠代码。模型强 → 啥都不用写,自然就会。模型弱 → 写再多代码都是补丁、都是绕路。
模型够强,就不需要一堆胶水代码;错了自己修正,循环里学会。
示范一遍 → 模型能不能记住步骤、复现操作
(20,30)click(20,30)图片:[屏幕照片]
问题:点击哪里可以打开文件夹?请输出 click(x,y)
点击左上角的文件夹图标,坐标为 click(20, 30)
click(20, 30)
click(500, 300)摄像头图片 → Qwen-VL → 文字回答(含click)→ 你解析 → 键鼠动作
click(x,y)type(...)图里目标按钮离当前鼠标有多远?要移动多少距离?
dx=120, dy=30dx, dy 这种好解析的格式。要不要?看 东 开门 拿钥匙这张图里有什么?按钮在哪?离鼠标多远?
移动鼠标过去点击
click/move/type/look即可look → 调用VL看屏幕,返回描述move x y → 控制鼠标移动click → 模拟点击type text → 模拟输入evennia init生成空项目,直接写你的视觉Agent逻辑class CmdLook(Command):
key = "look"
def func(self):
# 调用VL模型,拍屏→识别→返回文字描述
desc = call_vl_look(self.caller.screen)
self.caller.msg(desc)
class CmdMove(Command):
key = "move"
def func(self):
dx, dy = parse_args(self.args)
# 控制鼠标移动 dx, dy
move_mouse(dx, dy)
look/move/click/retry/goal全套模板,你直接复制就能跑?[大模型 VL] ← 大脑:看图 → 说文字指令
↑↓(通过 Python 调用)
[MUD 引擎(Evennia 或轻量框架)] ← 身体:管理状态、命令、重试
↑↓
[摄像头 + 键鼠控制] ← 五官和手
go east,它就执行click,它就点while True:
1. 摄像头拍屏幕
2. 传给 VL 模型
3. 模型返回文字指令(比如 move 100 50, click)
4. 把文字丢给 MUD 引擎执行
5. 引擎执行完,记录结果
6. 错了 → 重试 / 再问模型
大脑:VL 模型(Python 调用)
身体:Evennia MUD 引擎(Python)
手脚:摄像头 + 键鼠控制器(Python 控制)
主控:你写 50 行 Python 循环(把它们串起来)
MOVE dx dyCLICKTYPE abcLOOK这是动作模板,固定死。只允许输出 MOVE / CLICK / TYPE / LOOK 格式,不许说别的
MOVE 120 45
当前目标:打开文件夹
当前鼠标位置:(100,200)
上次动作:MOVE 50 50(失败)
请你看图输出下一步动作:
open_folder, login, click_submitidle, moving, typing, errorMOVE, CLICK, TYPE, LOOK, RIGHT_CLICKDRAGWAITING_POPUPFILL_FORMMOVE 100 30open_folderloginclick_okfill_formcurrent_task = "用户让我做的任何事"
history = []
error_count = 0
这是当前屏幕图片。当前任务:{current_task}历史步骤:{history}错误次数:{error_count}请你输出下一步动作,只能用以下格式:
- MOVE dx dy
- CLICK
- TYPE xxx
- LOOK不要解释,只输出指令。
帮我打开浏览器,去百度一下天气
用户任务:{用户输入的任何话}请根据屏幕图片,输出下一步标准动作:MOVE / CLICK / TYPE / LOOK
用户任务:{task}
当前状态:{state}
历史步骤:{history}
请看图片,输出下一步动作:
任务库/
├─ 打开浏览器/
│ ├─ 2026-03-01 记忆
│ ├─ 2026-03-05 记忆
│ └─ 2026-03-06 记忆
├─ 填表单A/
│ ├─ 2026-02-10 记忆
│ └─ 2026-02-28 记忆
└─ 登录系统/
└─ 每次记录……
以前填过:姓名:张三电话:138xxxx公司:xxx这次你参考这些填,但不要覆盖旧记录。
has_key = True/Falsemouse_reached_button = True/Falsepopup_appeared = True/False如果没拿到key,就不能进门
flag_A1、flag_A2、flag_A3flag_B1、flag_B2、flag_B3拿A任务的关卡去做B任务,不行
| 《金庸群侠传》核心要素 | MUD 引擎(Evennia)能力 | 千问 VL 能力 |
|---|---|---|
| 任务链与条件触发(如拿《九阴真经》才能过特定剧情) | 原生 Quest 系统,支持前置条件、状态标记、任务链,上下文完全隔离 | 解析任务目标,生成符合条件的动作指令,判断何时触发下一步 |
| 物品与状态管理(秘籍、药品、队友、道德值、限时任务) | 持久化对象存储,独立任务上下文,定时器(Timer)支持限时逻辑 | 识别物品用途,管理队友阵容,根据道德值调整策略,处理超时判断 |
| 开放世界探索(地图移动、NPC 交互、隐藏剧情) | 地图拓扑与房间系统,支持动态事件与交互触发 | 视觉/文本识别场景与 NPC,生成探索路径,理解对话选项与隐藏条件 |
| 战斗与试错(武功搭配、敌我血量判断、失败重试) | 试错机制与状态回滚,记录战斗历史 | 分析战斗状态,选择最优武功,失败后生成重试策略 |
任务进度、物品栏、队友列表、道德值、当前地图、限时倒计时。移动、对话、使用物品、战斗、存档、读档。前置任务完成、拥有特定物品、道德值达标、时间未到。移动(坐标X,Y)、使用物品(九阴真经))。总量控制在 300~500 字以内,千问 VL 完全吃得下,理解最强。
这个想法不是今天才有的,很多年前就有了。
不管你是办公、写代码、订机票、玩游戏、聊天、写文案……我一个框架全都能搞定,不用你改结构。
帮我打开浏览器→搜天气→填表格
step1_done=True/False 这种东西,它只能靠文字回忆:我刚才好像打开了…
memory = []
while True:
# 1. 把历史拼一拼
prompt = "历史:\n" + "\n".join(memory[-5:]) + "\n下一步干啥?"
# 2. 问模型
action = llm(prompt)
# 3. 执行
result = execute(action)
# 4. 记一下
memory.append(f"动作: {action}, 结果: {result}")
模型自己生成 shell 命令,自己遍历系统,自己存信息
连状态机都让模型现场定义?
这也能叫通用框架?骗人也没这么骗的。
while True: ask_llm() 来得快dx dy 这种精确格式这里有个按钮,上面是“确定”
按钮在屏幕 320,480 位置,鼠标移 +100,-50 然后点击
如果路那么好走,别人早就走通了,我估计是走不通。
需要不需要最后去把弯路再捋直?
第一次不会 → 教一遍 → 第二次/第三次会了 → 以后记住不再犯普通人也就这水平,能做到就完全够用。
A请看图:
- 左边你刚才点的那条文字是什么?
- 右边页面顶部的标题文字是什么?
- 这两个文字是否完全一样?回答“一样”或“不一样”。
- 点击左边列表里叫“XXX”的那一条
- 等待3秒
- 检查左边标题和右边标题是不是一样
- 不一样就回到第1步重来
- 一样就点右上角导出书签
- 等文件下载
- 把文件移动到backup目录
- 用右边标题做文件名
page.click("左边历史记录") → 它自动等、自动点、自动重试expect(page.locator("右边标题")).toHaveText("XXX") → 自动比对,不对就报错/重试pyautogui.click(左边按钮) → 自动点if pyautogui.locateOnScreen("右边标题.png"): → 自动比对- 点击: 左边历史记录
- 等待: 右边标题加载
- 校验: 左边标题 == 右边标题
- 导出: 书签
- 移动: 文件到backup
点左边这条历史等右边出来看名字对不对点导出书签复制标题改名移到备份目录
sudo apt update
sudo apt install openjdk-17-jre python3-pip
pip3 install sikulixapi
sudo apt install autokey-gtk # GTK版(推荐)
sudo apt install python3-dev libx11-dev libxtst-dev
sudo apt update
sudo apt install openjdk-17-jre python3-pip
pip3 install sikulixapi
pip3 install pyautogui opencv-python