在日常开发中,我们经常需要处理图像和GIF,并将它们上传到云存储。在这篇文章中,我将向您展示如何使用Golang以及一些有用的库来实现这个功能,从剪贴板读取图像或GIF并上传到七牛云存储。

本来想用 python 实现, 结果写完发现, 打包后有点大, 就放弃了.正好在看 golang 相关的知识,就用 golang 试了一下, 结果发现代码量并不差很多,但是打包下来后体积小了很多.golang 牛皮

核心功能 robotgo

Robotgo是一个用Go编写的跨平台库,用于自动化GUI和控制键盘、鼠标、剪贴板和屏幕像素。它集成了许多强大的功能,为开发者提供了在Go语言中实现桌面自动化的能力。以下是Robotgo的一些核心特点和功能:

跨平台:Robotgo支持Windows、Mac和Linux,这意味着你可以在多种操作系统上使用相同的代码进行GUI自动化。

  1. 键盘与鼠标控制:

    1. 模拟鼠标移动、点击和滚动.
    2. 模拟键盘输入,支持按键组合。
  2. 屏幕操作:

    1. 获取屏幕尺寸。
    2. 捕获屏幕上的像素颜色。
    3. 捕获屏幕截图。
  3. 剪贴板操作:能够读取和设置剪贴板内容,支持文本、图像等。

  4. 全局事件监听:Robotgo可以监听全局鼠标和键盘事件,这意味着你可以构建自定义的热键或者触发器。

  5. 窗口处理:你可以获取和控制窗口,如激活、移动、调整大小和获取标题。

速度:由于它是用Go编写的,并且在底层使用了C语言的库(如X11和Yara),所以Robotgo的执行速度非常快。

我们会用它来识别热键触发

clipboard 剪切板管理

Clipboard: 跨平台剪贴板库介绍
clipboard 是一个用于Go的跨平台剪贴板库。它提供了对操作系统剪贴板的基本访问,允许开发者从剪贴板读取内容以及将内容设置到剪贴板中。这意味着使用Go编写的应用程序可以与用户的剪贴板直接互动。

核心特点:

  1. 跨平台:clipboard 支持 Windows、Mac 和 Linux,确保你可以在所有主流操作系统上与剪贴板交互。
  2. 简单易用:API 设计得很直观,使得在程序中读取和写入剪贴板变得简单。
  3. 支持多种格式:尽管文本是最常用的格式,但某些剪贴板库也支持其他格式,如图像。

七牛云存储 存储

将图片上传到 七牛云, 接受返回的 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
}

// 为了模拟,我们直接定义一个config。实际情况中,你可以从 config.json 文件中读取它。
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 剪切板