<br />
<br />
#萌新折腾笔记# 美化系列——青龙脚本与NAS自动化的奇妙之旅
前言
此帖已失效,仅作留念~~
因有玩家利用相关玩法传播不良信息,为了保护中继域名不被封禁及避免产生不必要的麻烦,官方对/trim/www文件夹做了一定限制,故不建议继续折腾,各位安心等待官方放出对应功能!!!
朋友,当你看到“青龙脚本”与“美化”这两个词并列在一起时,是否感到一丝困惑?你可能会想,这两者之间究竟有什么联系呢?是不是作者写错标题了?然而,由于应用场景的减少,我们似乎忘了青龙面板不只是一款签到工具,它还可以帮助我们实现许多看似不可能的任务。
不久前,我分享过一篇关于如何自动获取必应每日壁纸的教程,效果令人满意。我以为,这将是一个长久有效的解决方案。然而,最近的一次系统更新打破了这一切——官方重置了Debian系统下的定时任务内容,导致我的自动化流程不再奏效。我不禁自问:难道就没有其他方法可以通过脚本实现自动化了吗?对于初学者而言,难道就没有简单易行的方案了吗?
正当我陷入迷茫之时,一个意外的发现为我指明了方向。我在浏览官方应用商店时注意到,青龙面板是通过Docker Compose安装的。或许借助青龙面板,我们可以重新构建一个更为稳健的自动化流程。接下来,让我们一起探索这个过程,看看青龙面板是如何帮助我们实现NAS壁纸自动化的!
一、安装青龙面板
打开飞牛应用商店,找到青龙脚本,按自己的实际情况进行安装。安装后请先停用这个程序。
二、配置路径映射
让我们来到 docker界面--compose项目管理界面 找到qinglong这一项目,点击进入;
在YAML配置中我们需要添加一些内容,具体如下:
# 在qinglong服务下添加特权命令
qinglong:
privileged: true
# 在volumes中添加壁纸文件夹两个路径
volumes:
- /usr/trim/www/static/thumbnail_bg:/usr/trim/www/static/thumbnail_bg
- /usr/trim/www/static/bg:/usr/trim/www/static/bg
##请务必注意缩进,最终privileged与volumes会在同一列开始
添加完成后呈现如下,无误即可回到应用商店启用这个程序:
三、配置依赖和脚本
1、配置依赖
进入青龙面板,来到依赖管理,选择创建依赖
依赖类型选择python3,“名称”复制这段内容填入:
datetime
requests
ping3
jieba
PyExecJS
自动拆分选择是,随后确定等待依赖安装完成即可。(其实这里只需要用到requests)
2、添加脚本
进入脚本管理界面,点击右上角新增按钮。设置脚本文件名后点击确定。两个脚本见文章末尾。
随后粘贴代码,点击右上角的保存即可。如下:
创建定时任务
点击左侧侧边栏的定时任务,点击创建
名称:按照自己喜欢的填写,
路径:默认为/ql/data/scripts/加上脚本名称即可(注意后缀为.py)如:/ql/data/scripts/必应壁纸更新.py
定时规则:此处需要填写cron表达式
* * * * * *
- - - - - -
| | | | | |
| | | | | +--- 星期 (0 - 6) (0 或 7 代表星期日)
| | | | +----- 月份 (1 - 12)
| | | +------- 日期 (1 - 31)
| | +--------- 小时 (0 - 23)
| +----------- 分钟 (0 - 59)
+------------- 秒 (0 - 59, 可选)
如:10 30 2 * * * 则代表在每天2点30分10秒时执行
大部分情况可能会只有五位字符,理解时去掉秒即可,如0 2 * * *代表每天两点执行
有兴趣可以自行了解学习,由于必应不是每天0点第一时间更新壁纸,故不建议设置为0 0 * * *,可适当延后
按我们自己的需要设置好后点击确定就可以在该界面看到这一条任务
我们可以点击运行测试一下,然后点击日志进行查看,提示壁纸更新成功基本就没有问题了。这里我列出了两个文件目录的内容,方便我们直观的观察重命名是否成功。
最后自然就是两个代码了
1、必应壁纸更新(文件夹会自动创建,可通过文件管理器-应用文件-qinglong内查看)
# 文件将保存在/vol1/@appshare/qinglong/必应壁纸保存
import requests
import os
import shutil
from datetime import datetime
BING_URL = "https://www.bing.com"
WALLPAPER_NAME = "wallpaper-1.webp"
BG_DIR = "/usr/trim/www/static/bg"
THUMBNAIL_BG_DIR = "/usr/trim/www/static/thumbnail_bg"
SAVE_DIR = "/ql/data/必应壁纸保存" # 保存目录
# 确保保存目录存在,如果不存在自动创建
os.makedirs(SAVE_DIR, exist_ok=True)
# 获取必应背景图片的相关内容
response = requests.get(f"{BING_URL}/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN")
response.raise_for_status()
json_data = response.json()
image_url = json_data['images'][0]['url']
full_image_url = f"{BING_URL}{image_url}"
# 保存到指定目录
save_image_path = os.path.join(SAVE_DIR, 'bing_wallpaper.jpg')
with requests.get(full_image_url, stream=True) as r:
r.raise_for_status()
with open(save_image_path, 'wb') as f:
shutil.copyfileobj(r.raw, f)
# 将文件后缀重命名为 .webp
save_wallpaper_path = os.path.join(SAVE_DIR, WALLPAPER_NAME)
os.rename(save_image_path, save_wallpaper_path)
# 复制图片到目标目录
bg_file_path = os.path.join(BG_DIR, WALLPAPER_NAME)
thumbnail_bg_file_path = os.path.join(THUMBNAIL_BG_DIR, WALLPAPER_NAME)
shutil.copy2(save_wallpaper_path, bg_file_path)
shutil.copy2(save_wallpaper_path, thumbnail_bg_file_path)
# 设置文件权限
os.chmod(bg_file_path, 0o644)
os.chmod(thumbnail_bg_file_path, 0o644)
# 生成当天日期的文件名
date_str = datetime.now().strftime("%Y-%m-%d")
final_save_path = os.path.join(SAVE_DIR, f"bing_wallpaper_{date_str}.webp")
# 将保存的壁纸重命名为当天日期
os.rename(save_wallpaper_path, final_save_path)
# 输出日志
now = datetime.now().strftime('%Y-%m-%dT%H:%M:%S') # 修改时间戳格式
print(f"{now} 壁纸更新成功.")
# 规范列出两个文件夹中的内容以供检查
def list_directory_contents(directory):
try:
contents = os.listdir(directory)
return sorted(contents) # 排序以便于查看
except FileNotFoundError:
return ["目录不存在"]
bg_dir_contents = list_directory_contents(BG_DIR)
thumbnail_bg_dir_contents = list_directory_contents(THUMBNAIL_BG_DIR)
def print_directory_table(directory, contents):
print(f"{now} {directory} 目录内容:")
print(f"{'文件名':<20}")
for content in contents:
print(f"{content:<20}")
print_directory_table(BG_DIR, bg_dir_contents)
print_directory_table(THUMBNAIL_BG_DIR, thumbnail_bg_dir_contents)
2、自定义壁纸幻灯片(需要在文件管理器-应用文件-qinglong内创建“壁纸”文件夹,并将壁纸放入后才可运行)
import os
import hashlib
import shutil
from datetime import datetime
BG_DIR = "/usr/trim/www/static/bg"
THUMBNAIL_BG_DIR = "/usr/trim/www/static/thumbnail_bg"
WALLPAPER_NAME = "wallpaper-1.webp"
WALLPAPERS_DIR = "/ql/data/壁纸"
# 这里是图片格式,可以自行添加,如果所用格式不在其中,则会显示文件夹为空报错
IMAGE_EXTENSIONS = ('.webp', '.jpg', '.jpeg', '.png')
# 计算文件的 MD5 值
def calculate_md5(file_path):
hash_md5 = hashlib.md5()
with open(file_path, "rb") as f:
for chunk in iter(lambda: f.read(4096), b""):
hash_md5.update(chunk)
return hash_md5.hexdigest()
# 获取当前使用的壁纸的 MD5 值
current_wallpaper_path = os.path.join(BG_DIR, WALLPAPER_NAME)
current_wallpaper_md5 = calculate_md5(current_wallpaper_path)
# 获取壁纸文件夹中的所有图片,这里是按文件名排序
wallpapers = [f for f in os.listdir(WALLPAPERS_DIR) if f.lower().endswith(IMAGE_EXTENSIONS)]
wallpapers.sort()
# 检查壁纸文件夹是否为空
if not wallpapers:
print(f"{datetime.now().strftime('%Y-%m-%dT%H:%M:%S')} 壁纸文件夹为空,无法继续。")
exit(1)
# 找到当前使用的壁纸
current_wallpaper = None
for wallpaper in wallpapers:
wallpaper_path = os.path.join(WALLPAPERS_DIR, wallpaper)
if calculate_md5(wallpaper_path) == current_wallpaper_md5:
current_wallpaper = wallpaper
break
# 如果没有找到当前使用的壁纸,从第一张图片开始
if current_wallpaper is None:
current_wallpaper = wallpapers[0]
# 找到下一张壁纸
current_index = wallpapers.index(current_wallpaper)
next_index = (current_index + 1) % len(wallpapers)
next_wallpaper = wallpapers[next_index]
next_wallpaper_path = os.path.join(WALLPAPERS_DIR, next_wallpaper)
# 复制下一张壁纸到目标目录并改名
bg_file_path = os.path.join(BG_DIR, WALLPAPER_NAME)
thumbnail_bg_file_path = os.path.join(THUMBNAIL_BG_DIR, WALLPAPER_NAME)
shutil.copy2(next_wallpaper_path, bg_file_path)
shutil.copy2(next_wallpaper_path, thumbnail_bg_file_path)
# 赋权
os.chmod(bg_file_path, 0o644)
os.chmod(thumbnail_bg_file_path, 0o644)
# 输出日志及目录内容打印
now = datetime.now().strftime('%Y-%m-%dT%H:%M:%S')
print(f"{now} 壁纸更新成功.")
print(f"{now} 当前使用的壁纸: {current_wallpaper}")
print(f"{now} 新的壁纸: {next_wallpaper}")
def list_directory_contents(directory):
try:
contents = os.listdir(directory)
return sorted(contents)
except FileNotFoundError:
return ["目录不存在"]
bg_dir_contents = list_directory_contents(BG_DIR)
thumbnail_bg_dir_contents = list_directory_contents(THUMBNAIL_BG_DIR)
def print_directory_table(directory, contents):
print(f"{now} {directory} 目录内容:")
print(f"{'文件名':<20}")
for content in contents:
print(f"{content:<20}")
print_directory_table(BG_DIR, bg_dir_contents)
print_directory_table(THUMBNAIL_BG_DIR, thumbnail_bg_dir_contents)
结语
综上所述,本次也算是完全脱离了ssh命令实现了系统级文件的自动化处理。如果能利用青龙面板来解决小白玩家部署的烦恼,虽然取巧,但也未尝不是一种良策:lol: