我想要寫一個程式,每天給桌面壁紙添加一張 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('獲取 xkcd 漫畫成功')
break
else:
raise Exception(f'在 {url} 中未找到漫畫')
# 出現異常時保存異常信息
except Exception as e:
print('獲取 xkcd 漫畫失敗')
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。
# 打開背景
wallpaper = Image.open('./resources/background.jpg')
# 打開 xkcd 漫畫
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))
# 保存壁紙
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)調用的函數不正確或調用了未知函數
- 文心一言:文心一言