robotgo

GitHub
10.7k 953 较难 1 次阅读 昨天Apache-2.0Agent图像音频插件语言模型其他数据工具开发框架
AI 解读 由 AI 自动生成,仅供参考

RobotGo 是一款基于 Go 语言原生的跨平台桌面自动化工具,旨在帮助开发者轻松实现鼠标控制、键盘模拟、屏幕图像识别、窗口管理及全局事件监听等功能。它主要解决了在不同操作系统(Mac、Windows、Linux)上编写自动化脚本时面临的兼容性难题,让用户只需一套代码即可在多种环境中运行,广泛应用于自动化测试(RPA)、重复性任务处理及 AI 智能体交互场景。

这款工具特别适合具备一定编程基础的开发者、测试工程师以及希望构建自定义自动化流程的技术研究人员使用。其核心亮点在于“原生”与“轻量”:无需依赖庞大的外部框架,直接调用系统底层 API,确保了执行的高效性与稳定性。同时,RobotGo 提供了丰富的图像处理与位图操作能力,支持复杂的视觉识别任务。虽然配置环境需要安装 GCC 等基础编译工具,但其强大的跨架构支持(包括 arm64 和 x86)使其成为构建高性能桌面自动化应用的理想选择。

使用场景

某电商运营团队每天需跨 Windows 和 Mac 系统,从数十个后台网页抓取销售数据并汇总至本地 Excel,人工操作耗时且易错。

没有 robotgo 时

  • 跨平台适配困难:团队成员使用不同操作系统,需分别编写 Python (PyAutoGUI) 或 AutoHotkey 脚本,维护两套代码库成本极高。
  • 图像识别不稳定:依赖简单的坐标点击,一旦网页布局微调或分辨率变化,脚本立即失效,需频繁人工介入修复。
  • 执行效率低下:无法并行处理多窗口任务,每人每天需花费 2 小时重复进行“打开网页 - 复制 - 粘贴”的机械操作。
  • 异常处理缺失:遇到弹窗广告或加载延迟时脚本直接崩溃,缺乏原生的全局事件监听机制来自动恢复流程。

使用 robotgo 后

  • 一套代码通吃多端:利用 robotgo 的跨平台特性,团队仅用 Go 语言编写一次逻辑,即可在 Windows、Mac 和 Linux 上无缝运行,统一了自动化标准。
  • 智能图像定位:调用 robotgo 的位图查找功能,通过截图特征精准定位按钮而非死板坐标,即使页面微调也能稳定操作,大幅降低维护率。
  • 高性能并发执行:借助 Go 语言的协程优势,结合 robotgo 控制鼠标键盘,可瞬间启动几十个并行任务,将每日汇总时间从 2 小时压缩至 5 分钟。
  • 健壮的全局监听:利用全局事件钩子实时监测屏幕状态,遇到弹窗自动关闭、加载超时自动重试,实现了真正无人值守的自动化流程。

robotgo 通过原生跨平台能力和精准的视觉控制,将繁琐的人工报表流程转化为高效、稳定的自动化闭环,显著释放了人力价值。

运行环境要求

操作系统
  • Linux
  • macOS
  • Windows
GPU

未说明

内存

未说明

依赖
notes该工具是基于 Golang 的桌面自动化库,非 Python AI 模型。macOS 用户需在系统设置中授予“辅助功能”和“屏幕录制”权限。Linux 用户需安装 X11 及相关扩展库(如 Ubuntu/Fedora 下的具体开发包)。Windows 用户需配置 GCC 环境变量。支持 arm64 和 x86-amd64 架构。
python不适用 (基于 Golang)
Golang
GCC
X11 (Linux)
libxtst (Linux)
xsel/xclip (Linux)
libpng (Linux)
xcb/libxkbcommon (Linux)
Xcode Command Line Tools (macOS)
llvm-mingw 或 Mingw-w64 (Windows)
robotgo hero image

快速开始

Robotgo

构建状态 CircleCI 状态 Go Report Card GoDoc GitHub 发布

Golang 桌面自动化、自动化测试及人工智能计算机应用。
控制鼠标、键盘,读取屏幕内容,处理窗口句柄、图像和位图,以及全局事件监听。

RobotGo 支持 macOS、Windows 和 Linux (X11);同时支持 arm64 和 x86-amd64 架构。

