给桌面换上bing壁纸 S-Wallpaper

给桌面换上bing壁纸 S-Wallpaper

bing的每日壁纸都很好看,很多时候就想把它下载下来,保存、设置为自己的电脑桌面壁纸。

网上有类似功能的软件不少,不过自己实际做一个还是很有趣味的!

服务器端是通过php实现的,下面会给出代码,可以自行部署在服务器上然后实现多端保存。

服务器端

作用

服务器端的文件名称为bing.php。其作用不难理解,就是解析bing.com的背景图片然后保存到服务器,并且直接给请求端返回为.jpg图片。

目前解析的bing.com壁纸分辨率为1080P

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
<?php
error_reporting(0);
// 保存文件的文件夹名称
$path=date('Ym');
if (!file_exists($path)) {
mkdir($path, 0777);
}
$last = strtotime("-1 month", time());
$last_month = date("Ym", $last); //上个月
// 删除上个月保存的图片,可以自行调整(防止服务器硬盘空间被占用满)
if (file_exists($last_month)) {
deleteDir($last_month);
}
// 保存图片的文件名
$pathurl = $path.'/'.date('d').'.jpg';
if (!is_file($pathurl)) {
// 对bing.com进行请求
// 中国区的bing壁纸更新可能有时差
$str = file_get_contents('https://cn.bing.com/HPImageArchive.aspx?idx=0&n=1');
// 对请求的内容进行正则匹配
if (preg_match("/<urlBase>(.+?)<\/urlBase>/ies", $str, $matches)) {
// 生成bing.com图片的实际地址
$imgurl = 'https://cn.bing.com'.$matches[1].'_1920x1080.jpg';
// 拷贝(下载)图片到本地
copy($imgurl, $pathurl);
} else {
// 如果请求、匹配失败,则防护一张预设静态图片,防止请求端得不到数据
$static_file = 'https://example.com/unamed.jpg';
copy($static_file, $pathurl);
}
}
if ($pathurl) {
// 向请求端直接返回本图片
header('Content-Type: image/jpeg');
header("Cache-Control: no-store, no-cache, must-revalidate"); //强制不缓存
header("Pragma: no-cache"); //禁止本页被缓存
@ob_end_clean();
@readfile($pathurl);
@flush();
@ob_flush();
exit();
} else {
exit('error');
}

function deleteDir($path_e) {
if (is_dir($path_e)) {
//扫描一个目录内的所有目录和文件并返回数组
$dirs = scandir($path_e);
foreach ($dirs as $dir) {
//排除目录中的当前目录(.)和上一级目录(..)
if ($dir != '.' && $dir != '..') {
//如果是目录则递归子目录,继续操作
$sonDir = $path_e.'/'.$dir;
if (is_dir($sonDir)) {
//递归删除
deleteDir($sonDir);
//目录内的子目录和文件删除后删除空目录
@rmdir($sonDir);
} else {
//如果是文件直接删除
@unlink($sonDir);
}
}
}
@rmdir($path_e);
}
}
?>

Python 主程序

作用

下载服务器端的图片文件,并转码为bmp格式,给Windows系统设置为壁纸。

对于其他系统可以自行研究相关代码

提示

一下实例程序为了更加直观的人机交互,设置了很多提示语句,如果想做成无窗口的程序可删除提示语句。

需求依赖

pyinstaller为打包Python程序所用,直接运行python main.py可以不安装此依赖包

1
2
3
4
requests
pywin32
Pillow
pyinstaller

main.py

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
# -*- coding:utf-8 -*-
# Author: Steven Yan

import time, os
import requests
import win32api, win32gui, win32con
from PIL import Image


tempDir = ""


def getUrl():
# month0 = time.strftime("%Y%m",time.localtime())
# today0 = time.strftime("%d",time.localtime())
# myUrl = "https://example.com/home/"+month0+"/"+today0+".jpg"
myUrl = "http://example.com/home/bing.php"
return myUrl

def downloadPic(picUrl):
print("Downloading picture...\n")
try:
req = requests.get(picUrl)
with open("DONT-MOVE-S-Wallpaper-Pic.jpg","wb") as ccc:
ccc.write(req.content)
print("Picture saved at: {}\n".format(tempDir + "\\DONT-MOVE-S-Wallpaper-Pic.jpg"))
except:
print("Can't download Picture!\n")
print("Check your Internet access and try again.")
goodBye()

