Golang版更换windows壁纸
发布时间:2023-04-07, 14:15:02 分类:Go | 编辑 off 网址 | 辅助
正文 4275字数 96,322阅读
package main
import (
"crypto/md5"
"encoding/hex"
"errors"
"fmt"
"github.com/antchfx/htmlquery"
"io/ioutil"
"net/http"
"os"
"path/filepath"
"regexp"
"strings"
"syscall"
"time"
"unsafe"
)
const (
UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
BingHomeURL = "https://cn.bing.com"
CurrentPathDir = "cache/"
)
const (
Size1k string = "1920,1080"
Size2k string = "2560,1440"
Size4k string = "3840,2160"
)
// ImageSize 图片大小
type ImageSize struct {
w string
h string
}
func init() {
_ = os.Mkdir(CurrentPathDir, 0755)
}
// EncodeMD5 MD5编码
func EncodeMD5(value string) string {
m := md5.New()
m.Write([]byte(value))
return hex.EncodeToString(m.Sum(nil))
}
// SetWindowsWallpaper 设置windows壁纸
func SetWindowsWallpaper(imagePath string) error {
dll := syscall.NewLazyDLL("user32.dll")
proc := dll.NewProc("SystemParametersInfoW")
_t, _ := syscall.UTF16PtrFromString(imagePath)
ret, _, _ := proc.Call(20, 1, uintptr(unsafe.Pointer(_t)), 0x1|0x2)
if ret != 1 {
return errors.New("系统调用失败")
}
return nil
}
// GetBingBackgroundImageURL 获取bing主页的背景图片链接
func GetBingBackgroundImageURL() (string, error) {
client := http.Client{}
request, err := http.NewRequest("GET", BingHomeURL, nil)
if err != nil {
return "", err
}
request.Header.Set("user-agent", UserAgent)
response, err := client.Do(request)
if err != nil {
return "", err
}
htmlDoc, err := htmlquery.Parse(response.Body)
if err != nil {
return "", err
}
item := htmlquery.FindOne(htmlDoc, "//div[@id=\"bgImgProgLoad\"]")
result := htmlquery.SelectAttr(item, "data-ultra-definition-src")
return BingHomeURL + result, nil
}
// DownloadImage 下载图片,保存并返回保存的文件名的绝对路径
func DownloadImage(imageURL string, size *ImageSize) (string, error) {
wRegexp := regexp.MustCompile("w=\\d+")
hRegexp := regexp.MustCompile("h=\\d+")
imageURL = wRegexp.ReplaceAllString(imageURL, "w="+size.w)
imageURL = hRegexp.ReplaceAllString(imageURL, "h="+size.h)
client := http.Client{}
request, err := http.NewRequest("GET", imageURL, nil)
if err != nil {
return "", err
}
response, err := client.Do(request)
if err != nil {
return "", err
}
body, err := ioutil.ReadAll(response.Body)
if err != nil {
return "", err
}
day := time.Now().Format("2006-01-02")
fileName := EncodeMD5(imageURL)
path := CurrentPathDir + fmt.Sprintf("[%sx%s][%s]%s", size.w, size.h, day, fileName) + ".jpg"
err = ioutil.WriteFile(path, body, 0755)
if err != nil {
return "", err
}
absPath, err := filepath.Abs(path)
if err != nil {
return "", err
}
return absPath, nil
}
func main() {
fmt.Println("获取必应背景图中...")
imageURL, err := GetBingBackgroundImageURL()
if err != nil {
fmt.Println("获取背景图片链接失败: " + err.Error())
return
}
fmt.Println("获取成功: " + imageURL)
fmt.Println("下载图片...")
imagePath, err := DownloadImage(imageURL, &ImageSize{
w: strings.Split(Size4k, ",")[0],
h: strings.Split(Size4k, ",")[1],
})
if err != nil {
fmt.Println("下载图片失败: " + err.Error())
return
}
fmt.Println("设置桌面...")
err = SetWindowsWallpaper(imagePath)
if err != nil {
fmt.Println("设置桌面背景失败: " + err.Error())
return
}
}
Run code
Cut to clipboard
(支付宝)给作者钱财以资鼓励 (微信)→
有过 7 条评论 »
go mod init 新模块名字
go get -u github.com/gin-gonic/gin
package main import ( "github.com/labstack/echo" "net/http" ) func HandleWelcome() func(c echo.Context) error { return func(c echo.Context) error { res := c.Response() w := res.Writer r := c.Request() http.Redirect(w, r, "http://www.baidu.com", http.StatusFound) //跳转到百度 return nil } } func main() { e := echo.New() e.GET("/", HandleWelcome()) e.Logger.Fatal(e.Start(":1323")) }
package main // 打开系统默认浏览器 import ( "fmt" "os/exec" "runtime" ) var commands = map[string]string{ "windows": "start", "darwin": "open", "linux": "xdg-open", } func Open(uri string) error { run, ok := commands[runtime.GOOS] if !ok { return fmt.Errorf("don't know how to open things on %s platform", runtime.GOOS) } cmd := exec.Command(run, uri) return cmd.Start() } func main() { Open("http://baidu.com") }
now:= time.Now() fmt.Println(now.Unix()) // 1565084298 秒 fmt.Println(now.UnixNano()) // 1565084298178502600 纳秒 fmt.Println(now.UnixNano() / 1e6) // 1565084298178 毫秒
now := time.Now() // 方法一: beginningOfDay := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location()) log.Println("今日已过(纳秒):", now.UnixNano()-beginningOfDay.UnixNano()) log.Println("今日已过(微秒):", now.UnixMicro()-beginningOfDay.UnixMicro()) log.Println("今日已过(毫秒):", now.UnixMilli()-beginningOfDay.UnixMilli()) log.Println("今日已过(秒):", now.Unix()-beginningOfDay.Unix()) // 方法二: passedTimeNs := now.UnixNano() - beginningOfDay.UnixNano() log.Println("今日已过(纳秒):", passedTimeNs) log.Println("今日已过(微秒):", passedTimeNs/1e3) log.Println("今日已过(毫秒):", passedTimeNs/1e6) log.Println("今日已过(秒):", passedTimeNs/1e9)
func onReady() { systray.SetIcon(icoData) systray.SetTitle("HTTP Server") systray.SetTooltip("服务已最小化右下角, 右键点击打开菜单!") mShow := systray.AddMenuItem("显示", "显示窗口") mHide := systray.AddMenuItem("隐藏", "隐藏窗口") systray.AddSeparator() mQuit := systray.AddMenuItem("退出", "退出程序") go func() { for { select { case <-mShow.ClickedCh: mShow.Disable() mHide.Enable() ShowConsole() case <-mHide.ClickedCh: mHide.Disable() mShow.Enable() HideConsole() case <-mQuit.ClickedCh: systray.Quit() } } }() } func onExit() { os.Exit(0) }
_, err = os.StartProcess("test.exe", nil, &os.ProcAttr{Files: []*os.File{os.Stdin, os.Stdout, os.Stderr}})
使用开源库
github.com/sparrc/go-ping
func ServerPing(target string) bool { pinger, err := ping.NewPinger(target) if err != nil { panic(err) } pinger.Count = ICMPCOUNT pinger.Timeout = time.Duration(PINGTIME*time.Millisecond) pinger.SetPrivileged(true) pinger.Run()// blocks until finished stats := pinger.Statistics() fmt.Println(stats) // 有回包,就是说明IP是可用的 if stats.PacketsRecv >= 1 { return true } return false }
这里是通过回包数量来判断的
也可以通过掉包率来判断
同时,该库提供了Statistics结构体,包含了详细的ICMP信息