通过飞牛 NAS 定时任务 + Shell 脚本 每天下载保存Bing最新壁纸

运行关系:

飞牛 NAS

└── 用户 crontab

└── 每天 00:05


/bin/bash /vol2/1000/Download/BingWallpaper/bing_wallpaper.sh

├── 获取 Bing 当日图片
├── 尝试 UHD
├── UHD 失败 → 1920×1080
├── 保存到 UHD/
└── 日志保存到 bing_wallpaper.log

一、先确认目录

先 SSH 登录飞牛 NAS,执行:

mkdir -p /vol2/1000/Download/BingWallpaper/UHD

然后检查:

ls -ld /vol2/1000/Download/BingWallpaper
ls -ld /vol2/1000/Download/BingWallpaper/UHD

二、创建自动下载脚本

创建:

/vol2/1000/Download/BingWallpaper/bing_wallpaper.sh
#!/bin/bash

# ==============================
# Bing 每日 UHD 壁纸自动下载
# 飞牛 NAS
# ==============================

# 壁纸保存目录
SAVE_PATH="/vol2/1000/Download/BingWallpaper/UHD"

# 日志文件
LOG_FILE="/vol2/1000/Download/BingWallpaper/bing_wallpaper.log"

# 日志保留天数
LOG_DAYS=30

# 创建目录
mkdir -p "$SAVE_PATH"

# ==============================
# 日志函数
# ==============================

log() {
    echo "[$(TZ='Asia/Shanghai' date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
}

# ==============================
# 清理旧日志
# 保留最近 30 天(按文件修改时间)
# ==============================

clean_old_logs() {
    if [ -f "$LOG_FILE" ]; then
        # 获取文件修改时间(Unix时间戳)
        if command -v stat >/dev/null 2>&1; then
            FILE_MTIME=$(stat -c %Y "$LOG_FILE" 2>/dev/null)
        else
            # 如果stat不可用,使用find
            find "$LOG_FILE" -mtime +"$LOG_DAYS" -delete 2>/dev/null
            return
        fi
        
        if [ -n "$FILE_MTIME" ]; then
            CURRENT_TIME=$(date +%s)
            FILE_AGE_DAYS=$(( (CURRENT_TIME - FILE_MTIME) / 86400 ))
            
            if [ "$FILE_AGE_DAYS" -gt "$LOG_DAYS" ]; then
                rm -f "$LOG_FILE"
                touch "$LOG_FILE"
            fi
        fi
    fi
}

clean_old_logs

# ==============================
# 检查依赖
# ==============================

if ! command -v curl >/dev/null 2>&1; then
    log "❌ 错误:未找到 curl"
    exit 1
fi

if ! command -v jq >/dev/null 2>&1; then
    log "❌ 错误:未找到 jq"
    exit 1
fi

# ==============================
# 获取 Bing 壁纸信息
# ==============================

API="https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN"

log "========================================"
log "开始执行 Bing 每日壁纸任务"

PIC=$(curl -fL \
    --retry 5 \
    --retry-all-errors \
    --connect-timeout 15 \
    --max-time 60 \
    -A "Mozilla/5.0" \
    -s \
    "$API") || {
    log "❌ 获取 Bing 壁纸信息失败"
    exit 1
}

# ==============================
# 解析 JSON
# ==============================

DATE=$(echo "$PIC" | jq -er '.images[0].startdate') || {
    log "❌ 获取壁纸日期失败"
    exit 1
}

URLBASE=$(echo "$PIC" | jq -er '.images[0].urlbase') || {
    log "❌ 获取壁纸 URL 失败"
    exit 1
}

TITLE=$(echo "$PIC" | jq -r '.images[0].title // "Bing"')

# ==============================
# 清理文件名
# ==============================

SAFE_TITLE=$(echo "$TITLE" | sed 's#[/:*?"<>|\\]#_#g')

[ -n "$SAFE_TITLE" ] || SAFE_TITLE="Bing"

