我想要写一个程序,每天给桌面壁纸添加一张 xkcd 的漫画。于是我做了以下一系列事情,成功实现了功能。
编写 Python 脚本
使用爬虫获取 xkcd 漫画
xkcd 网站的结构比较简单,只需要在 HTML 中找出 comic 图像链接即可。使用代码如下:
url = 'https://xkcd.com/'
try:
# 使用 requests 库获取网页
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
# 使用 bs4.BeautifulSoup 解析 HTML
soup = BeautifulSoup(r.text, 'lxml')
imgs = soup.find_all('img')
# 在各个图片链接中找到 xkcd 漫画链接
for i in imgs:
src = str(i.get('src'))
if '/comics/' in src:
if src.startswith('//'):
src = 'https:' + src
# 获取并保存漫画图片
imgfile = requests.get(src)
imgfile.raise_for_status()
with open('./resources/xkcd.jpg', 'wb') as f:
f.write(imgfile.content)
f.close()
print('Get xkcd image success')
break
else:
raise Exception(f'No comic found in {url}')
# 出现异常时保存异常信息
except Exception as e:
print('Get xkcd image fail')
with open(f'crash.log', 'a') as f:
# current_date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f'[{current_date}]:', e, file=f)
f.close()
使用 PIL 图像处理库编辑壁纸
也可以用其他的图像处理库,如 OpenCV。
# Open background
wallpaper = Image.open('./resources/background.jpg')
# Open xkcd image
xkcd = Image.open('./resources/xkcd.jpg')
wallpaper_xkcd = xkcd.resize((2 * xkcd.width, 2 * xkcd.height)).convert('RGB')
# 我这里设置将 xkcd 漫画放到壁纸右上角
wallpaper.paste(wallpaper_xkcd, box=(wallpaper.width * 15 // 16 - wallpaper_xkcd.width, wallpaper.height // 16))
# Save to wallpaper
with open('./wallpaper.jpg', 'wb') as f:
wallpaper.save(f)
f.close()
使用 Windows API 更换壁纸
要找到需要的 Windows API 对我来说是一件困难的事情,我这里求助了文心一言。也可以用 ChatGPT。
win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, os.path.join(script_path, 'wallpaper.jpg'))
预览效果如下图,可以看到壁纸右上角添加了一张 xkcd 漫画。
将脚本添加到 Windows 任务
程序设置完成后,要想定时执行,还需要添加到 Windows 任务。
使用 Windows 的搜索功能(快捷键:Windows+Q)找到 “任务计划程序”。点击右侧 “操作” 中的 “创建任务” 进行设置。具体设置方法见参考资料中的 “windows 定时运行 exe 文件”。
设置触发器
一定要设置触发器,否则任务不知道应该在什么时间执行。我设置为每天 23:00 执行。
设置操作时的参数
- 程序或脚本:如果你的系统安装了 python,“程序或脚本” 一栏可以写
python
,也可以写 python.exe 的路径。 - 添加参数:“添加参数” 只需要写脚本的路径。(实际上可以都写到 “程序或脚本” 一栏,系统会自动划分参数)
- 起始于:一定要写,否则程序可能不会正确执行。这个参数设置为脚本的路径。
这样就实现了 Windows 下自动编辑桌面壁纸。
参考资料
- Windows 10 壁纸:如何找到 win10 系统当前使用的壁纸位置(这个方法不是通过 Windows API 实现,已弃用)
- 设置任务:windows 定时运行 exe 文件
- 执行任务时报错:WIN10 设置计划任务执行报(0x1)调用的函数不正确或调用了未知函数
- 文心一言:文心一言