【python】必应api获取壁纸信息+修改桌面+倒计时显示

益麻雀
2023-12-01

1.0版本

一、获取壁纸路径

使用request对必应壁纸的api进行访问,获取图片路径,并下载到本地,api地址的说明参考:starsion大佬的文章
顺便做了个封装,代码如下所示:
其中:
1、download_path是图片的存放地址,建议是全英文路径,因为后面用会到opencv做一个文字显示
2、days:是api里面所提到的请求图片返回日期,可填-1、0、1
3、number:返回的图片数,最大的是8,代码里面做了简单的判断
4、headers:我在pycharm里面用fake_useragent是可以的,但不知道为啥在bat文件运行就不行了,所以为了稳定性我直接用了浏览器给的,详细的查看可以看这个链接百度百科,直接修改xxx的内容就可以了

# 根据必应的api来下载图片
def get_pic_from_url(download_path,days=0,number=8):
    # api参考链接:https://blog.csdn.net/m0_37682004/article/details/82314055
    # 官方的api
    # format : 返回数据格式
    # days:请求图片截止日期,0为当天
    # number:返回图片数,1—8
    url = f'https://cn.bing.com/HPImageArchive.aspx?format=js&idx={days}&n={number}&mkt=zh-CN'
    if (number > 8):
        print("获取图片数量太多,应该在1~8之间")
        return 0
        
    # ua = UserAgent()
    # headers = {'User-Agent': ua.edge}
    headers = 'xxx'
    r = requests.get(url, headers=headers)  # 通过reques请求网页信息
    if (number == 1):
        text = json.loads(r.text)
        pic_url = text['images'][0]['url']
        link = 'https://cn.bing.com' + pic_url
        name = text['images'][0]['copyright'].split(' ')[0]

    #     下载图片
        html = requests.get(link)
        
        print(f'{download_path}/{name}.jpg')
        with open(f'{download_path}/1.jpg', 'wb') as f:    # 将获取链接保存至本地
            f.write(html.content)
            f.close()
    else:
        text = json.loads(r.text)
        for i in range(number):
            pic_url = text['images'][i]['url']
            link = 'https://cn.bing.com' + pic_url
            name = text['images'][i]['copyright'].split(' ')[0]		# 因为opencv不支持中文,所以没有用原本的文字,可以考虑更改url里面的地区设置(mkt=zh-CN)来获取原来的英文名

            #     下载图片
            html = requests.get(link)
            
            print(f'{download_path}/{name}.jpg')
            with open(f'{download_path}/{i}.jpg', 'wb') as f:  # 将获取链接保存至本地
                f.write(html.content)
                f.close()
            time.sleep(2)						# 好像下载太快会有限制,所以就加了个延时2秒,当然可以用线程池?

二、根据文件夹内已有的图片修改日期来判断是否需要覆盖原有图片

基本原理就是用图片的时间跟当天的时间进行比较,如果是当天则跳过下载,否则就下载图片;
在这里用了个取巧的方法,也就是我先放了一张“1.jpg”的图片进去【主要是比较懒。。。】
当然可以再写几行代码判断文件夹里面是否有图片,如果没有图片就下载壁纸。
为了增加随机性,写了一个随机选取文件夹内的图片函数get_last_pic()
代码如下

	pic_path = r'C:\Users\Administrator\Pictures\paperwall'		# 图片存放地址
    # 根据图片创建时间来确定是否需要爬取图片
    pic_time = os.path.getmtime(os.path.join(pic_path,'1.jpg'))
    date = datetime.datetime.fromtimestamp(pic_time)
    # 时间判断
    if (date.strftime('%Y-%m-%d') == datetime.datetime.now().strftime("%Y-%m-%d")):
        pass
    else:
        get_pic_from_url(pic_path)          # 获取当天图片信息
    pic = get_last_pic(pic_path)        # 随机选择一张图片
# 根据壁纸库来排序壁纸时间
def get_last_pic(path):
    lists = os.listdir(path)            # 获取指定路径目录下的所有信息
    number = random.randint(1,len(lists)) - 1
    return lists[number]

三、基于datetime来计算当前日期与目标日期的时间间隔

这个就是单纯的时间计算了,可惜的是好像没有现成的第三方库来判断节假日,如果有了解的话可以评论区说一下

# main里面的调用
timedown = get_countdown_number('2021-12-31')
picture = add_countdown_number(timedown, os.path.join(pic_path,pic))
# 函数定义
def get_countdown_number(endtime):
    # 获取时间
    nowtime = datetime.datetime.today()                   # 当前时间
    endtime = datetime.datetime.strptime(endtime, "%Y-%m-%d")       # 截止时间

    deltatime = endtime - nowtime
    print(deltatime.days)
    return deltatime.days
    
    # 根据壁纸库来候选壁纸
