使用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]
这个就是单纯的时间计算了,可惜的是好像没有现成的第三方库来判断节假日,如果有了解的话可以评论区说一下
# 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)
因为我的路径是包含中文的,因此需要进去txt里面修改一下编码格式
大概就这样了,如果有啥错误还请各位大佬批评指正,如果有啥疑问欢迎提问【如果我还记得的话】
文件链接:https://download.csdn.net/download/weixin_43943199/72306544
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) # 获取当天图片信息