Top Related Projects
Quick Overview
RobotGo is a cross-platform automation library for Go (Golang) that enables desktop automation, system functions, and GUI interactions. It provides a comprehensive set of tools for simulating keyboard and mouse events, capturing screenshots, and performing various system-level operations across multiple operating systems.
Pros
- Cross-platform compatibility (Windows, macOS, Linux)
- Extensive feature set for desktop automation and system interaction
- Active development and community support
- Well-documented API with numerous examples
Cons
- Potential security risks if misused
- May require additional setup for some features on certain platforms
- Performance can be impacted when executing complex automation tasks
- Learning curve for users new to desktop automation concepts
Code Examples
- Simulating mouse clicks:
package main
import "github.com/go-vgo/robotgo"
func main() {
robotgo.Click()
robotgo.Click("right", false)
robotgo.Click("left", true, 100, 200)
}
- Capturing a screenshot:
package main
import "github.com/go-vgo/robotgo"
func main() {
bitmap := robotgo.CaptureScreen()
robotgo.SaveBitmap(bitmap, "screenshot.png")
}
- Simulating keyboard input:
package main
import "github.com/go-vgo/robotgo"
func main() {
robotgo.TypeStr("Hello, RobotGo!")
robotgo.KeyTap("enter")
}
Getting Started
To start using RobotGo, follow these steps:
- Install Go on your system if you haven't already.
- Install RobotGo using the following command:
go get github.com/go-vgo/robotgo - Import RobotGo in your Go code:
import "github.com/go-vgo/robotgo" - Start using RobotGo functions in your code, for example:
robotgo.MoveMouse(100, 200) robotgo.Click()
Note: Some features may require additional setup or dependencies depending on your operating system. Refer to the official documentation for platform-specific instructions.
Competitor Comparisons
Node.js Desktop Automation.
Pros of RobotJS
- Written in JavaScript, making it more accessible for web developers
- Simpler API with fewer functions, easier to learn and use
- Better documentation and examples for beginners
Cons of RobotJS
- Limited to Node.js environment, less versatile than RobotGo
- Fewer features and capabilities compared to RobotGo's extensive toolkit
- Less active development and community support
Code Comparison
RobotJS:
const robot = require('robotjs');
// Move the mouse to 100, 100
robot.moveMouse(100, 100);
// Click the mouse
robot.mouseClick();
RobotGo:
package main
import "github.com/go-vgo/robotgo"
func main() {
robotgo.MoveMouse(100, 100)
robotgo.Click()
}
Both libraries offer similar basic functionality for mouse control, but RobotGo provides more advanced features and cross-platform support. RobotJS is more straightforward for JavaScript developers, while RobotGo offers greater flexibility and a wider range of automation capabilities across different programming environments.
A Chrome DevTools Protocol driver for web automation and scraping.
Pros of Rod
- Focuses on web automation and browser control, offering more specialized features for web scraping and testing
- Provides a high-level API for browser manipulation, making it easier to automate complex web interactions
- Supports multiple browsers (Chrome, Firefox, Edge) and offers cross-platform compatibility
Cons of Rod
- Limited to web-based automation, lacking system-wide interaction capabilities
- May have a steeper learning curve for users unfamiliar with browser automation concepts
- Potentially slower execution for simple tasks compared to native system interactions
Code Comparison
Rod (web automation):
page := rod.New().MustConnect().MustPage("https://example.com")
page.MustElement("#search-input").MustInput("query")
page.MustElement("#submit-button").MustClick()
RobotGo (system automation):
robotgo.TypeStr("query")
robotgo.KeyTap("enter")
robotgo.MoveMouse(100, 200)
robotgo.Click()
Summary
Rod excels in web automation tasks, offering a robust API for browser control across multiple platforms. It's ideal for web scraping, testing, and complex web interactions. However, it's limited to web-based tasks and may have a steeper learning curve.
RobotGo provides system-wide automation capabilities, allowing for native interactions with the operating system and applications. It's more versatile for general automation tasks but may lack the specialized web automation features of Rod.
Choose Rod for web-specific automation and RobotGo for system-wide or desktop application automation tasks.
A faster, simpler way to drive browsers supporting the Chrome DevTools Protocol.
Pros of chromedp
- Specifically designed for web automation and browser control
- Provides a high-level API for interacting with web pages
- Supports headless browsing, which can be faster and more resource-efficient
Cons of chromedp
- Limited to web-based automation tasks
- Requires Chrome or Chromium to be installed
- May have a steeper learning curve for non-web-specific tasks
Code Comparison
chromedp example:
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
var example string
err := chromedp.Run(ctx,
chromedp.Navigate("https://example.com"),
chromedp.Text("#main-content", &example),
)
RobotGo example:
robotgo.TypeStr("Hello, World!")
robotgo.MoveMouse(100, 200)
robotgo.Click()
Key Differences
- RobotGo is a general-purpose automation tool for system-wide tasks
- chromedp focuses on web automation and browser control
- RobotGo can interact with desktop applications and perform system-level actions
- chromedp is better suited for web scraping, testing, and browser-based tasks
Use Cases
- Choose RobotGo for cross-platform desktop automation, screen capture, and global keyboard/mouse control
- Opt for chromedp when working with web applications, running browser-based tests, or performing web scraping tasks
Selenium/Webdriver client for Go
Pros of Selenium
- Widely adopted and well-established in the web automation industry
- Supports multiple programming languages, not limited to Go
- Extensive documentation and large community support
Cons of Selenium
- Primarily focused on web browser automation, limiting its use for general system automation
- Can be slower compared to native automation tools due to browser overhead
- Requires a web driver to be installed and managed separately
Code Comparison
Selenium (Go bindings):
driver, _ := selenium.NewRemote(caps, "")
driver.Get("https://example.com")
element, _ := driver.FindElement(selenium.ByCSSSelector, "#button")
element.Click()
RobotGo:
robotgo.TypeStr("Hello, World!")
robotgo.Click()
robotgo.MoveMouse(100, 200)
robotgo.KeyTap("enter")
Key Differences
- Selenium focuses on web automation, while RobotGo is designed for system-wide automation
- RobotGo provides native OS-level interactions, whereas Selenium operates within a browser context
- Selenium offers cross-browser testing capabilities, while RobotGo excels in desktop automation tasks
Use Cases
- Choose Selenium for web application testing and browser-based automation
- Opt for RobotGo when requiring system-wide automation, including mouse and keyboard control outside of browsers
Convert
designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
Robotgo
Golang Desktop Automation. Control the mouse, keyboard, read the screen, process, Window Handle, image and bitmap and global event listener.
RobotGo supports Mac, Windows, and Linux(X11); and robotgo supports arm64 and x86-amd64.
Contents
- Docs
- Binding
- Requirements
- Installation
- Update
- Examples
- Type Conversion and keys
- Cross-Compiling
- Authors
- Plans
- Donate
- Contributors
- License
Docs
Binding:
ADB, packaging android adb API.
Robotn, binding JavaScript and other, support more language.
Requirements:
Now, Please make sure Golang, GCC is installed correctly before installing RobotGo.
ALL:
Golang
GCC
For MacOS:
Xcode Command Line Tools (And Privacy setting: #277)
xcode-select --install
For Windows:
MinGW-w64 (Use recommended) or others Mingw llvm-mingw;
Download the Mingw, then set system environment variables C:\mingw64\bin to the Path.
Set environment variables to run GCC from command line.
Or the other GCC (But you should compile the "libpng" with yourself when use the bitmap.)
For everything else:
GCC
X11 with the XTest extension (the Xtst library)
"Clipboard": xsel xclip
"Bitmap": libpng (Just used by the "bitmap".)
"Event-Gohook": xcb, xkb, libxkbcommon (Just used by the "hook".)
Ubuntu:
# gcc
sudo apt install gcc libc6-dev
# x11
sudo apt install libx11-dev xorg-dev libxtst-dev
# Clipboard
sudo apt install xsel xclip
#
# Bitmap
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
# Clipboard
sudo dnf install xsel xclip
#
# Bitmap
sudo dnf install libpng-devel
# GoHook
sudo dnf install libxkbcommon-devel libxkbcommon-x11-devel xorg-x11-xkb-utils-devel
Installation:
With Go module support (Go 1.11+), just import:
import "github.com/go-vgo/robotgo"
Otherwise, to install the robotgo package, run the command:
go get github.com/go-vgo/robotgo
png.h: No such file or directory? Please see issues/47.
Update:
go get -u github.com/go-vgo/robotgo
Note go1.10.x C file compilation cache problem, golang #24355.
go mod vendor problem, golang #26366.
Examples:
Mouse
package main
import (
"github.com/go-vgo/robotgo"
)
func main() {
robotgo.MouseSleep = 100
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")
}
Keyboard
package main
import (
"fmt"
"github.com/go-vgo/robotgo"
)
func main() {
robotgo.TypeStr("Hello World")
robotgo.TypeStr("ã ãããã", 0, 1)
// robotgo.TypeStr("ãã¹ããã")
robotgo.TypeStr("Hi, Seattle space needle, Golden gate bridge, One world trade center.")
robotgo.TypeStr("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.TypeStr("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)
}
}
Screen
package main
import (
"fmt"
"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("get screen size: ", 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")
}
}
Bitmap
package main
import (
"fmt"
"github.com/go-vgo/robotgo"
"github.com/vcaesar/bitmap"
)
func main() {
bit := robotgo.CaptureScreen(10, 20, 30, 40)
// use `defer robotgo.FreeBitmap(bit)` to free the bitmap
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) // use find template and 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("--- Please press ctrl + shift + q to stop hook ---")
hook.Register(hook.KeyDown, []string{"q", "ctrl", "shift"}, func(e hook.Event) {
fmt.Println("ctrl-shift-q")
hook.End()
})
fmt.Println("--- Please press 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... ", "mouse left button")
}
}
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.TypeStr("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)
}
Authors
Plans
- Refactor some C code to Go (such as x11, windows)
- Better multiscreen support
- Wayland support
- Update Window Handle
- Try to support Android and IOS
Contributors
- See contributors page for full list of contributors.
- See Contribution Guidelines.
License
Robotgo is primarily distributed under the terms of "both the MIT license and the Apache License (Version 2.0)", with portions covered by various BSD-like licenses.
See LICENSE-APACHE, LICENSE-MIT.
Top Related Projects
Convert
designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot