-
Linux 一键dd脚本更新,更新Fedora 39支持,适用于大部分VPS主机和部分独立服务器
inux一键dd脚本支持Debian 11/12、Ubuntu/20.04、RockyLinux 8/9和AlmaLinux 8/9系统的网络重装,自动适配境内境外系统源(境内使用阿里云,境外使用官方),适用于 GigsGigsCloud、AkkoCloud、GreenCloud、CloudCone和腾讯云等vps、云服务器和部分独立服务器。 本次更新 更新 Fedora 37/38/39 系统DD支持; 移除已结束声明周期的系统版本。 使用命令: wget -N --no-check-certificate https://down.vpsaff.net/linux/dd/network-reinstall-os.sh && \ chmod +x network-reinstall-os.sh && ./network-reinstall-os.sh 其他版本: Linux reinstall:一款功能强大的服务器系统一键重装脚本 - 聿纾的文章 - 知乎https://zhuanlan.zhihu.com/p/580612280... -
Python 智能文件整理器:高效分组,轻松管理海量文件
在日常工作中,面对庞大的文件数量,整理工作往往耗时又繁琐。为此,我使用 Python 编写了一款实用的文件整理器。它能够将目录里的文件按每 1000 个整理到一个文件夹中,首先分析整个目录的文件数量,然后自动新建文件夹(如文件夹 1、文件夹 2 等),将相应数量的文件精准移动。 功能亮点 : 文件收集 :借助 os.scandir() 高效获取目录中的所有文件,精准排除子目录,确保只处理目标文件。 排序处理 :对文件名进行排序,让每次整理的结果都保持一致,方便后续查找与管理。 智能分组 :自动计算所需文件夹数量,采用向上取整的方式,还支持自定义批量大小,默认为 1000,灵活适配不同需求。 安全处理 :自动检测同名文件 / 目录,提供友好的进度提示,对于错误文件也会有明确的处理提示,保障整理过程的顺利进行。 高效移动 :利用 shutil.move() 实现文件的快速移动操作。 新版本升级 : 增强路径输入验证 :新增 get_valid_directory() 函数,支持路径中带空格的处理,自动去除路径中的引号,循环验证直到输入有效路径,还支持输入 q 退出程序,让操作更加便捷与人性化。 交互优化 :添加整理前的统计信息确认,以百分比形式显示进度条,使用三位数编号的文件夹(如 001、002...010),完成提示更加清晰,错误文件单独提示,不影响整体进度,提升用户体验。 新增功能 :运用 os.makedirs(exist_ok=True) 自动处理已存在目录,显示每个文件夹的实际移动成功率,添加程序标题和结束标识,异常处理更加完善。 显示优化 :采用符号(✓ × !)增强可读性,统计信息显示对齐,进度更新使用回车符实现原地刷新,让界面更加简洁直观。 使用方法 : 运行程序后,会立即提示输入路径,支持拖拽文件夹到命令行快速输入路径,输入路径后可查看统计信息并确认,在处理过程中会显示实时进度,每个文件夹处理完成后会显示成功统计。特别注意,此版本已支持路径中包含空格的情况,可直接拖拽包含空格的文件夹路径到命令行中使用,让你轻松告别文件整理的烦恼,大幅提升工作效率。 代码: import os import shutil from math import ceil def get_valid_directory(): """获取有效的目录路径""" while True: path = input("请输入要整理的目录路径(或输入q退出): ").strip() if path.lower() == 'q': exit() # 处理路径中的引号和空格 path = path.replace('"', '').replace("'", "") if not os.path.exists(path): print(f"× 路径不存在:{path}") continue if not os.path.isdir(path): print(f"× 这不是一个目录:{path}") continue return os.path.abspath(path) def organize_files(source_dir, batch_size=1000): try: # 获取所有文件列表(排除目录) files = [] with os.scandir(source_dir) as entries: for entry in entries: if entry.is_file(): files.append(entry.name) # 按文件名排序 files.sort() total_files = len(files) if total_files == 0: print("没有找到需要整理的文件") return # 显示统计信息 print("\n" + "="*40) print(f"目录路径:{source_dir}") print(f"文件总数:{total_files}") print(f"每个文件夹存放数量:{batch_size}") print(f"将创建 {ceil(total_files / batch_size)} 个文件夹") print("="*40 + "\n") # 用户确认 confirm = input("是否开始整理?(y/n) ").lower() if confirm != 'y': print("操作已取消") return # 创建文件夹并移动文件 for i in range(ceil(total_files / batch_size)): folder_name = os.path.join(source_dir, f"文件夹{i+1:03d}") # 使用三位数编号 # 创建文件夹(如果不存在) os.makedirs(folder_name, exist_ok=True) # 获取当前批次的文件 start = i * batch_size end = start + batch_size current_batch = files[start:end] # 移动文件并显示进度 moved = 0 for idx, filename in enumerate(current_batch, 1): src_path = os.path.join(source_dir,…... -
宝塔 Docker 更改镜像和容器的存放路径
默认都存放在系统盘,导致某些机器的系统盘负载严重,可以使用以下方式更改,请自行备份数据。 在数据盘里新建一个目录存放docker,我这里在/www/下新建一个docker文件夹,也就是/www/docker 打开以下文件修改: /etc/docker/daemon.json 将修改写进这个json文件里: { "data-root": "/www/docker/", "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"] } 请注意json的书写格式。 修改完后输入命令重启docker systemctl restart docker 有数据的,可以先数据迁移到新目录里。... -
Python 实现 360 壁纸爬虫:随机延时防封,智能分类与自动重命名
本文将分享一款实用的 360 壁纸爬虫 Python 脚本。只需输入分类,爬虫便会自动执行,遇到下载失败的情况会贴心地进行重试,最多重试 3 次,确保尽可能完整地获取资源。当所有壁纸下载完毕后,程序还会自动关闭,无需人工干预。更值得一提的是,下载的图片会依据分辨率尺寸自动重命名,方便后续的归类与查找,为您的壁纸管理带来高效便捷的体验。 源代码: import requests import os import time import random import hashlib from urllib.parse import urlparse def download_wallpapers(category_id): # 配置请求头和存储路径 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" } save_dir = os.path.join("downloads", f"category_{category_id}") os.makedirs(save_dir, exist_ok=True) start = 0 per_page = 50 # 每次请求的图片数量 retry_limit = 3 # 单个图片下载重试次数 total_downloaded = 0 while True: # 构造API请求URL api_url = f"http://wallpaper.apc.360.cn/index.php?c=WallPaper&a=getAppsByCategory&cid={category_id}&start={start}&count={per_page}" try: # 带重试机制的API请求 response = requests.get(api_url, headers=headers, timeout=15) response.raise_for_status() data = response.json() if not data.get('data'): print(f"没有更多数据,已下载 {total_downloaded} 张图片") break # 处理每张壁纸 for item in data['data']: img_url = item.get('url') resolution = item.get('resolution', 'unknown').replace('x', '_') if not img_url: continue # 生成唯一文件名 url_hash = hashlib.md5(img_url.encode()).hexdigest()[:10] file_ext = os.path.splitext(urlparse(img_url).path)[1] or '.jpg' filename = f"{resolution}_{url_hash}{file_ext}" file_path = os.path.join(save_dir, filename) if os.path.exists(file_path): continue # 带重试机制的图片下载 for attempt in range(retry_limit): try: img_resp = requests.get(img_url, headers=headers, timeout=20) img_resp.raise_for_status() with open(file_path, 'wb') as f: f.write(img_resp.content) total_downloaded += 1 print(f"成功下载:{filename}") break except Exception as e: if attempt == retry_limit - 1: print(f"下载失败(已重试{retry_limit}次):{img_url}") time.sleep(random.uniform(1, 3)) # 随机延迟防止封禁 time.sleep(random.uniform(0.5, 1.5)) # 更新分页参数 start += per_page # 批次间较长延迟 time.sleep(random.uniform(2, 5)) except requests.exceptions.RequestException as e: print(f"API请求失败: {str(e)}") break except Exception as e: print(f"发生未知错误: {str(e)}") break if __name__ == "__main__": try: cid =…... -
DeepSeek满血版体验其实很简单
这里提供两个比较简单的方法,其实根本不用自己去部署DeepSeek,残端就没有必要去花时间部署了。 最简单的方法就是白嫖大厂的R1满血版,比如360的纳米AI助手。 另外就是去调用满血版的API,但这个有一定的费用存在。 去硅基流动上注册个账号,再新建一个API密钥。 然后用Chatbox之类的APP去使用API即可。 通常都是在Model provider找到SiliconFlow(硅基流动) API的选项,再把硅基流动的API密钥,复制到对应位置就可以体验了。 如果没有SiliconFlow API这个选项的,可以使用手动填入接口:https://api.siliconflow.cn/v1,就使用OpenAI 接口调用。 对比官方免费,这个方式存在一些费用,但稍微会比官网的体验要好一丢丢。 如果你需要使用后者,可以使用我的邀请码hqRkUtes,14 元平台配额,皆大欢喜。... -
npm : 无法加载文件 C:\NodeJS\npm.ps1,因为在此系统上禁止运行脚本 【解决办法】
错误显示 npm : 无法加载文件 C:\NodeJS\npm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlin k/?LinkID=135170 中的 about_Execution_Policies。 所在位置 行:1 字符: 1 npm init 解决办法 第一步:执行如下命令查看权限 get-ExecutionPolicy 禁用状态 第二步:执行如下命令设置可用 set-executionpolicy remotesigned 依需求执行选项后就可以了。... -
使用雨云对象储存,备份宝塔数据
宝塔面板相信是给位朋友经常使用的面板,可以极大简化建站的流程,小白也可以轻松上手。 为了数据的安全,定期对于数据备份很有必要,宝塔面板也提供了一系列的备份插件,但是对于非大厂的对象储存并不友好,因此我们需要对宝塔的插件进行修改。 1.下载s3插件 你可以在 软件商店 — 免费应用 中,找到亚马逊s3云存储,请下载和安装这个插件 2.找到 aws_s3.py 文件 s3插件默认是对接到亚马逊的s3,因此需要对插件进行修改,添加雨云的 Endpoint 我们需要需要修改 “/www/server/panel/plugin/aws_s3/s3lib/client/aws_s3.py” 这个文件 3.修改 aws_s3.py 文件 请使用 Ctrl + F ,搜索 build_auth 找到如下图的位置,并在箭头所示位置添加代码 endpoint_url="https://cn-sy1.rains3.com", xxxx 应当替换为在雨云对象存储中所显示的 API 端点 (目前只有一个区,可以直接填写 endpoint_url=xxxx 4) 修改完成后,请不要忘记保存!! 4.在插件中填写 Access Key 和 Secret Key 5.在计划任务中配置备份 TIPS: 为了确保数据的安全,最好采取异地备份,如雨云当前提供的对象储存部署在十堰地区,十堰地区的用户最好还是不要往这个区备份了,等待后续区域开放之后再使用。... -
检查是否还存在统计鸟的JS代码
主域名国内经常打不开,有跳灰产,建议检查一下所有的业务网站,是否还存在统计鸟的JS代码。 尽快清除统计鸟相关的所有代码。 暂停使用统计鸟统计。... -
Firefox Addon 踩坑指南
抄录一下该推文。 background.service_worker is currently disabled 这是因为在manifestV3中,Firefox与Chrome针对后台程序的处理有差异导致的。其实Firefox也是能使用后台程序的,但是不能直接写成service_worker。直接用service_worker,Firefox将会报错。 正确的写法应该是使用”scripts”代替”service_worker”,Firefox的后台程序变成了background_script。 The extension ID is required in Manifest Version 3 and above 上传产物压缩包到AMO的时候,可能会遇到这个问题,这个是因为Firefox在mainfestV3及以上版本中要求增加一个插件ID号和最低版本限制导致的,需要在manifest.json中增加该字段才可以。 最低版本号可以参考你所用的浏览器API限制来决定,id一般使用<插件名>+@+<个人域名>就可以了(只要保证ID唯一即可)。... -
视频转GIF小工具
Python写的,一个很简单的小工具,闲来无事做了一个玩玩。 代码部分: import tkinter as tk from tkinter import filedialog, messagebox, ttk from moviepy.editor import VideoFileClip import threading import os def video_to_gif(input_video_path, output_gif_path, start_time=None, end_time=None, progress_var=None): """ 将视频转换为GIF。 参数: - input_video_path: 输入视频文件路径 - output_gif_path: 输出GIF文件路径 - start_time: GIF的开始时间(以秒为单位),默认为视频开头 - end_time: GIF的结束时间(以秒为单位),默认为视频结尾 - progress_var: 用于显示进度的 tk.IntVar 对象 """ try: # 加载视频文件 video_clip = VideoFileClip(input_video_path) # 裁剪视频到指定时间段 if start_time is not None and end_time is not None: video_clip = video_clip.subclip(start_time, end_time) # 将视频转换为GIF并保存 video_clip.write_gif(output_gif_path) # 更新进度为100% if progress_var: progress_var.set(100) messagebox.showinfo("完成", f"GIF已成功保存为 {output_gif_path}") except Exception as e: messagebox.showerror("错误", f"转换过程中出现错误: {e}") def convert_to_gif(files): start = start_time.get() end = end_time.get() try: start = float(start) if start else None end = float(end) if end else None except ValueError: messagebox.showerror("错误", "请输入有效的起始和结束时间。") return # 为每个文件创建线程 for file_path in files: output_path = os.path.splitext(file_path)[0] + ".gif" # 创建一个进度条 progress_var = tk.IntVar() progress_bar = ttk.Progressbar(root, orient="horizontal", length=300, mode="determinate", variable=progress_var) progress_bar.pack(pady=5) progress_bar_label = tk.Label(root, text=f"转换中: {os.path.basename(file_path)}") progress_bar_label.pack() # 启动转换线程 conversion_thread = threading.Thread(target=video_to_gif, args=(file_path, output_path, start, end, progress_var)) conversion_thread.start() def select_files(): file_paths = filedialog.askopenfilenames(filetypes=[("Video files", "*.mp4;*.avi;*.mov;*.mkv")]) if file_paths: # 将选中的文件路径显示在上方框内 file_list.set('\n'.join(file_paths)) convert_button.config(state=tk.NORMAL) # 创建主窗口 root = tk.Tk() root.title("批量视频转GIF工具") root.geometry("600x400") # 视频路径显示 file_list = tk.StringVar() video_label = tk.Label(root, textvariable=file_list, width=60, height=4, relief="sunken", anchor="w", justify="left") video_label.pack(pady=10) # 文件选择按钮 select_button = tk.Button(root, text="选择文件", command=select_files) select_button.pack(pady=10) #…...







