title: 【転載】golang でデスクトップの壁紙を設定する
date: 2021-07-06 11:14:45
comment: false
toc: true
category:
- Golang
tags: - 転載
- Go
- golang
- 設定
- デスクトップ
- 壁紙
この記事は、golang でデスクトップの壁紙を設定する - Go 言語中文网 - Golang 中文社区 & Golang 版 Windows の壁紙を Bing の毎日の背景画像に変更する - Go 言語中文网 - Golang 中文社区から転載されています。
バージョン 1#
golang 言語で書かれた、Windows のデスクトップ壁紙を設定するプログラムで、画像は Bing のウェブサイト(cn.bing.com)から取得します。
github ソースコードのリンク:https://github.com/tujiaw/gowallpaper
興味がある方は Star してください。
コンパイル済みのプログラム:https://pan.baidu.com/s/1l5OW9GeuUF0r5TFaBWkWZg (抽出コード:pcqh)
直接ダブルクリックして実行すると、以下のように表示されます:
Microsoft Bingの壁紙を設定する方法は以下の通りです:
day - 毎日壁紙を更新
now - 当日の壁紙を設定
prev - 前日の壁紙を設定
next - 翌日の壁紙を設定
rand - ランダムに壁紙を切り替え(例:毎分壁紙を切り替える:rand 1m)
quit - 終了
#
golang で Windows API を呼び出す#
package winapi
import (
"log"
"syscall"
"unsafe"
)
var ApiList = map[string][]string {
"user32.dll": {
"MessageBoxW",
"SystemParametersInfoW",
},
"kernel32.dll": {
},
}
var ProcCache map[string]*syscall.Proc
func init() {
ProcCache = make(map[string]*syscall.Proc)
for dllName, apiList := range ApiList {
d, err := syscall.LoadDLL(dllName)
if err != nil {
panic(err)
}
for _, name := range apiList {
api, err := d.FindProc(name)
if err != nil {
log.Println(err, name)
}
ProcCache[name] = api
}
_ = syscall.FreeLibrary(d.Handle)
}
}
func WinCall(name string, a ...uintptr) {
if api, ok := ProcCache[name]; ok {
_, _, err := api.Call(a...)
if err != nil {
log.Println(err)
}
} else {
log.Println("APIが見つかりません, 名前:", name)
}
}
func IntPtr(n int) uintptr {
return uintptr(n)
}
func StrPtr(s string) uintptr {
p, _ := syscall.UTF16PtrFromString(s)
return uintptr(unsafe.Pointer(p))
}
func ShowMessage(title, text string) {
WinCall("MessageBoxW", IntPtr(0), StrPtr(text), StrPtr(title), IntPtr(0))
}
func SetWallpaper(bmpPath string) {
WinCall("SystemParametersInfoW", IntPtr(20), IntPtr(0), StrPtr(bmpPath), IntPtr(3))
}
バージョン 2#
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("Bingの背景画像を取得中...")
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
}
}
私のバージョン#
package main
import (
"bytes"
"crypto/md5"
"encoding/hex"
"errors"
"fmt"
"io/ioutil"
"net/http"
"os"
"path/filepath"
"regexp"
"strings"
"syscall"
"time"
"unsafe"
"github.com/antchfx/htmlquery"
)
func main() {
// fmt.Println("Bingの背景画像を取得中...")
// imageURL, err := GetBingBackgroundImageURL()
// if err != nil {
// fmt.Println("背景画像リンクの取得に失敗しました: " + err.Error())
// return
// }
// fmt.Println("取得成功: " + imageURL)
fmt.Println("画像をダウンロード中...")
imagePath, err := DownloadImage(computerMobilePhoneAdaptiveRandomPicture, &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
}
}
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/"
RandBingImgURL = "https://img.tjit.net/bing/rand/"
// コンピュータとモバイルの自動適応ランダム画像
computerMobilePhoneAdaptiveRandomPicture = "https://img.tjit.net/bing/rand/"
)
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
}
bodyRes, err := ioutil.ReadAll(response.Body)
body := ioutil.NopCloser(bytes.NewReader(bodyRes))
body1 := ioutil.NopCloser(bytes.NewReader(bodyRes))
htmlDoc, err := htmlquery.Parse(body)
if err != nil {
return "", err
}
all, err := ioutil.ReadAll(body1)
s := string(all)
fmt.Println(s)
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
}