自游客

撒欢儿去

每天自动获取 Bing 壁纸

自从换了 mac 之后,直观的感觉是桌面变的更空旷了(本来我就不喜欢在桌面放东西)。所以,壁纸成了装点桌面的唯一工具。正好 Bing 的背景图片每天都会换一张,并且几乎每张图片都让人感觉非常大气,所以就萌生了用 Bing 图片做壁纸的想法(话说让我知道 Bing 每天都会换背景图,还是因为之前做 Kratos 的时候有小伙伴提出网页的背景图能不能调用 Bing 的接口 《每天自动获取 Bing 壁纸》 )。我先看了一下 Apple Store 里面有没有这种 App,果不其然还真有,但是这价格的话,emmmmm 算了还是自己整吧。

利弊分析

Bing 的图片有 4 种像素,分别是 1920×1200、1920×1080、800×480、400×240,而 mac 可以支持到 2880 x 1800,所以在视觉上看着壁纸不是非常的清晰的(系统自带的壁纸是 5120 × 3684)。

这里制作的自动化脚本是每次开机启动的,如果一天开机好几次的话,脚本会自带检测是否已经下载过图片,从而不会重复下载。

战前准备

  • MAC 中自带的 Automator
  • bing-wallpaper 脚本
  • 充满智慧的大脑 《每天自动获取 Bing 壁纸》

战斗开始

1、首先我们知道 Bing 图片是有一个接口的,也就是 https://cn.bing.com/HPImageArchive.aspx?format=js&n=1 ,他的主要内容如下,这里我们需要的是第 7 行 url,也就是图片的地址,所以在脚本中只要拉这个 url 地址即可实现需求。

{
    images: [
        {
            startdate: "20180315",
            fullstartdate: "201803151600",
            enddate: "20180316",
            url: "/az/hprichbg/rb/WolongPanda_ZH-CN10957042976_1920x1080.jpg",
            urlbase: "/az/hprichbg/rb/WolongPanda_ZH-CN10957042976",
            copyright: "卧龙国家级自然保护区的大熊猫,中国四川 (© Lynn M. Stone/Minden Pictures)",
            copyrightlink: "http://www.bing.com/search?q=%E5%A4%A7%E7%86%8A%E7%8C%AB&form=hpcapt&mkt=zh-cn",
            quiz: "/search?q=Bing+homepage+quiz&filters=WQOskey:%22HPQuiz_20180315_WolongPanda%22&FORM=HPQUIZ",
            wp: false,
            hsh: "6fa3921773323a6e7f0f45447e548f91",
            drk: 1,
            top: 1,
            bot: 1,
            hs: [ ]
        }
    ],
    tooltips: {
        loading: "正在加载...",
        previous: "上一个图像",
        next: "下一个图像",
        walle: "此图片不能下载用作壁纸。",
        walls: "下载今日美图。仅限用作桌面壁纸。"
    }
}

2、bing-wallpaper 是一个可以从 Bing 下载当天最新图片并将其保存到目录的脚本。

#!/usr/bin/env bash
# shellcheck disable=SC1117

readonly SCRIPT=$(basename "$0")
readonly VERSION='0.4.0'
readonly RESOLUTIONS=(1920x1200 1920x1080 800x480 400x240)

usage() {
cat <<EOF
Usage:
  $SCRIPT [options]
  $SCRIPT -h | --help
  $SCRIPT --version
Options:
  -f --force                     Force download of picture. This will overwrite
                                 the picture if the filename already exists.
  -s --ssl                       Communicate with bing.com over SSL.
  -q --quiet                     Do not display log messages.
  -n --filename <file name>      The name of the downloaded picture. Defaults to
                                 the upstream name.
  -p --picturedir <picture dir>  The full path to the picture download dir.
                                 Will be created if it does not exist.
                                 [default: $HOME/Pictures/bing-wallpapers/]
  -r --resolution <resolution>   The resolution of the image to retrieve.
                                 Supported resolutions: ${RESOLUTIONS[*]}
  -w --set-wallpaper             Set downloaded picture as wallpaper (Only mac support for now).
  -h --help                      Show this screen.
  --version                      Show version.
EOF
}

print_message() {
    if [ ! "$QUIET" ]; then
        printf "%s\n" "${1}"
    fi
}

# Defaults
PICTURE_DIR="$HOME/Pictures/bing-wallpapers/"
RESOLUTION="1920x1080"

# Option parsing
while [[ $# -gt 0 ]]; do
    key="$1"

    case $key in
        -r|--resolution)
            RESOLUTION="$2"
            shift
            ;;
        -p|--picturedir)
            PICTURE_DIR="$2"
            shift
            ;;
        -n|--filename)
            FILENAME="$2"
            shift
            ;;
        -f|--force)
            FORCE=true
            ;;
        -s|--ssl)
            SSL=true
            ;;
        -q|--quiet)
            QUIET=true
            ;;
        -h|--help)
            usage
            exit 0
            ;;
        -w|--set-wallpaper)
            SET_WALLPAPER=true
            ;;
        --version)
            printf "%s\n" $VERSION
            exit 0
            ;;
        *)
            (>&2 printf "Unknown parameter: %s\n" "$1")
            usage
            exit 1
            ;;
    esac
    shift
done

# Set options
[ $QUIET ] && CURL_QUIET='-s'
[ $SSL ]   && PROTO='https'   || PROTO='http'

# Create picture directory if it doesn't already exist
mkdir -p "${PICTURE_DIR}"

# Parse bing.com and acquire picture URL(s)
read -ra urls < <(curl -sL $PROTO://www.bing.com | \
    grep -Eo "url:'.*?'" | \
    sed -e "s/url:'\([^']*\)'.*/$PROTO:\/\/bing.com\1/" | \
    sed -e "s/\\\//g" | \
    sed -e "s/\([[:digit:]]*x[[:digit:]]*\)/$RESOLUTION/")

for p in "${urls[@]}"; do
    if [ -z "$FILENAME" ]; then
        filename=$(echo "$p"|sed -e "s/.*\/\(.*\)/\1/")
    else
        filename="$FILENAME"
    fi
    if [ $FORCE ] || [ ! -f "$PICTURE_DIR/$filename" ]; then
        print_message "Downloading: $filename..."
        curl $CURL_QUIET -Lo "$PICTURE_DIR/$filename" "$p"
    else
        print_message "Skipping: $filename..."
    fi
done

if [ $SET_WALLPAPER ]; then
    /usr/bin/osascript<<END
tell application "System Events" to set picture of every desktop to ("$PICTURE_DIR/$filename" as POSIX file as alias)
END
fi

3、在脚本的第 39-40 行,是设置图片的保存位置以及图片的像素。这里默认的是最高像素,保存的位置为 /Pictures/bing-wallpapers/ 这个文件夹中,下图是这段时间我电脑里拉到的一些图片。

《每天自动获取 Bing 壁纸》

4、将修改好的脚本添加到 Automator 的工作流程中,左边选择“运行 Shell 脚本”

《每天自动获取 Bing 壁纸》

5、将保存好的工作流程添加到“登录项”中,从而实现开机自动运行

《每天自动获取 Bing 壁纸》

6、最后,我们设置桌面背景,添加壁纸所在的文件夹,然后再勾选更改图片的频率为每天

《每天自动获取 Bing 壁纸》

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.