def moveFile(file,des):
if not os.path.isfile(file):
print(file + " is not exist.")
print("DON'T MOVE or DELETE picture file!!!")
goodBye()
else:
if not os.path.exists(des):
os.makedirs(des)
else:
os.system("move /y "+file+" "+des)

def convPic(jpg,bmp):
try:
img = Image.open(jpg)
img.save(bmp, 'BMP')
except:
print("Can't convert picture.")
goodBye()
return
os.remove(jpg)
print("The picture has been converted successfully.")

def setWallpaper(picUri):
key = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER, "Control Panel\\Desktop", 0, win32con.KEY_SET_VALUE)
win32api.RegSetValueEx(key, "WallpaperStyle", 0, win32con.REG_SZ, "10")
win32api.RegSetValueEx(key, "TileWallpaper", 0, win32con.REG_SZ, "0")
win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, picUri, 1+2)
print("\n --> TODAY Wallpaper has been set!!!")

def printMe():
print("##########################################################")
print("## Website: RyzenX.com ##")
print("## By Steven Yan ##")
print("##########################################################")

def goodBye():
print("\n Good Bye! Program will exit soon!\n")
for i in range(3):
print("-> %s" % str(3-i))
time.sleep(1)
exit(0)

if __name__ == "__main__":
if not os.name == "nt":
print("This Program only supports Windows")
exit(1)
else:
os.system("mode con cols=60 lines=30")
os.system("color 0e")
os.system("title Daily Wallpaper from Bing.com")
printMe()
print("\nNow: %s \n" % time.ctime())
tempDir = os.getenv('TEMP')
print("Your TEMP dir is: " + tempDir + "\n")
downloadPic(getUrl())
moveFile("DONT-MOVE-S-Wallpaper-Pic.jpg",tempDir)
convPic(tempDir + "\\DONT-MOVE-S-Wallpaper-Pic.jpg", tempDir + "\\DONT-MOVE-S-Wallpaper-Pic.bmp")
time.sleep(1)
setWallpaper(tempDir + "\\DONT-MOVE-S-Wallpaper-Pic.bmp")
goodBye()

辅助程序

Windows启动工具命令行批处理

为了更好、更优雅地设置Windows开机自运行、右键运行、定时运行主程序,特别编写了这个批处理工具集。

实现的功能有:

  • 写入注册表,开机启动
  • 添加程序到Windows计划任务
  • 设置为桌面右键菜单项

start.bat

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
@echo off
title Program Starter
%1 %2
ver|find "5." > nul && goto :main
mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :main","","runas",1)(window.close) & goto :eof
:main
cls
mode con cols=60 lines=20
color 06
echo ##########################################################
echo ## You can just drag your file into here ##
echo ## ##
echo ## Website: RyzenX.com ##
echo ## By Steven ##
echo ##########################################################
pause
:ch
echo ##########################################################
echo ## 1, Add the Program to `Run` Registry ##
echo ## 2, Add the program to scheduled task ##
echo ## 3, Add the program to Desktop Right-Click *Good ##
echo ##########################################################
echo.
echo Pleas enter your choice
set /p a= :
set /p src= Enter the Program path:
set /p name= Enter the Key Name (Important):
if %a%==1 goto addReg
if %a%==2 goto addSchtask
if %a%==3 goto rc
echo Not good. & pause & goto ch
:addReg
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v %name% /d %src% /f
pause&goto main
:addSchtask
echo.
echo CAUTION: Time formatted like this: 10:10:00
set /p ttt= What time do you want to change your Wallpaper:
schtasks /create /tn %name% /ru system /tr %src% /sc DAILY /st %ttt%
pause&goto main
:rc
echo.
echo Right-Click at desktop, you can click "%name%" to change your wallpaper manually.
echo.
pause
reg add "HKEY_CLASSES_ROOT\Directory\Background\shell\%name%" /f
reg add "HKEY_CLASSES_ROOT\Directory\Background\shell\%name%\command" /f
reg add "HKEY_CLASSES_ROOT\Directory\Background\shell\%name%\command" /ve /d "%src%" /f
pause&goto main

欢迎使用!

Steven-nagisa-Y/S-Wallpaper (github.com)

打赏
  • 版权声明: 本博客采用 Apache License 2.0 许可协议。
    转载请注明出处: https://ryzenx.com/2021/06/S-Wallpaper/

请我喝杯咖啡吧~

支付宝
微信