你好陌生人,请不要试图越过权限文章,谢谢!

基于python的每日自动更换壁纸

写在前面

每天面对着电脑,对着windows的世界之窗壁纸天天看,或者自定义的壁纸会一点审美疲劳,但每次更换壁纸感觉麻烦去找,所以自己就写了一套程序,每日自动获取微软Bing网页更新的壁纸,并替换当前桌面壁纸即可


配置环境与安装必要的库

环境

  • python3.*
  • nodejs PM2环境(非必须,仅用于任务自启动)

库文件

  • requests(请求库)
  • ctypes(调用系统命令库)
  • time(设定定时任务)
  • Json
  • re
  • sys

代码

获取网页图片并保存到本地

分析网页

  首先要对微软Bing(https://cn.bing.com/)的网页进行分析,我们使用chrom调试分析出微软bing的壁纸地址

分析网页架构构建正则表达式

  想要得到图片的完整地址还是需要从网页入手,我是基于re正则去构建,所以我分析了网页了组成结构,发现图片的源代码如下:

  这里是可以跟域名拼接的,拼接可以直接得到这张图片源地址

  接下来,就可以根据分析的规则构建正则表达式为:

1
r='<link id=\"bgLink\" rel=\"preload\" href=\"(.*?)\" as=\"image\"'

  完整的获取图片源地址代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#获取网页图片的链接
def get_url_img():
html=requests.get(json_data['url'])
if html.status_code != 200:
print('获取网页失败')
return 0
#构建re正则
r="<link id=\"bgLink\" rel=\"preload\" href=\"(.*?)\" as=\"image\""
img_url=re.findall(r,html.text)

if(len(img_url) == 0):
print('没找找到符合的链接')
return 0
img_link=json_data['url_source']+img_url[0]

return img_link

保存图片到本地

  获取的源地址图片的link后,需要保存本地,那么则需要requests库配合请求获取图片的二进制代码转存到本地,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#保存图片到本地
def save_img():
img_link=get_url_img()
if img_link == 0:
return 0
content=requests.get(img_link).content
#获取路径信息
path_img='c:\\1.jpg'
try:
with open(path_img,'wb') as f:
f.write(content)
return {'status':'success','path':path_img}
except:
return {'status':'error','path':''}

  则图片成功保存到c:\\目录下,成功获取到图片

调用系统命令更换壁纸

基于 ctypes来调用系统的壁纸目录

  此条命令是用来更换壁纸,img_path就是我们下载的图片地址

1
ctypes.windll.user32.SystemParametersInfoW(20, 0, img_path, 0) # 设置桌面壁纸
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
#初次启动执行一次
res=requestsImg.save_img()
#判断状态
if res['status'] == 'error':
print('图片获取失败')
else:
img_path=res['path']
#系统API
try:
ctypes.windll.user32.SystemParametersInfoW(20, 0, img_path, 0) # 设置桌面壁纸
print('更换壁纸成功')
except:
print('无法调用系统API,请重试')

运行前后比较

  运行前桌面的壁纸:

  运行后桌面的壁纸:

定时任务

  每天需要设定定时任务,让壁纸在一个固定时间切换,这里我写了这么一段代码来实现,每半小时更新一次

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#模块
while(True):
time_hms=time.strftime("%H", time.localtime())
if time_hms == json_data['time']:
res=requestsImg.save_img()
#判断状态
if res['status'] == 'error':
print('图片获取失败')
else:
img_path=res['path']
#系统API
try:
ctypes.windll.user32.SystemParametersInfoW(20, 0, img_path, 0) # 设置桌面壁纸
print('更换壁纸成功')
except:
print('无法调用系统API,请重试')

min=time.strftime("%H:%M:%S", time.localtime())
print('当前时间:'+min)
time.sleep(1800)

  并且我采用了pm2部署在windows上,并采取开启自动更新一次,就可以不断的在pc机中运行了,pm2的用法可以查询一下资料,非常简单,运行如下:

  最后就完成了我们全自动定时更新壁纸的任务啦

完整代码

  代码已上传到github

结尾

完善了一下代码,配置config文件,让其本身更具有拓展性,不一定局限于Bing网页,也可以去其他页面进行爬取图片,只要构建正常的re正则,就可以实现多页面图片爬取,原理都是一样的,当然,这只是简单的程序,我连请求头呀什么的都没有设置。以上,供参考交流。