废话:
没多大技术含量,看明白原理很简单,这个站点还是有不少漂亮模版可以供参考的;
这是一个收费的模版下载网站,有些模版应该也是网上收集来提供收费下载的;
作为白嫖党肯定一毛不拔的,下午研究了一下,发现其下载验证似乎并不严格;
站点地址:
https://www.bootstrapmb.com/
下载验证:
1.html 等文件有访问源验证,直接从迅雷等三方工具或是浏览器访问会触发检测返回404
2.在站点页面引用就可以正常下载或访问
下载方法:
1.可以利用模版介绍页面提供的模版目录结构预览,往文件名注入A链接供下载;
2.注入方法:[F12]打开控制台粘贴下方我写的js,按回车键,即可自动将预览的目录内的所有文件名添加超链接;
3.直接在文件名右键另存即可下载啦
4.有个短板就是不能批量下载,主要是下载html这些有验证的就好了,js,css,img 那些可以在页面另存直接下载到
本地的;
(async function() {
try {
// 1. 智能识别当前页面路径,动态拼接 preview 地址
let currentPath = window.location.pathname;
// 简单校验:确保是在 item 详情页运行
if (!currentPath.includes('/item/')) {
console.error("❌ 路径错误:请在具体的模板详情页(如 /item/13725)运行此代码!");
return;
}
// 去除末尾可能带有的斜杠,防止拼接出双斜杠
if (currentPath.endsWith('/')) {
currentPath = currentPath.slice(0, -1);
}
// 动态生成属于当前模板的 preview 链接
const previewUrl = currentPath + '/preview';
console.log(`⏳ 正在自动请求当前模板的预览页面: ${previewUrl} ...`);
const response = await fetch(previewUrl);
if (!response.ok) {
throw new Error(`无法访问预览页面: ${response.status}`);
}
const htmlText = await response.text();
// 2. 解析 HTML 寻找 iframe1
const parser = new DOMParser();
const doc = parser.parseFromString(htmlText, 'text/html');
const iframe = doc.getElementById('iframe1');
if (!iframe || !iframe.src) {
throw new Error("在 preview 页面中未找到 id 为 'iframe1' 的 iframe 或其没有 src 属性。");
}
// 3. 处理提取到的 Base URL
const parsedUrl = new URL(iframe.src);
let baseUrl = parsedUrl.origin + parsedUrl.pathname;
if (!baseUrl.endsWith('/')) {
baseUrl += '/';
}
console.log("🔗 成功提取当前模板根目录:", baseUrl);
// 4. 开始处理当前页面上的文件节点
const fileSpans = document.querySelectorAll('span.css, span.file, span.img, span.js, span.html');
if(fileSpans.length === 0){
console.warn("⚠️ 当前页面未找到需要替换的文件节点,请确保您的 DOM 树结构在当前页面可见。");
return;
}
fileSpans.forEach(span => {
if (span.querySelector('a')) return;
const fileName = span.textContent.trim();
if (!fileName) return;
let pathParts = [];
let currentLi = span.closest('li');
while (currentLi) {
const parentUl = currentLi.parentElement;
if (!parentUl || parentUl.id === 'code_tree') {
break;
}
const parentLi = parentUl.closest('li');
if (parentLi) {
const folderSpan = Array.from(parentLi.children).find(child => child.classList.contains('folder'));
if (folderSpan) {
pathParts.unshift(folderSpan.textContent.trim());
}
currentLi = parentLi;
} else {
break;
}
}
const fullRelativePath = pathParts.length > 0 ? `${pathParts.join('/')}/${fileName}` : fileName;
span.innerHTML = `<a href="${baseUrl}${fullRelativePath}" download="${fileName}" target="_blank" style="color: #0066cc; text-decoration: none;">${fileName}</a>`;
});
console.log(`✅ 通用脚本注入完成!共为 ${fileSpans.length} 个文件匹配了真实下载路径。`);
} catch (error) {
console.error("❌ 发生错误:", error.message);
}
})();
程序验证:
1.下载后的程序你会发现本地直接运行正常的,并且[F12]访问控制台会有大量的广告(下面会有清除方法);
2.程序在服务器http方式运行就会自动跳转到模版下载的站点, 那是因为站点自动将用户上传的模版文件js
进行加料后再放入预览页面的, 防止被人下载直接使用的,有些会有混淆增加那么一点点难度;
移除验证:
1.明文JS
示例:
;console.log('源代码唯一下载链接: http://www.*****.com/item/137225(当前备注仅在演示里出现,下载源码不包含) ');
if (location.href.indexOf('ile:') < 0) {
if (location.href.indexOf('bo') < 0) {
self.location.href = 'http%3a%2f%2fwww.****.com%2fitem%2f137225'
}
}
;
1.原理很简单,就是检测地址栏中的字符,本地访问检测file“中ile”字符找到则说明是本地访问不触发验证;
如果没有找到“ile”则为http访问,触发下一步域名白名单字符验证,检测是否包含“bo”字符,如果http
访问的域名不包含“bo”则强制跳转下方的代码下载页面,这里的“bo”并不固定可能是其它字符;
2. 找到每个js中,文件头部与尾部的这个代码移除即可,头部尾部都存在别遗漏了;
2.混淆加密js
实例:
;console[_0x5c2504('0x4')]('源代码唯一下载链接:\x20http://www.bootstrapmb.com/item/13725(当前备注仅在演示里出现,下载源码不包含)\x20');
location[_0x5c2504('0x87')][_0x5c2504('0x9')](_0x5c2504('0x7e')) < 0x0 && (location[_0x5c2504('0x87')][_0x5c2504('0x9')]('bo') < 0x0 && (self[_0x5c2504('0x49')][_0x5c2504('0x87')] = _0x5c2504('0x73')));
;
看到这种混淆加密不要慌,只是将变量名进行转译换个名字增加阅读难度而已,运行原理还是不变的,
大概率还是会有多处加密可能会有3-4次,直接搜索前面找到的字符('bo')进行批量替换为“//”;
因为所有http地址都会包含两个斜杠这样就能完美跳过;
如果对于跳转的那个域名看着不舒服也可以进行替换为你自己的域名;
注意不要将代码格式化,格式化保存后可能会失效(此混淆器有限制的);
控制台广告移除
1.css头部与尾部找到下方此类注释移除即可
/*:源代码唯一下载链接: http://www.****(当前备注仅在演示里出现,下载源码不包含)*/
2. js中搜索下方代码移除
;console.log('源代码唯一下载链接: http://www.****/(当前备注仅在演示里出现,下载源码不包含) ');
最后吐槽一下,这站点也是偷懒,字符转译都懒得写了,如果进行 十六进制 或是 Unicode 转译还能增加些难度;
最后问下,各位大佬有啥批量下载的方法吗!!!