def add_countdown_number(countdown,path):
    pic = cv2.imread(path)
    # pic = cv2.resize()
    pic = cv2.putText(pic,f'To ddl :{countdown}days',(300,300),cv2.FONT_HERSHEY_SIMPLEX,5,(255,255,255),2)
    return pic
    # (300,300)是文字放置文字,5是文字大小,2是线宽,(255,255,255)是文字颜色

四、保存图片+设置桌面

原理:opencv生成一张带有倒计时的图片,并且用修改注册表的方式进行桌面设置
参照大佬的代码进行了一些修改使用Python做一个切换电脑桌面壁纸的小程序

# 通过修改注册表的方式来修改桌面壁纸
def Windows_set_wall_paper(path):
    # 打开注册表
    key = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER, "Control panel\\Desktop", 0, win32con.KEY_SET_VALUE)
        # 函数定义:
        # RegOpenKey(key, subkey, reserved, sam)
        # RegOpenKeyEx(key, subkey, reserved, sam)
        # 两个函数的参数一样。参数含义如下:
        # Key:Windows注册表基本项。
        # HKEY_CLASSES_ROOT       是HKEY_LOCAL_MACHINE\Software的子项,保存打开文件所对应的应用程序信息
        # HKEY_CURRENT_USER       是HKEY_USERS的子项,保存当前用户的配置信息
        # HKEY_LOCAL_MACHINE      保存计算机的配置信息,针对所有用户
        # HKEY_USERS              保存计算机上的所有以活动方式加载的用户配置文件
        # HKEY_CURRENT_CONFIG     保存计算机的硬件配置文件信息

        # SubKey:要打开的子项。
        # Reserved:必须为0。
        # Sam:对打开的子项进行的操作,包括win32con.KEY_ALL_ACCESS、win32con.KEY_READ、win32con.KEY_WRITE等

    # 往注册表中写入属性值
    win32api.RegSetValueEx(key,  "wapaperStyle", 0, win32con.REG_SZ, "2")  # 经过多次调试,发现参数“2”和“0”这样搭配效果最好
    win32api.RegSetValueEx(key, "Tilewallpaper", 0, win32con.REG_SZ, "0")
    #     RegSetValueEx(key,valueName,reserved,type,value) 要修改或重新设置注册表某一项的项值。如果项值存在,则修改该项值,如果不存在,则添加该项值。
            # 对于RegSetValueEx,其参数含义如下:
            # Key:要设置的项的句柄。
            # valueName:要设置的项值名称。
            # Reserved:保留,可以设为0。
            # Type:项值的类型。
            # Value:所要设置的值。
    #     RegSetValue(key,subKey,type,value) 设置项的默认值
        #     对于RegSetValue,其参数含义如下:
        #     Key:已经打开的项的句柄。
        #     subKey:所要设置的子项。
        #     Type:项值的类型,必须为win32con.REG_SZ。
        #     Value:项值数据,为字符串。

    # 刷新桌面
    win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, path, win32con.SPIF_SENDWININICHANGE)

五、写了个bat文件用来一键修改壁纸

因为我的路径是包含中文的,因此需要进去txt里面修改一下编码格式

大概就这样了,如果有啥错误还请各位大佬批评指正,如果有啥疑问欢迎提问【如果我还记得的话】
文件链接:https://download.csdn.net/download/weixin_43943199/72306544


2.0版本

增加

1、路径下无图片下的判定
2、随机在图库中选择一张图片

    if len(pic_names) == 0:      # 如果文件夹内没有内容
        get_pic_from_url(pic_path,days=-1,number=4)          # 则直接获取当天图片获取当天图片信息
    else:                                   # 文件夹内包含图片
        # 根据文件时间判断是否需要在线下载图片
        pic_names.sort(key=lambda fn: os.path.getmtime(pic_path + '\\' + fn))           # 按时间排序
        pic_time = os.path.getmtime(os.path.join(pic_path, pic_names[-1]))              # 获取时间最新的一张

        date = datetime.datetime.fromtimestamp(pic_time)            # 获取文件修改时间

        if (date.strftime('%Y-%m-%d') == datetime.datetime.now().strftime("%Y-%m-%d")):     # 如果图片时间跟今天的时间相同
            pass                                                                            # 什么都不执行
        else:
            get_pic_from_url(pic_path)                                                      # 获取当天图片信息
 类似资料: