2019-04-05 的更新

意外的发现 Bing 主页的图片其实提供了 API 的。

这样就可以以更优雅的方法解析了 (本脚本现在还可以正常使用,就懒的更新了,等不能用时再说吧)。

https://bing.com/HPImageArchive.aspx?format=js&idx=0&n=1

写了一份简要的 API 说明如下。

各部分 参数 含义
https://bing.com/HPImageArchive.aspx?
format=js js (也就是 json), xml 输出图片信息所用的数据格式
&idx=0 0 (默认), 1, 2, 3, 4, 5, 6 ,7 输出 x 天前 (0 表示今天) 的图片信息
&n=1 1 (默认), 2, 3, 4, 5, 6, 7, 8 输出 x 天内 (1 表示今天) 所有的图片信息

缘由

Bing 的主页每天都会更新一张图片, 拿来作壁纸不要太爽。

手动下载壁纸有一段时间 (主要是有时候壁纸太丑了,不想污染眼睛) ,不过手动下载实在麻烦的很。

那就写个脚本呗 (不会自动化的程序员不是好的潜水员)

具体实现

直接上代码。 (点击 此处 下载脚本)

#!/bin/bash

# @Author: 文正•喵
# @E-Mail: ivlioioilvi@outlook.com

#
# 获取必应每日的主页图片作为壁纸
#

# 定义全局变量
#
# Bing 的网址
BING_URL="https://bing.com"
# 用于第一次粗略过滤时的关键字 (快速定位到图片链接所在行)
FIRST_FILTERING_RULE='<link id="bgLink" rel="preload"'
# 用于第二次精确过滤时的规则 (提取出未拼接的图片链接)
SECOND_FILTERING_RULE='BEGIN { FS = "\"|\"" } { print $6 }'

# 准备工作
preparation_Action() {
    # 判断存放壁纸的文件夹是否存在 (如果不存在就创建)
    if [ -d "$HOME/.config/Wallpaper" ]; then
        :
    else
        mkdir -p "$HOME/.config/Wallpaper/Backups"
    fi
}

# 开始执行 preparation_Action 函数
preparation_Action

# 提取文件名
get_File_Name() {
    # 获取传入的参数 1 (已拼接的图片链接)
    FULL_URL="$1"
    # 获取传入的参数 2 (未拼接的图片链接)
    HALF_URL="$2"

    # 提取图片的名字
    FILE_NAME=$(echo -e "$HALF_URL" | cut -d "&" -f 1 | cut -d "_" -f 1 | cut -d "." -f 2)

    # 提取出图片的后缀
    TMP_FILE_TYPE=$(echo -e "$HALF_URL" | cut -d "&" -f 1 | cut -d "." -f 3)
    FILE_TYPE=".$TMP_FILE_TYPE"

    # 下载主页图片到备份目录
    curl -sL "$FULL_URL" -o "$HOME/.config/Wallpaper/Backups/$FILE_NAME$FILE_TYPE"

    # 复制壁纸到壁纸的存放目录
    cp -rf "$HOME/.config/Wallpaper/Backups/$FILE_NAME$FILE_TYPE" "$HOME/.config/Wallpaper/Current$FILE_TYPE"
    # 通过 feh 设置壁纸
    # 你也可以注释掉下面这行,转而使用其它壁纸设置工具,如果你想的话
    feh --randomize --no-fehbg --bg-scale ~/.config/Wallpaper/Current$FILE_TYPE
}

# 获取图片链接地址
get_Pictures_URL() {
    # 定义局部变量 (未拼接的图片链接)
    INCOMPLETE_URL=$(

    # 获取 Bing 网站的源码
    curl -sL "$BING_URL" |
    
    # 进行第一次粗略过滤时的关键字 (快速定位到图片链接所在行)
    grep "$FIRST_FILTERING_RULE" |
    
    # 进行第二次精确过滤时的规则 (提取出图片链接)
    awk "$SECOND_FILTERING_RULE" )

    # 开始执行 file_Name 函数并传入已拼接的 URL 和未拼接的 URL 两个参数
    get_File_Name "$BING_URL$INCOMPLETE_URL" "$INCOMPLETE_URL"
}

# 开始执行 get_Pictures 函数
get_Pictures_URL

观察过一段时间, Bing 主页的图片链接虽然变更过几次, 不过总的来说风格比较固定, 所以代码中很多地方都是写死了的 (或者说不灵活)。

此脚本我每天都会使用, 所以如果再次发生了变更也能及时发现并更新 (本篇博客中的代码也会同步更新) ,所以放心食用吧。

在其它系统上运行

上述代码使用 Bash Script 编写, 因此在 *nix 系统上运行应该是没问题的 (包括 Android)。

如果想在 Windows 上运行,有以下几种方法。

  • 安装 Git,使用其中的 git-bash 运行

  • 安装 MSYS2 或之类的工具,使用其中的 Mintty 运行

  • WSL 中运行