首页  编辑  

自动更新必应Bing壁纸的脚本

Tags: /Python/   Date Created:
首先运行
pip install pypiwin32

保存下面代码为 .py 文件,运行即可。
  1. # coding: utf-8
  2. import requests
  3. import time
  4. import os
  5. import random
  6. # 添加请求头
  7. g_headers = {
  8.     'User-Agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
  9.                   '(KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36',
  10. }
  11. def get_bing_image_urls(num):
  12.     """
  13.     从cn.bing.com下载每日的桌面壁纸
  14.     :param num: 最多获取壁纸数
  15.     :return: 返回获取的壁纸地址列表
  16.     """
  17.     # start_url = 'https://cn.bing.com/HPImageArchive.aspx?format=js&idx={}&n=1&nc=1622612516247&pid=hp'
  18.     start_url = 'https://cn.bing.com/HPImageArchive.aspx?format=js&idx={}&n=1'
  19.     imgs = []
  20.     page = 1
  21.     while len(imgs) < num and page < num*2:
  22.         page += 1
  23.         page_url = start_url.format(page)
  24.         try:
  25.             r = requests.get(page_url, headers=g_headers).json()
  26.             img = 'https://cn.bing.com' + r['images'][0]['url']
  27.             if imgs.count(img) <= 0:
  28.                 imgs.append(img)
  29.             else:
  30.                 break
  31.         except:
  32.             pass
  33.     return imgs
  34. def download_image(url, savepath):
  35.     """
  36.     根据图片地址下载图片至指定路径
  37.     :param url: 图片url地址
  38.     :param savepath: 图片保存路径
  39.     :return: 下载是否成功
  40.     """
  41.     try:
  42.         r = requests.get(url, headers=g_headers, stream=True)
  43.         if r.status_code != 200:
  44.             return False
  45.         open(savepath, 'wb').write(r.content)
  46.         return True
  47.     except:
  48.         return False
  49. def get_image_id(url):
  50.     """
  51.     从URL地址获取图片的参数id信息
  52.     :param url: bing图片url地址
  53.     :return: 图片id
  54.     """
  55.     try:
  56.         paras = url[url.find('?')+1:].split('&')
  57.         for p in paras:
  58.             kv = p.split('=')
  59.             if kv[0] == 'id':
  60.                 return kv[1].strip()
  61.     except:
  62.         pass
  63.     return url
  64. def set_desktop_image(img):
  65.     """
  66.     将图片设置为桌面壁纸
  67.     :param img: 图片
  68.     :return:
  69.     """
  70.     import win32gui
  71.     import win32con
  72.     import win32api
  73.     key = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER,
  74.                                 "Control Panel\\Desktop"0, win32con.KEY_SET_VALUE)
  75.     win32api.RegSetValueEx(key, "WallpaperStyle"0, win32con.REG_SZ, "2")
  76.     # 2拉伸适应桌面,0桌面居中
  77.     win32api.RegSetValueEx(key, "TileWallpaper"0, win32con.REG_SZ, "0")
  78.     win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, os.path.abspath(img), 1 + 2)
  79. def auto_change_desktop_image(img_dir, order='rand'):
  80.     """
  81.     根据指定的壁纸目录,定时更新桌面壁纸,当前日期变化后会退出
  82.     :param img_dir: 壁纸目录
  83.     :param order: 图片更新顺序,默认为顺序,rand为随机
  84.     :return:
  85.     """
  86.     files = os.listdir(img_dir)
  87.     images = []
  88.     for file in files:
  89.         temp = os.path.join(img_dir, file)
  90.         if os.path.isfile(temp):
  91.             images.append(temp)
  92.     index = 1
  93.     if order == 'rand':
  94.         index = random.randint(0, len(images) - 1)
  95.     index = index % len(images)
  96.     set_desktop_image(images[index])
  97.     print(time.time(), ' 已设置桌面壁纸为:', images[index])
  98. if __name__ == '__main__':
  99.     # 获取每日壁纸
  100.     urls = get_bing_image_urls(20)
  101.     save_dir = './' + time.strftime('%Y%m%d', time.localtime(time.time()))
  102.     if not os.path.exists(save_dir):
  103.         os.makedirs(save_dir)
  104.     for url in urls:
  105.         name = get_image_id(url)
  106.         save_path = save_dir + '/' + name
  107.         print('下载', url, '成功' if download_image(url, save_path) else '失败')
  108.     # 自动更新壁纸
  109.     auto_change_desktop_image(save_dir, 'rand')