Golang版更换windows 壁纸为 bing每日背景图

一玖玖肆 · · 651 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

直接从 bing 搜索主页获取图片链接, 修改链接中的大小, 获取图片, 调用windows的 dll 设置桌面背景图

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
    }
}


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:一玖玖肆

查看原文:Golang版更换windows 壁纸为 bing每日背景图

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

651 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传