镜像网站 Skill
触发格式
用户输入类似:
CODEBLOCK0
如果用户未提供保存路径,默认使用 /home/claude/mirror/<DOMAIN> 作为保存路径,并在最终输出时告知用户实际路径。
执行步骤
第一步:解析输入
从用户输入中提取:
- -
TARGET_URL:目标网址(自动补全 https://) - INLINECODE3 :保存路径(绝对路径)
- INLINECODE4 :域名部分(用于
--domains 参数)
域名处理规则:
- 1. 先用
curl -sI 测试原始域名,观察是否有 301/302 跳转 - 如果
www.example.com 跳转到 example.com(或反之),使用跳转后的域名作为 DOMAIN 和 INLINECODE10 - 如果无跳转,保持用户输入的域名不变
- INLINECODE11 参数同时包含
www 和非 www 版本,确保不遗漏资源: INLINECODE14
第二步:创建保存目录
CODEBLOCK1
第三步:检测网络连通性与代理
在执行 wget 前,先检测是否能直接连通目标站点:
CODEBLOCK2
如果均不可用,告知用户网络问题并终止。
第四步:执行 wget 镜像下载
CODEBLOCK3
参数说明:
| 参数 | 说明 |
|---|
| INLINECODE15 | 递归深度5层 |
| INLINECODE16 |
下载页面所需的CSS/JS/图片 |
|
--convert-links | 转换链接为本地路径 |
|
--domains | 同时包含 www 和非 www,避免遗漏 |
|
--wait=2 --random-wait | 随机等待,避免被封 |
|
--no-check-certificate | 跳过SSL证书验证 |
|
-e robots=off | 忽略 robots.txt |
注意:不使用 --html-extension / --adjust-extension。 该参数会根据 Content-Type 自动追加扩展名,导致 fontawesome.min.css 被保存为 fontawesome.min.css.css。
第五步:补充下载带参数的资源(?v=xxx 类)
wget 的 --page-requisites 经常无法正确下载 URL 末尾带查询参数的资源(如 player.js?v=2、style.css?v=20251204)。
需要从已下载的 HTML 中提取这些资源链接,逐个单独下载到去除查询参数后的正确文件名。
⚠️ 重要:此步骤必须使用文件写入工具创建脚本,然后执行,不要在终端逐条运行。
使用 create_file 在 <SAVE_PATH>/fetch-query-assets.sh 创建以下脚本:
CODEBLOCK4
写入后执行:
CODEBLOCK5
第六步:创建 fix-filenames.sh 修复脚本并执行
所有文件下载完成后,使用 create_file 工具在 <SAVE_PATH>/fix-filenames.sh 创建以下脚本,然后用 bash 执行。
⚠️ 重要:必须使用文件写入工具一次性写入完整脚本,不要用 echo 逐行拼接,也不要把清理命令零散地逐条运行在终端中。
以下是 fix-filenames.sh 的完整内容:
CODEBLOCK6
写入完成后执行:
CODEBLOCK7
第七步:验证结果
执行简单验证确保镜像可用:
CODEBLOCK8
第八步:启动本地预览服务器
清理完成后,在保存目录下启动一个 Python HTTP 服务器,方便用户在浏览器中预览镜像效果。
CODEBLOCK9
注意事项:
- - 服务器工作目录是
<SAVE_PATH>/<DOMAIN>(即网站根目录),这样访问 http://localhost:9527 就相当于访问网站首页 - 默认端口 9527,如果被占用会自动递增寻找可用端口
- 使用
nohup 后台运行,不会阻塞终端 - 告知用户 PID,方便随时
kill 停止服务
第九步:输出结果摘要
完成后告知用户:
- - 保存路径
- 下载文件数量(
find <SAVE_PATH> -type f | wc -l) - 验证结果(是否有残留问题)
- 预览地址(
http://localhost:<PORT>) - 停止服务器命令(
kill <SERVER_PID>) - 如果后续需要重新修复文件名,可以再次运行: INLINECODE43
常见问题处理
连接被拒绝 / SSL 失败
第三步已自动检测代理。如果仍然失败,告知用户需要开启代理工具(如 Clash)。
只下载了首页
通常是域名重定向问题(www → 非www),已在第一步通过 curl 跳转检测处理。如果仍有问题,检查目标站是否为 SPA(单页应用),wget 无法抓取 JS 渲染的内容。
下载速度过慢
可调整
--wait=1 或去掉
--random-wait,但注意可能被服务器限速。
动态内容(JS 渲染的页面)无法抓取
wget 不支持 JavaScript 渲染,这类网站建议用 Puppeteer 或 Playwright。告知用户此 skill 适用于传统服务端渲染(SSR)网站。
下载完成后文件名仍有问题
重新执行修复脚本即可:
CODEBLOCK10
部分资源 404
某些带查询参数的资源可能在服务器端依赖查询参数来返回不同内容(如版本化 CDN)。这种情况下去掉参数后可能 404,属于正常现象,不影响大多数静态站点的镜像。
镜像网站 Skill
触发格式
用户输入类似:
镜像网站: www.example.com,保存地址: /a/b/c
如果用户未提供保存路径,默认使用 /home/claude/mirror/ 作为保存路径,并在最终输出时告知用户实际路径。
执行步骤
第一步:解析输入
从用户输入中提取:
- - TARGETURL:目标网址(自动补全 https://)
- SAVEPATH:保存路径(绝对路径)
- DOMAIN:域名部分(用于 --domains 参数)
域名处理规则:
- 1. 先用 curl -sI 测试原始域名,观察是否有 301/302 跳转
- 如果 www.example.com 跳转到 example.com(或反之),使用跳转后的域名作为 DOMAIN 和 TARGET_URL
- 如果无跳转,保持用户输入的域名不变
- --domains 参数同时包含 www 和非 www 版本,确保不遗漏资源:--domains example.com,www.example.com
第二步:创建保存目录
bash
mkdir -p
第三步:检测网络连通性与代理
在执行 wget 前,先检测是否能直接连通目标站点:
bash
先尝试直连
curl -sI --connect-timeout 5 https://
/ > /dev/null 2>&1
DIRECT=$?
如果直连失败,尝试常见代理
if [ $DIRECT -ne 0 ]; then
curl -sI --connect-timeout 5 -x http://127.0.0.1:7890 https:/// > /dev/null 2>&1
if [ $? -eq 0 ]; then
export https_proxy=http://127.0.0.1:7890
export http_proxy=http://127.0.0.1:7890
echo 使用代理: http://127.0.0.1:7890
else
echo 警告: 直连和代理均无法访问目标站点,请检查网络
fi
else
echo 直连可用,无需代理
fi
如果均不可用,告知用户网络问题并终止。
第四步:执行 wget 镜像下载
bash
wget --recursive \
--level=5 \
--page-requisites \
--convert-links \
--domains ,www. \
--wait=2 \
--random-wait \
--no-check-certificate \
--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 \
--header=Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 \
--header=Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 \
-e robots=off \
-P \
https:///
参数说明:
| 参数 | 说明 |
|---|
| --level=5 | 递归深度5层 |
| --page-requisites |
下载页面所需的CSS/JS/图片 |
| --convert-links | 转换链接为本地路径 |
| --domains | 同时包含 www 和非 www,避免遗漏 |
| --wait=2 --random-wait | 随机等待,避免被封 |
| --no-check-certificate | 跳过SSL证书验证 |
| -e robots=off | 忽略 robots.txt |
注意:不使用 --html-extension / --adjust-extension。 该参数会根据 Content-Type 自动追加扩展名,导致 fontawesome.min.css 被保存为 fontawesome.min.css.css。
第五步:补充下载带参数的资源(?v=xxx 类)
wget 的 --page-requisites 经常无法正确下载 URL 末尾带查询参数的资源(如 player.js?v=2、style.css?v=20251204)。
需要从已下载的 HTML 中提取这些资源链接,逐个单独下载到去除查询参数后的正确文件名。
⚠️ 重要:此步骤必须使用文件写入工具创建脚本,然后执行,不要在终端逐条运行。
使用 createfile 在 PATH>/fetch-query-assets.sh 创建以下脚本:
bash
#!/bin/bash
补充下载带 ?query 参数的资源文件
用法:bash fetch-query-assets.sh <下载目录> <域名>
DIR=$1
DOMAIN=$2
if [ -z $DIR ] || [ -z $DOMAIN ]; then
echo 用法: bash fetch-query-assets.sh <下载目录> <域名>
exit 1
fi
cd $DIR || exit 1
echo === 扫描带查询参数的资源引用 ===
从 HTML 文件中提取所有带 ? 的 src/href 引用
{
grep -roh --include=.html -E (src|href)=[^]\?[^]* .
grep -roh --include=.html -E (src|href)=[^]\?[^]* .
} | sed -E s/^(src|href)=\[\]$/\2/ | sort -u | while IFS= read -r url; do
# 跳过完整 URL(外部资源)
echo $url | grep -qE ^(https?://|//) && continue
# 去掉查询参数得到本地文件路径
clean_path=$(echo $url | sed s/\?.*//)
# 构建完整下载 URL
if echo $url | grep -q ^/; then
full_url=https://${DOMAIN}${url}
localfile=${DIR}/${DOMAIN}${cleanpath}
else
full_url=https://${DOMAIN}/${url}
localfile=${DIR}/${DOMAIN}/${cleanpath}
fi
# 如果文件已存在则跳过
if [ -f $local_file ]; then
continue
fi
echo 下载: $fullurl → $localfile
mkdir -p $(dirname $local_file)
wget -q --no-check-certificate \
--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/122.0.0.0 \
-O $local_file \
$fullurl || echo 失败: $fullurl
done
echo === 补充下载完成 ===
写入后执行:
bash
bash PATH>/fetch-query-assets.sh PATH>
第六步:创建 fix-filenames.sh 修复脚本并执行
所有文件下载完成后,使用 createfile 工具在 PATH>/fix-filenames.sh 创建以下脚本,然后用 bash 执行。
⚠️ 重要:必须使用文件写入工具一次性写入完整脚本,不要用 echo 逐行拼接,也不要把清理命令零散地逐条运行在终端中。
以下是 fix-filenames.sh 的完整内容:
bash
#!/bin/bash
修复 wget 镜像下载后的文件名和引用路径问题
用法:bash fix-filenames.sh /path/to/download/dir
DIR=$1
if [ -z $DIR ]; then
echo 用法: bash fix-filenames.sh <下载目录路径>
exit 1
fi
if [ ! -d $DIR ]; then
echo 错误: 目录不存在: $DIR
exit 1
fi
cd $DIR || exit 1
echo === 开始修复: $(pwd) ===
echo 修复前文件总数: $(find . -type f | wc -l)
========================================
1. 去除文件名中查询参数
同时处理两种情况:
a) 文件名含真实 ?: DPlayer.min.js?v=5 → DPlayer.min.js
b) 文件名含编码 %3F:DPlayer.min.js%3Fv=5 → DPlayer.min.js
c) 参数后还带扩展名:mirages.min.css?v=20251215.css → mirages.min.css
========================================
echo
echo --- 阶段1: 去除文件名中的查询参数 ---
renamequeryfile() {
local f=$1
local newname=$2
if [ $