在日常开发中,我们经常需要处理图像和GIF,并将它们上传到云存储。在这篇文章中,我将向您展示如何使用Golang以及一些有用的库来实现这个功能,从剪贴板读取图像或GIF并上传到七牛云存储。
本来想用 python 实现, 结果写完发现, 打包后有点大, 就放弃了.正好在看 golang 相关的知识,就用 golang 试了一下, 结果发现代码量并不差很多,但是打包下来后体积小了很多.golang 牛皮
Robotgo是一个用Go编写的跨平台库,用于自动化GUI和控制键盘、鼠标、剪贴板和屏幕像素。它集成了许多强大的功能,为开发者提供了在Go语言中实现桌面自动化的能力。以下是Robotgo的一些核心特点和功能:
跨平台:Robotgo支持Windows、Mac和Linux,这意味着你可以在多种操作系统上使用相同的代码进行GUI自动化。
键盘与鼠标控制:
- 模拟鼠标移动、点击和滚动.
- 模拟键盘输入,支持按键组合。
屏幕操作:
- 获取屏幕尺寸。
- 捕获屏幕上的像素颜色。
- 捕获屏幕截图。
剪贴板操作:能够读取和设置剪贴板内容,支持文本、图像等。
全局事件监听:Robotgo可以监听全局鼠标和键盘事件,这意味着你可以构建自定义的热键或者触发器。
窗口处理:你可以获取和控制窗口,如激活、移动、调整大小和获取标题。
速度:由于它是用Go编写的,并且在底层使用了C语言的库(如X11和Yara),所以Robotgo的执行速度非常快。
我们会用它来识别热键触发
Clipboard: 跨平台剪贴板库介绍
clipboard 是一个用于Go的跨平台剪贴板库。它提供了对操作系统剪贴板的基本访问,允许开发者从剪贴板读取内容以及将内容设置到剪贴板中。这意味着使用Go编写的应用程序可以与用户的剪贴板直接互动。
核心特点:
- 跨平台:clipboard 支持 Windows、Mac 和 Linux,确保你可以在所有主流操作系统上与剪贴板交互。
- 简单易用:API 设计得很直观,使得在程序中读取和写入剪贴板变得简单。
- 支持多种格式:尽管文本是最常用的格式,但某些剪贴板库也支持其他格式,如图像。
七牛云存储 存储
将图片上传到 七牛云, 接受返回的 url;
下面我们来看代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| package main
import ( "context" "fmt" "github.com/go-vgo/robotgo" "github.com/qiniu/go-sdk/v7/auth/qbox" "github.com/qiniu/go-sdk/v7/sms/bytes" "github.com/qiniu/go-sdk/v7/storage" hook "github.com/robotn/gohook" "golang.design/x/clipboard" "strconv" "strings" "time" )
type Config struct { AccessKey string SecretKey string HostURL string Bucket string }
var config = Config{ AccessKey: "", SecretKey: "", HostURL: "", Bucket: "", } var gifAddr = "/Users/su/Movies/Kaptures/" func main() { hotKeyClick() }
func readClipboardContent(format clipboard.Format) string { data := clipboard.Read(format) return string(data) }
func hotKeyClick() { robotgo.EventHook(hook.KeyDown, []string{"u", "command"}, func(event hook.Event) { data := readClipboardContent(clipboard.FmtImage) uploadContent([]byte(data), "png") }) robotgo.EventHook(hook.KeyDown, []string{"t", "command"}, func(event hook.Event) { gifName := readClipboardContent(clipboard.FmtText) if strings.HasSuffix(gifName, ".gif") { localFile := gifAddr + gifName uploadContent([]byte(localFile), "gif") } }) s := robotgo.EventStart() <-robotgo.EventProcess(s) }
func uploadContent(content []byte, fileType string) { var ( accessKey = config.AccessKey secretKey = config.SecretKey bucket = config.Bucket hostname = config.HostURL uploadFileName = strconv.FormatInt(time.Now().Unix(), 10) + "." + fileType )
putPolicy := storage.PutPolicy{ Scope: bucket, } mac := qbox.NewMac(accessKey, secretKey) uploadToken := putPolicy.UploadToken(mac) cfg := storage.Config{ Zone: &storage.ZoneHuadong, UseHTTPS: true, UseCdnDomains: false, }
formUploader := storage.NewFormUploader(&cfg) ret := storage.PutRet{}
var err error if fileType == "gif" { err = formUploader.PutFile(context.Background(), &ret, uploadToken, uploadFileName, string(content), &storage.PutExtra{}) } else { dataLen := int64(len(content)) err = formUploader.Put(context.Background(), &ret, uploadToken, uploadFileName, bytes.NewReader(content), dataLen, &storage.PutExtra{}) }
if err != nil { fmt.Println(err) return }
fmt.Println(ret.Key, ret.Hash) fileURL := hostname + ret.Key markdownStr := "![" + uploadFileName + "](" + fileURL + ")" clipboard.Write(clipboard.FmtText, []byte(markdownStr)) }
|
相关代码你可以在这里看到:go 剪切板