RobotGo-Pro 提供 JavaScript、Python、Lua 等版本的支持,技术协助、新功能以及最新版的 RobotGo(例如 Wayland 支持,“目前无开源版本”)。

目录

文档

绑定:

ADB,封装了 Android ADB API。

要求:

现在,请确保在安装 RobotGo 之前,GolangGCC 已正确安装。

全部:

Golang

GCC

对于 macOS:

brew install go

Xcode 命令行工具;
并且需要在隐私设置中添加“屏幕录制”和“辅助功能”权限:
系统设置 > 隐私与安全性 > 辅助功能、屏幕与系统音频录制

xcode-select --install

对于 Windows:

winget install Golang.go

llvm-mingw

winget install MartinStorsjo.LLVM-MinGW.UCRT

或者 Mingw-w64

winget install BrechtSanders.WinLibs.POSIX.UCRT

或者下载 Mingw-w64 及其他 GCC 编译器,然后将类似 C:\mingw64\bin 的路径添加到系统的环境变量 Path 中。
设置环境变量以便从命令行运行 GCC

或者使用其他 GCC(除了 Mingw-w64 外,使用 bitmap 时需自行编译 “libpng”)。

对于其他所有系统:

GCC

X11 并配备 XTest 扩展(Xtst 库)

“剪贴板”:xsel、xclip

“位图”:libpng(仅用于 bitmap)

“事件监听”:xcb、xkb、libxkbcommon(仅用于 hook)
Ubuntu:
# sudo apt install golang
sudo snap install go  --classic

# gcc
sudo apt install gcc libc6-dev

# x11
sudo apt install libx11-dev xorg-dev libxtst-dev

# 剪贴板
sudo apt install xsel xclip

# 位图
sudo apt install libpng++-dev

# GoHook
sudo apt install xcb libxcb-xkb-dev x11-xkb-utils libx11-xcb-dev libxkbcommon-x11-dev libxkbcommon-dev
Fedora:
# x11
sudo dnf install libXtst-devel

# 剪贴板
sudo dnf install xsel xclip

# 位图
sudo dnf install libpng-devel

# GoHook
sudo dnf install libxkbcommon-devel libxkbcommon-x11-devel xorg-x11-xkb-utils-devel

安装:

如果支持 Go 模块(Go 1.11 及以上版本),只需导入:

import "github.com/go-vgo/robotgo"

否则,要安装 robotgo 包,运行以下命令:

go get github.com/go-vgo/robotgo

png.h:没有这样的文件或目录?请参阅 issues/47

更新:

go get -u github.com/go-vgo/robotgo

注意 go1.10.x C 文件编译缓存问题,golang #24355
go mod vendor 问题,golang #26366

示例:

鼠标

package main

import (
  "fmt"
  "github.com/go-vgo/robotgo"
)

func main() {
  robotgo.MouseSleep = 300

  robotgo.Move(100, 100)
  fmt.Println(robotgo.Location())
  robotgo.Move(100, -200) // 支持多屏
  robotgo.MoveSmooth(120, -150)
  fmt.Println(robotgo.Location())

  robotgo.ScrollDir(10, "up")
  robotgo.ScrollDir(20, "right")

  robotgo.Scroll(0, -10)
  robotgo.Scroll(100, 0)

  robotgo.MilliSleep(100)
  robotgo.ScrollSmooth(-10, 6)
  // robotgo.ScrollRelative(10, -100)

  robotgo.Move(10, 20)
  robotgo.MoveRelative(0, -10)
  robotgo.DragSmooth(10, 10)

  robotgo.Click("wheelRight")
  robotgo.Click("left", true)
  robotgo.MoveSmooth(100, 200, 1.0, 10.0)

  robotgo.Toggle("left")
  robotgo.Toggle("left", "up")
}

键盘

package main

import (
  "fmt"

  "github.com/go-vgo/robotgo"
)

func main() {
  robotgo.Type("Hello World")
  robotgo.Type("だんしゃり", 0, 1)
  // robotgo.Type("テストする")

  robotgo.Type("Hi, Seattle space needle, Golden gate bridge, One world trade center.")
  robotgo.Type("Hi galaxy, hi stars, hi MT.Rainier, hi sea. こんにちは世界.")
  robotgo.Sleep(1)

  // ustr := uint32(robotgo.CharCodeAt("Test", 0))
  // robotgo.UnicodeType(ustr)

  robotgo.KeySleep = 100
  robotgo.KeyTap("enter")
  // robotgo.Type("en")
  robotgo.KeyTap("i", "alt", "cmd")

  arr := []string{"alt", "cmd"}
  robotgo.KeyTap("i", arr)

  robotgo.MilliSleep(100)
  robotgo.KeyToggle("a")
  robotgo.KeyToggle("a", "up")

  robotgo.WriteAll("Test")
  text, err := robotgo.ReadAll()
  if err == nil {
    fmt.Println(text)
  }
}

屏幕

package main

import (
  "fmt"
  "strconv"

  "github.com/go-vgo/robotgo"
  "github.com/vcaesar/imgo"
)

func main() {
  x, y := robotgo.Location()
  fmt.Println("pos: ", x, y)

  color := robotgo.GetPixelColor(100, 200)
  fmt.Println("color---- ", color)

  sx, sy := robotgo.GetScreenSize()
  fmt.Println("获取屏幕尺寸: ", sx, sy)

  bit := robotgo.CaptureScreen(10, 10, 30, 30)
  defer robotgo.FreeBitmap(bit)

  img := robotgo.ToImage(bit)
  imgo.Save("test.png", img)

num := robotgo.DisplaysNum()
  for i := 0; i < num; i++ {
    robotgo.DisplayID = i
    img1, _ := robotgo.CaptureImg()
    path1 := "save_" + strconv.Itoa(i)
    robotgo.Save(img1, path1+".png")
    robotgo.SaveJpeg(img1, path1+".jpeg", 50)

    img2, _ := robotgo.CaptureImg(10, 10, 20, 20)
    robotgo.Save(img2, "test_"+strconv.Itoa(i)+".png")

    x, y, w, h := robotgo.GetDisplayBounds(i)
    img3, err := robotgo.CaptureImg(x, y, w, h)
    fmt.Println("Capture error: ", err)
    robotgo.Save(img3, path1+"_1.png")
  }
}

Bitmap

package main

import (
  "fmt"

  "github.com/go-vgo/robotgo"
  "github.com/vcaesar/bitmap"
)

func main() {
  bit := robotgo.CaptureScreen(10, 20, 30, 40)
  // 使用 `defer robotgo.FreeBitmap(bit)` 来释放位图
  defer robotgo.FreeBitmap(bit)

  fmt.Println("bitmap...", bit)
  img := robotgo.ToImage(bit)
  // robotgo.SavePng(img, "test_1.png")
  robotgo.Save(img, "test_1.png")

  bit2 := robotgo.ToCBitmap(robotgo.ImgToBitmap(img))
  fx, fy := bitmap.Find(bit2)
  fmt.Println("FindBitmap------ ", fx, fy)
  robotgo.Move(fx, fy)

  arr := bitmap.FindAll(bit2)
  fmt.Println("Find all bitmap: ", arr)

  fx, fy = bitmap.Find(bit)
  fmt.Println("FindBitmap------ ", fx, fy)

  bitmap.Save(bit, "test.png")
}

OpenCV

package main

import (
  "fmt"
  "math/rand"

  "github.com/go-vgo/robotgo"
  "github.com/vcaesar/gcv"
  "github.com/vcaesar/bitmap"
)

func main() {
  opencv()
}

func opencv() {
  name := "test.png"
  name1 := "test_001.png"
  robotgo.SaveCapture(name1, 10, 10, 30, 30)
  robotgo.SaveCapture(name)

  fmt.Print("gcv find image: ")
  fmt.Println(gcv.FindImgFile(name1, name))
  fmt.Println(gcv.FindAllImgFile(name1, name))

  bit := bitmap.Open(name1)
  defer robotgo.FreeBitmap(bit)
  fmt.Print("find bitmap: ")
  fmt.Println(bitmap.Find(bit))

  // bit0 := robotgo.CaptureScreen()
  // img := robotgo.ToImage(bit0)
  // bit1 := robotgo.CaptureScreen(10, 10, 30, 30)
  // img1 := robotgo.ToImage(bit1)
  // defer robotgo.FreeBitmapArr(bit0, bit1)
  img, _ := robotgo.CaptureImg()
  img1, _ := robotgo.CaptureImg(10, 10, 30, 30)

  fmt.Print("gcv find image: ")
  fmt.Println(gcv.FindImg(img1, img))
  fmt.Println()

  res := gcv.FindAllImg(img1, img)
  fmt.Println(res[0].TopLeft.Y, res[0].Rects.TopLeft.X, res)
  x, y := res[0].TopLeft.X, res[0].TopLeft.Y
  robotgo.Move(x, y-rand.Intn(5))
  robotgo.MilliSleep(100)
  robotgo.Click()

  res = gcv.FindAll(img1, img) // 使用模板匹配和SIFT算法
  fmt.Println("find all: ", res)
  res1 := gcv.Find(img1, img)
  fmt.Println("find: ", res1)

  img2, _, _ := robotgo.DecodeImg("test_001.png")
  x, y = gcv.FindX(img2, img)
  fmt.Println(x, y)
}

