百度盘:https://pan.baidu.com/s/1GZ0hjv3nNdzfFK1hcUf7Og?pwd=mmbu
将程序通过计划任务设置为开机自启就行了
下面是源码
点击查看代码
use chrono::{Datelike, Duration, Local};
use reqwest::blocking::get;
use serde::{Deserialize, Serialize};
use std::{fs::{self, File},io::Write,path::PathBuf,
};
use wallpaper;// 配置文件结构
#[derive(Serialize, Deserialize)]
struct Config {save_dir: PathBuf,
}fn main() -> Result<(), Box<dyn std::error::Error>> {// 获取配置let config = get_or_create_config()?;// 生成本周一的日期let monday_date = get_last_monday();println!("本周一日期: {}", monday_date);// 构建图片URLlet image_url = format!("https://cdn.jin10.com/showbox/bizhi/{}/1920_1080_1.jpg",monday_date);// 下载图片let image_data = download_image(&image_url)?;// 保存图片let image_path = save_image(config.save_dir, &monday_date, &image_data)?;// 设置壁纸set_wallpaper(&image_path)?;Ok(())
}fn get_or_create_config() -> Result<Config, Box<dyn std::error::Error>> {let config_path = dirs::config_dir().ok_or("无法找到配置目录")?.join("wallpaper_updater").join("config.json");if config_path.exists() {let content = fs::read_to_string(&config_path)?;Ok(serde_json::from_str(&content)?)} else {println!("首次运行,请输入壁纸保存目录:");let mut input = String::new();std::io::stdin().read_line(&mut input)?;let save_dir = PathBuf::from(input.trim());// 创建目录fs::create_dir_all(&save_dir)?;// 保存配置let config = Config { save_dir };fs::create_dir_all(config_path.parent().unwrap())?;let mut file = File::create(config_path)?;file.write_all(serde_json::to_string_pretty(&config)?.as_bytes())?;Ok(config)}
}fn get_last_monday() -> String {let today = Local::now().date_naive();let days_since_monday = today.weekday().num_days_from_monday();let last_monday = today - Duration::days(days_since_monday.into());last_monday.format("%Y-%m-%d").to_string()
}fn download_image(url: &str) -> Result<Vec<u8>, Box<dyn std::error::Error>> {let response = get(url)?;if !response.status().is_success() {return Err(format!("下载失败: {}", response.status()).into());}Ok(response.bytes()?.to_vec())
}fn save_image(dir: PathBuf, date: &str, data: &[u8]) -> Result<PathBuf, Box<dyn std::error::Error>> {let filename = format!("wallpaper_{}.jpg", date);let path = dir.join(filename);let mut file = File::create(&path)?;file.write_all(data)?;Ok(path)
}fn set_wallpaper(path: &PathBuf) -> Result<(), Box<dyn std::error::Error>> {wallpaper::set_from_path(path.to_str().ok_or("无效路径")?)?;println!("壁纸设置成功");Ok(())
}