FILE="$SAVE_PATH/${DATE}@${SAFE_TITLE}.jpg"
TMP_FILE="$FILE.tmp"

# ==============================
# 检查当天是否已经下载
# ==============================

if [ -s "$FILE" ]; then
    SIZE=$(du -h "$FILE" | cut -f1)

    log "今日壁纸已经存在,跳过下载"
    log "文件:$FILE"
    log "大小:$SIZE"
    log "========================================"

    exit 0
fi

log "日期:$DATE"
log "标题:$TITLE"

# ==============================
# 构造图片地址
# ==============================

UHD_URL="https://cn.bing.com${URLBASE}_UHD.jpg"
HD_URL="https://cn.bing.com${URLBASE}_1920x1080.jpg"

# ==============================
# 清理临时文件
# ==============================

trap 'rm -f "$TMP_FILE"' EXIT

# ==============================
# 优先下载 UHD
# ==============================

log "尝试下载 UHD..."

if curl -fL \
    --retry 5 \
    --retry-all-errors \
    --connect-timeout 15 \
    --max-time 300 \
    -A "Mozilla/5.0" \
    -s \
    -o "$TMP_FILE" \
    "$UHD_URL" \
    && [ -s "$TMP_FILE" ]; then

    mv -f "$TMP_FILE" "$FILE"

    SIZE=$(du -h "$FILE" | cut -f1)

    log "✅ UHD 下载成功"
    log "文件大小:$SIZE"
    log "保存位置:$FILE"

# ==============================
# UHD 失败,降级到 1920x1080
# ==============================

else

    log "⚠️ UHD 下载失败,尝试 1920x1080..."

    rm -f "$TMP_FILE"

    if curl -fL \
        --retry 5 \
        --retry-all-errors \
        --connect-timeout 15 \
        --max-time 300 \
        -A "Mozilla/5.0" \
        -s \
        -o "$TMP_FILE" \
        "$HD_URL" \
        && [ -s "$TMP_FILE" ]; then

        mv -f "$TMP_FILE" "$FILE"

        SIZE=$(du -h "$FILE" | cut -f1)

        log "⚠️ 1920x1080 下载成功"
        log "文件大小:$SIZE"
        log "保存位置:$FILE"

    else

        log "❌ UHD 和 1920x1080 均下载失败"

        rm -f "$TMP_FILE"

        exit 1
    fi
fi

# 统计已下载总数
TOTAL=$(find "$SAVE_PATH" -name "*.jpg" 2>/dev/null | wc -l)
log "已累计下载:$TOTAL 张壁纸"
log "========================================"
log "下载任务完成"

exit 0

三、给脚本执行权限

执行:

chmod +x /vol2/1000/Download/BingWallpaper/bing_wallpaper.sh
chmod 755 /vol2/1000/Download/BingWallpaper/bing_wallpaper.sh

然后手动运行一次:

/vol2/1000/Download/BingWallpaper/bing_wallpaper.sh

如果成功,应该能看到类似:

========================================
开始执行 Bing 每日壁纸任务
日期:......
标题:......
尝试下载 UHD...
✅ UHD 下载成功
文件大小:......
保存位置:/vol2/1000/Download/BingWallpaper/UHD/20260xxx@xxxx.jpg
已累计下载:xxx 张壁纸
========================================
下载任务完成

然后检查:

ls -lh /vol2/1000/Download/BingWallpaper/
ls -lh /vol2/1000/Download/BingWallpaper/UHD/

四、飞牛设置每天自动执行

编辑:

crontab -e

在最后增加:

#每天北京时间 00:05 执行
5 0 * * * /bin/bash /vol2/1000/Download/BingWallpaper/bing_wallpaper.sh

保存退出:

然后检查:

crontab -l

应该看到:

5 0 * * * /bin/bash /vol2/1000/Download/BingWallpaper/bing_wallpaper.sh
此作者没有提供个人介绍。
最后更新于 2026-08-15