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 中運行