用python实现下载必应壁纸并自动更换壁纸的功能

来源:互联网 发布:电台 知乎 编辑:程序博客网 时间:2024/05/04 10:34

用python实现下载必应壁纸并自动更换壁纸的功能

动机

Windows下的必应桌面(Bing Desktop)提供了质量非常高的壁纸,但是集成了太多无用的功能,同时还有一些让人恼火的bug。鉴于这种情况,我决定自己动手实现一个纯净版的必应桌面,只有自动下载和更换壁纸的功能,包括GUI等等在内烦人的东西一概没有。

数据包分析

首先要搞清楚必应这些图片是从哪里下载的,有没有身份验证等等。于是我用wireshark对必应桌面客户端的网络通信进行了分析。

观察之后,我发现在我进行统计的时间内,我的电脑总共跟15个服务器进行了通信。结合对必应桌面的了解,下载的内容应该包括两部分:图片和对应的xml文件。我的电脑上xml文件的总大小为150k左右,找到通信数据量为150k左右的服务器,这就是必应下载图片信息的服务器。用同样的方法可以找到下载图片的服务器。

简单观察一下通信内容就可以发现,必应桌面的逻辑非常简单:首先从记录图片信息的服务器A查询可供下载的图片信息,在电脑上保存为xml格式的文件;随后根据每个xml提供的信息从图片服务器B上下载对应的图片。

查询图片信息的url为:http://az517271.vo.msecnd.net/TodayImageService.svc/HPImageArchive?mkt=zh-cn&idx=0,其中mkt是代表国家的参数,除了中国之外其他的参数我没有试出来;idx是从0到8的整数,分别对应一张图片。

xml文件解析

前面提到我们从服务器A上首先得到的是xml文件,这个xml文件中包含了图片的名称、下载链接、文字介绍等等等等信息,不过我们只需要链接就可以下载了。这里提供的文件是jpg格式。

将下载图片设为桌面壁纸

将图片保存之后还需要将其设为壁纸。在Ubuntu及其衍生发行版中,将图片设为壁纸的命令是:

gsettings set org.gnome.desktop.background picture-uri "/home/myname/bing.jpg"

而在Windows中,设置壁纸需要修改注册表,比较麻烦。我一开始使用的是python内置的_winreg模块,发现其十分不给力,换成pywin32扩展包之后轻松解决问题。这里的命令是:

win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, "C:\bing.jpg", 1+2)

设置自动运行

必应桌面方便的地方就在于自动更新壁纸,因此我们也要实现这个功能,我们可以利用操作系统的计划任务来实现。

在Linux下,计划任务是通过守护进程cron实现的。假设我们已经写好的脚本是change_wallpaper.py,编辑crontab,输入

crontab -e

在crontab中加一行

0   */2     *       *       *       python /<some absolute path>/change_wallpaper.py

前面的5个数字分别表示分钟、小时、一月中的日期、月、一周中的日期,*表示不重要,*/2表示每2小时(分钟/月)执行一次;最后一个选项是我们要执行的命令。

保存退出之后重启cron进程

sudo restart cron

这样系统就会在我们指定的时间自动下载并更换壁纸。

在Windows下计划任务的配置相对简单,可以通过GUI完成。值得一提的是命令的写法。我一开始在计划任务中执行的命令是

python C:\change_wallpaper.py

然后发现每次执行计划任务都会弹出一个命令行窗口,很是烦人。求助Google之后我创建了一个run.bat脚本,里面的内容为

start /min python %~dp0change_wallpaper.py

其中start /min表示让程序在后台(最小化)运行,%~dp0在bat脚本中表示脚本文件所处的目录。将run.bat与change_wallpaper.py放在同一目录中,就可以避免脚本中出现绝对路径。这时只需在计划任务中执行run.bat即可。

C:\run.bat

到这里,我们就实现了自动必应桌面自动运行、下载和更换壁纸的功能。

项目代码

代码托管在github,地址为https://github.com/rorschachhb/cleanBingDesktop。需要注意的是,在Windows上运行之前要先安装pywin32扩展包。

0 0
原创粉丝点击