Event

package main

import (
  "fmt"

  // "github.com/go-vgo/robotgo"
  hook "github.com/robotn/gohook"
)

func main() {
  add()
  low()
  event()
}

func add() {
  fmt.Println("--- 请按 ctrl + shift + q 停止钩子 ---")
  hook.Register(hook.KeyDown, []string{"q", "ctrl", "shift"}, func(e hook.Event) {
    fmt.Println("ctrl-shift-q")
    hook.End()
  })

  fmt.Println("--- 请按 w 键 ---")
  hook.Register(hook.KeyDown, []string{"w"}, func(e hook.Event) {
    fmt.Println("w")
  })

  s := hook.Start()
  <-hook.Process(s)
}

func low() {
	evChan := hook.Start()
	defer hook.End()

	for ev := range evChan {
		fmt.Println("hook: ", ev)
	}
}

func event() {
  ok := hook.AddEvents("q", "ctrl", "shift")
  if ok {
    fmt.Println("add events...")
  }

  keve := hook.AddEvent("k")
  if keve {
    fmt.Println("you press... ", "k")
  }

  mleft := hook.AddEvent("mleft")
  if mleft {
    fmt.Println("you press... ", "鼠标左键")
  }
}

Window

package main

import (
  "fmt"

  "github.com/go-vgo/robotgo"
)

func main() {
  fpid, err := robotgo.FindIds("Google")
  if err == nil {
    fmt.Println("pids... ", fpid)

    if len(fpid) > 0 {
      robotgo.Type("Hi galaxy!", fpid[0])
      robotgo.KeyTap("a", fpid[0], "cmd")

      robotgo.KeyToggle("a", fpid[0])
      robotgo.KeyToggle("a", fpid[0], "up")

      robotgo.ActivePid(fpid[0])

      robotgo.Kill(fpid[0])
    }
  }

  robotgo.ActiveName("chrome")

  isExist, err := robotgo.PidExists(100)
  if err == nil && isExist {
    fmt.Println("pid exists is", isExist)

    robotgo.Kill(100)
  }

  abool := robotgo.Alert("test", "robotgo")
  if abool {
 	  fmt.Println("ok@@@ ", "ok")
  }

  title := robotgo.GetTitle()
  fmt.Println("title@@@ ", title)
}

作者

计划

  • 将部分 C 代码重构为 Go(例如 x11、windows)
  • 改进多屏幕支持
  • 支持 Wayland
  • 更新窗口句柄
  • 尝试支持 Android 和 iOS

贡献者

许可证

Robotgo 主要根据“Apache 许可证(版本 2.0)”进行分发,其中部分内容受各种类似 BSD 的许可证保护。

详情请参阅 LICENSE-APACHELICENSE

版本历史

v1.0.22026/03/30
v1.0.12026/02/27
v1.0.02025/12/04
v0.110.82025/05/17
v0.110.72025/04/11
v0.110.62025/03/08
v0.110.52024/10/07
v0.110.42024/10/07
v0.110.32024/09/17
v0.110.22024/08/05
v0.110.12024/04/15
v0.110.02023/11/13
v1.0.0-rc2.12023/09/03
v1.0.0-rc22023/09/01
v1.0.0-rc12023/01/24
v1.0.0-beta6.22023/01/15
v1.0.0-beta6.12023/01/12
v1.0.0-beta62022/11/28
v1.0.0-beta5.32022/06/24
v1.0.0-beta5.22022/04/14

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|1周前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|1周前
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

154.3k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

108.3k|★★☆☆☆|3天前
开发框架图像Agent

gemini-cli

gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。

100.8k|★★☆☆☆|4天前
插件Agent图像

markitdown

MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

93.4k|★★☆☆☆|1周前
插件开发框架