Python实现桌面壁纸设置

思路

1、通过bing每日壁纸接口,获取图片地址

2、保存图片到绝对路径

3、设置该图片为壁纸

4、批处理壁纸自动切换

第一、获取图片地址

微软bing每日壁纸API接口

https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN

每次最多能取8张,只能取最近的16张图片

返回结果:

{
• images: 
[
• { 
    
• startdate: "20211030",
• fullstartdate: "202110301600",
• enddate: "20211031",
• url: "/th?id=OHR.YorkMinster_ZH-CN3129176050_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp",
• urlbase: "/th?id=OHR.YorkMinster_ZH-CN3129176050",
• copyright: "约克大教堂墙上的怪诞雕塑,英格兰北约克郡 (© John Potter/Alamy)",
• copyrightlink: "约克大教堂 - 国内版 Bing",
• title: "",
• quiz: "/search?q=Bing+homepage+quiz&filters=WQOskey:%22HPQuiz_20211030_YorkMinster%22&FORM=HPQUIZ",
• wp: true,
• hsh: "e0a38f154f5c47fe4ace4f46f9848db4",
• drk: 1,
• top: 1,
• bot: 1,
• hs: [ ]
}
],
• tooltips: 
{
• loading: "正在加载...",
• previous: "上一个图像",
• next: "下一个图像",
• walle: "此图片不能下载用作壁纸。",
• walls: "下载今日美图。仅限用作桌面壁纸。"
}
}
# 请求网页,跳转到最终 img 地址
def get_img_url():
         idx = random.randint(1,16)
    url = "https://cn.bing.com/HPImageArchive.aspx?format=js&idx={}&n=1&mkt=zh-CN".format(idx)
    r = requests.get(url)
    img_url = "https://cn.bing.com" + r.json()['images'][0]['url'] # 得到图片文件的网址
    print('img_url:', img_url)
    return img_url

第二、保存图片到本地

Win10桌面壁纸路径:

C:\Windows\Web\Wallpaper

在这个目录下我们创建一个mypaper子目录,用来保存子目录

这个函数的作用就是把图片保存到你自己设置的一个目录下,并返回当前目录的绝对地址。

def save_img(img_url):
     # 保存图片到磁盘文件夹dirname中
     try:
         paperdir = "C:/Windows/Web/Wallpaper/mypaper"
         if not os.path.exists(paperdir):
             os.makedirs(paperdir)
         filename = img_url.split("&")[0].split("id=")[1]
         filepath = os.path.join(paperdir, filename)
         # 图片下载,并保存到文件夹中
         urllib.request.urlretrieve(img_url, filepath)
     except IOError as e:
         print('文件操作失败', e)
     except Exception as e:
         print('错误 :', e)
         print("Save", filepath, "successfully!")
     return filepath

第三、设置该图片为壁纸

ctypes 是 Python 的外部函数库。它提供了与 C 兼容的数据类型,并允许调用 DLL 或共享库中的函数。这里利用cypes调用SystemParametersInfo函数来设置桌面的墙纸

函数 SystemParametersInfo 

SystemParametersInfo函数可以获取和设置数量众多的windows系统参数。

函数 SystemParametersInfo 声明如下:

WINUSERAPI
BOOL
WINAPI
SystemParametersInfoA(
    __in UINT uAction,
    __in UINT uParam,
    __inout_opt PVOID pvParam,
    __in UINT fuWinIni);
WINUSERAPI
BOOL
WINAPI
SystemParametersInfoW(
    __in UINT uAction,
    __in UINT uParam,
    __inout_opt PVOID pvParam,
    __in UINT fuWinIni);
#ifdef UNICODE
#define SystemParametersInfo SystemParametersInfoW
#else
#define SystemParametersInfo SystemParametersInfoA
#endif // !UNICODE

各参数的意义如下:

uAction Long,指定要设置的参数。参考uAction常数表

uParam Long,参考uAction常数表

lpvParam Any,按引用调用的Integer、Long和数据结构。

fuWinIni 这个参数规定了在设置系统参数的时候,是否应更新用户设置参数

uAction参数使用方法:

6    设置视窗的大小,SystemParametersInfo(6, 放大缩小值, P, 0),lpvParam为long型

17    开关屏保程序,SystemParametersInfo(17, False, P, 1),uParam为布尔型

13,24    改变桌面图标水平和垂直间距,uParam为间距值(像素),lpvParam为long型

15    设置屏保等待时间,SystemParametersInfo(15, 秒数, P, 1),lpvParam为long型

20    设置桌面背景墙纸,SystemParametersInfo(20, True, 图片路径, 1)

93    开关鼠标轨迹,SystemParametersInfo(93, 数值, P, 1),uParam为False则关闭

97    开关Ctrl+Alt+Del窗口,SystemParametersInfo(97, False, A, 0),uParam为布尔型

通过之前获得的图片所在的绝对路径,把该图片设置为桌面壁纸。

def set_img_as_wallpaper(filepath):

ctypes.windll.user32.SystemParametersInfoW(20, 0, filepath, 0)

第五、批处理自动更换壁纸

此时,可以在python脚本的同一目录下创建名为py_bingying.bat的批处理文件,批处理内容如下:

@echo off

python SetBingImgAsWallpaper.py

创建快捷方式

这里采用开机运行批处理程序实现壁纸的自动切换。

复制快捷方式到下方目录下:

C:\User\yourname\AppData\Roaming\Microsoft\Windows\开始菜单\程序\启动