3-2 WPS JS宏 工作簿的打开、保存与自动化模板分发实战笔记
1. 从手动重复到一键生成为什么你需要掌握WPS JS宏如果你每个月都要做报表我猜你肯定经历过这种痛苦打开上个月的Excel文件小心翼翼地把“1月”改成“2月”然后另存为一个新文件生怕手滑覆盖了原文件。接着如果还有“3月”、“4月”……光是想想就头大。我以前在财务部帮忙的时候每个月头三天基本就耗在这种重复的复制、改名、保存上了不仅枯燥还特别容易出错一旦手抖存错了地方或者覆盖了重要数据那真是欲哭无泪。后来我接触到了WPS里的JS宏简直像是打开了新世界的大门。你可能听说过VBA那是微软Office的“祖传”自动化工具但WPS深度兼容的JS宏用的是更现代、也更友好的JavaScript语言。它的核心价值就是把你从这些重复、机械的劳动中彻底解放出来。想象一下你只需要点一个按钮或者设置一个定时任务电脑就能自动帮你打开一个设计好的模板然后像有个看不见的助手一样刷刷刷地生成一整套以“1月”、“2月”……命名的独立文件整整齐齐地放在你指定的文件夹里。你省下来的时间喝杯咖啡、琢磨一下业务分析不是更香吗这个场景特别适合行政、财务、人事、销售数据分析等岗位的朋友。你们的工作里肯定少不了各种周期性的报表月度考勤表、部门费用汇总、销售业绩统计、项目进度跟踪……这些表格的结构往往每月、每周都一样变的只是里面的数据和标题里的时间。用JS宏把固定流程自动化就是为你量身定做的效率神器。今天我就以“按月批量生成工作簿”这个最典型的场景为例手把手带你走通整个流程从打开一个模板到循环生成12个月的文件最后完美保存。你会发现原来写几行代码就能让电脑替你干这么多活。2. 核心武器库认识Workbooks.Open和SaveAs方法在开始动手写代码之前我们得先认识一下今天要用的两件“核心武器”。它们就像是你的左右手一个负责“拿进来”一个负责“送出去”。第一件武器Workbooks.Open—— 你的文件“开门咒”这个方法的任务很简单就是打开一个已经存在的工作簿文件。它的基本用法长这样var wb Workbooks.Open(C:\\我的文档\\报表模板.xlsx);这行代码执行后WPS就会去打开指定路径下的“报表模板.xlsx”文件并且把这个打开的文件对象赋值给变量wb。之后你想对这个文件做什么操作比如改某个单元格的值、复制某个工作表都可以通过wb这个“遥控器”来指挥。这里有几个新手特别容易踩的坑我得重点提一下路径的写法在JavaScript字符串里反斜杠\是特殊字符比如\n代表换行。所以直接写C:\我的文档\模板.xlsx会出错。有两种解决办法一是用两个反斜杠\\来转义就像上面例子那样写成C:\\我的文档\\模板.xlsx二是用正斜杠/WPS也能识别比如C:/我的文档/模板.xlsx这样更清爽。文件扩展名一定要写全是.xlsx、.xls还是.xlsm包含宏的工作簿一个字母都不能错。我刚开始就老忘记结果代码报错“文件未找到”对着屏幕愣了半天才发现是后缀名没写对。获取当前文件路径为了让你的宏更灵活不管你把模板文件放在哪里都能正确找到我们通常会用到ThisWorkbook.Path。ThisWorkbook指的是当前正在运行这个JS宏代码的那个工作簿本身。所以ThisWorkbook.Path就能动态获取到这个工作簿所在的文件夹路径。这样组合起来用非常方便var templatePath ThisWorkbook.Path \\报表模板.xlsx; var wb Workbooks.Open(templatePath);这样只要你的模板文件和这个宏文件在同一个文件夹里代码就能自动找到它不用你每次去修改那个复杂的绝对路径。第二件武器Workbook.SaveAs—— 给文件“起名安家”文件打开了修改好了最后得保存吧SaveAs方法就是干这个的而且它最厉害的地方在于“另存为”可以保存成一个全新的文件名完全不会动原来的模板文件。它的基本用法如下wb.SaveAs(C:\\我的文档\\2025年1月报表.xlsx);执行这行代码就会把wb这个工作簿对象以新名字“2025年1月报表.xlsx”保存到指定路径。原模板文件依然完好无损。这里的关键在于文件名的动态生成。我们不可能把12个月的名字都手写一遍。这就需要用到字符串拼接或者模板字符串。比如用一个循环变量month// 方法一字符串拼接传统但清晰 wb.SaveAs(C:\\报表\\2025年 month 月.xlsx); // 方法二模板字符串ES6语法更直观推荐 wb.SaveAs(C:\\报表\\2025年${month}月.xlsx);我强烈推荐使用第二种模板字符串的写法用反引号包裹。你看到里面的${month}了吗WPS JS宏环境支持这种语法它会直接把变量month的值替换进去生成像“2025年1月.xlsx”这样的动态文件名写起来非常直观不容易出错。3. 实战第一步编写你的第一个文件打开与保存宏理论说再多不如动手试一下。我们从一个最简单的例子开始确保你的“开门咒”和“安家术”都念对了。3.1 基础操作打开、修改、保存、关闭我们先写一个函数它的任务是打开同目录下的一个名为“预算模板.xlsx”的文件在它的B2单元格里填入数字1000然后保存并关闭。这个流程虽然简单但包含了最核心的四个动作。function 打开并修改模板() { // 1. 获取当前宏文件所在的目录路径 var currentPath ThisWorkbook.Path; // 2. 拼接出模板文件的完整路径 // 假设模板文件名叫“预算模板.xlsx”和这个宏文件放在一起 var templateFullPath currentPath \\预算模板.xlsx; // 3. 使用Open方法打开模板文件 // 打开后返回一个工作簿对象我们把它存到变量wb里方便后续操作 var wb Workbooks.Open(templateFullPath); // 4. 对打开的工作簿进行操作 // 这里我们选中B2单元格并给它赋值1000 // 注意此时wb是活动工作簿Range对象默认就操作它 wb.ActiveSheet.Range(B2).Value2 1000; // 你也可以写成wb.Worksheets.Item(1).Range(B2).Value2 1000; 更精确地指定第一个工作表 // 5. 保存并关闭工作簿 // Close方法的参数是是否保存更改true表示保存false表示不保存直接关闭 wb.Close(true); }把这段代码复制到WPS的JS宏编辑器里按AltF11或从“开发工具”选项卡进入然后运行一下。运行前请务必在你存放这个宏文件的文件夹里提前准备好一个名为“预算模板.xlsx”的文件。运行成功后你去打开那个“预算模板.xlsx”看看B2单元格是不是已经变成了1000这就是自动化修改的魔力。3.2 关键技巧灵活运用路径与对象在实际项目中文件结构可能更复杂。比如你的模板文件可能放在一个叫“Templates”的子文件夹里而生成的新文件要放到“2025年度报表”文件夹里。这就需要更灵活的路径处理。function 按结构保存文件() { var basePath ThisWorkbook.Path; // 宏文件所在根目录 // 打开子文件夹中的模板 var templatePath basePath \\Templates\\年度预算模板.xlsx; var wb Workbooks.Open(templatePath); // 进行一些修改... wb.ActiveSheet.Range(A1).Value2 2025年度预算; // 另存到另一个子文件夹中并动态命名 var saveFolderPath basePath \\2025年度报表; // 这里假设我们想保存为“2025年预算_最终版.xlsx” var newFileName 2025年预算_最终版.xlsx; var fullSavePath saveFolderPath \\ newFileName; // 使用SaveAs保存 wb.SaveAs(fullSavePath); // 关闭工作簿由于已经SaveAs原模板未改动这里关闭可以不保存 wb.Close(false); }注意上面代码里的wb.Close(false)。因为我们在保存时已经用了SaveAs创建了新文件对于打开的模板工作簿对象wb我们并没有修改它修改的是另存后的新文件在内存中的副本这里需要理解SaveAs之后wb这个对象指向的文件已经变成了新保存的那个文件而原始的模板文件在磁盘上从未被打开修改过所以关闭wb时选择不保存false是安全的不会影响模板。这是一个重要的细节能保证你的原始模板永远干净。4. 实现自动化核心用循环逻辑批量生成文件单个文件的处理只是热身批量处理才是JS宏真正发挥威力的地方。而实现批量的关键就在于循环。我们用一个for循环让计算机重复执行“打开-另存”这个动作。4.1 构建循环让代码自己数数假设我们要生成2025年1月到12月共12个报表文件。手动写12次SaveAs代码是不可想象的。用循环我们只需要告诉电脑规则“从1开始到12结束每次增加1用这个数字去生成文件名”。function 批量生成月度报表() { var basePath ThisWorkbook.Path; var templatePath basePath \\月度报表模板.xlsx; // 创建用于存放结果的年度文件夹如果不存在的话 var yearFolderPath basePath \\2025年报表; // 这里可以添加检查文件夹是否存在的逻辑如果不存在则创建需调用FileSystemObject稍复杂初学者可先手动创建好文件夹 // 核心for循环 for (var month 1; month 12; month) { // 循环体开始以下代码会对month1,2,3...12各执行一次 // 1. 打开模板 // 注意每次循环都要重新打开一次模板确保每次操作的都是最原始的模板 var wb Workbooks.Open(templatePath); // 2. 可选在另存前可以根据月份修改模板内容 // 例如把表格标题里的月份更新掉 wb.ActiveSheet.Range(A1).Value2 2025年${month}月销售报表; // 3. 动态生成新文件名并另存 var newFilePath ${yearFolderPath}\\2025年${month}月.xlsx; wb.SaveAs(newFilePath); // 4. 关闭工作簿 wb.Close(false); // 使用false因为我们已通过SaveAs创建了新文件 } // 循环结束 }运行这个函数只要几秒钟你就能在“2025年报表”文件夹里看到从“2025年1月.xlsx”到“2025年12月.xlsx”整整12个文件每个文件里的A1单元格都自动填好了对应的月份标题。这就是循环的威力4.2 避坑指南循环中的常见错误与优化我刚开始写这种循环时犯过一个典型的错误导致生成的文件全是乱的这里分享给你避免重蹈覆辙错误示范在循环外打开工作簿function 错误的批量生成() { var basePath ThisWorkbook.Path; var templatePath basePath \\模板.xlsx; var wb Workbooks.Open(templatePath); // 【错误】在循环外只打开了一次 for (var month 1; month 12; month) { wb.ActiveSheet.Range(A1).Value2 ${month}月; // 修改的是同一个wb对象 wb.SaveAs(${basePath}\\${month}月.xlsx); // 第一次保存后wb对象指向的文件已经变了 } wb.Close(true); // 最后关闭的不知道是哪个文件了 }这个代码的问题在于wb在循环外只打开了一次。第一次循环时它修改模板并另存为“1月.xlsx”。但SaveAs之后变量wb指向的对象就变成了这个新保存的“1月.xlsx”文件本身在内存中。第二次循环时wb.ActiveSheet.Range(A1).Value2 2月修改的就不再是原始模板而是刚刚生成的“1月.xlsx”文件然后它又把“1月.xlsx”内容已被改成2月另存为“2月.xlsx”……结果就是所有文件的内容都乱了套只有最后一个文件可能是对的。正确做法就像我在4.1给出的示例那样必须把Workbooks.Open和wb.Close()放在循环体内部。这样每次循环都是一个新的开始打开原始模板 - 修改 - 另存为新文件 - 关闭。每个新文件都源于一份干净的模板互不干扰。另一个优化点是错误处理。如果文件夹不存在或者模板文件被占用代码会报错停止。更健壮的写法可以加入try...catch语句来捕获异常让程序更友好。例如for (var month 1; month 12; month) { try { var wb Workbooks.Open(templatePath); // ... 修改操作 ... wb.SaveAs(newFilePath); wb.Close(false); Console.log(${month}月文件生成成功); // 在WPS宏编辑器的“立即窗口”输出日志 } catch (error) { Console.log(生成${month}月文件时出错 error.message); // 可以选择跳过这个月继续下一个循环 continue; } }5. 完整实战月度报表模板自动化分发系统现在我们把前面学到的所有知识组合起来打造一个更贴近真实场景的“月度报表自动化分发系统”。这个系统不仅批量生成文件还会在生成时根据月份填充一些初始数据比如月份名称、当月天数甚至预设一些公式。5.1 场景深化一个功能更丰富的模板假设我们的“月度销售报表模板.xlsx”结构稍微复杂点A1单元格报表标题需要动态填入“XXXX年XX月销售报表”。B3单元格固定文字“本月天数”。C3单元格需要根据月份自动填入当月的天数考虑平年。从第5行开始是数据区域我们可能想预填一些表头或者清空上个月的数据。我们的JS宏就需要完成这些自动化填充。5.2 代码实现集成打开、循环、逻辑判断与保存function 生成年度销售报表集() { var basePath ThisWorkbook.Path; var templateName 月度销售报表模板.xlsx; var templatePath basePath \\ templateName; var outputDir basePath \\2025年销售报表; // 建议在实际运行前可以弹窗确认一下 // if (confirm(即将在【 outputDir 】目录下生成12个月份的报表是否继续) false) { // return; // 用户取消则退出函数 // } var year 2025; // 可以设置为动态获取比如根据当前系统日期 for (var month 1; month 12; month) { // 1. 打开原始模板 var sourceWb Workbooks.Open(templatePath); // 获取活动工作表假设模板里只有一个工作表或者我们操作第一个 var ws sourceWb.ActiveSheet; // 2. 动态修改模板内容 // 2.1 更新标题 ws.Range(A1).Value2 year 年 month 月销售报表; // 2.2 计算并填入当月天数 var daysInMonth new Date(year, month, 0).getDate(); // JavaScript小技巧月份从0开始所以month代表下个月的第0天即本月的最后一天 ws.Range(C3).Value2 daysInMonth; // 2.3 清空上一轮可能残留的旧数据假设数据从第5行开始到第100行 var dataRange ws.Range(A5:Z100); // 根据你的实际数据范围调整 dataRange.ClearContents(); // 只清空内容保留格式 // dataRange.Clear(); // 如果要连格式一起清空用这个 // 2.4 可选预填一些固定的表头或公式 ws.Range(A5).Value2 日期; ws.Range(B5).Value2 产品; ws.Range(C5).Value2 销售额; // 在C6单元格设置一个求和公式的示例假设数据从第6行开始 // ws.Range(C6).Formula SUM(C7:C100); // 3. 另存为新文件 // 使用模板字符串构建路径和文件名更清晰 var newFileName ${year}年${month.toString().padStart(2, 0)}月销售报表.xlsx; // 注意padStart(2,0)是为了让月份显示为01,02...12更规范 var fullSavePath ${outputDir}\\${newFileName}; sourceWb.SaveAs(fullSavePath); // 4. 关闭工作簿不保存对原始模板的更改因为已另存 sourceWb.Close(false); // 5. 输出进度信息在WPS宏编辑器的“立即窗口”查看 Console.log(已生成${newFileName}); } Console.log(恭喜全年12个月的销售报表已全部生成完毕。); // 这里可以加上一个弹窗提示 // alert(报表生成完成请查看【 outputDir 】文件夹。); }5.3 运行与调试让你的宏稳定工作写好代码后别急着欢呼。按F5运行前先做好这几步环境检查确保“月度销售报表模板.xlsx”文件就在宏文件同一个目录下。手动创建好“2025年销售报表”输出文件夹。安全设置WPS默认可能禁用宏。你需要点击“启用宏”才能运行。可以在“开发工具”-“宏安全性”里进行设置信任对VBA工程对象模型的访问等根据WPS版本略有不同。逐步调试如果代码没按预期运行可以使用F8键进行单步调试。每按一次执行一行代码。你可以把鼠标悬停在变量如month,fullSavePath上查看它们的当前值这能帮你快速定位逻辑错误或路径错误。查看结果运行完毕后去输出文件夹检查文件是否按预期生成打开一两个文件看看内容如标题、天数是否正确填充。这个完整的例子已经覆盖了从模板准备、动态内容修改、循环控制到文件命名的全流程。你可以根据自己的实际模板结构调整修改单元格的部分ws.Range(...).Value2 ...。比如你的模板里可能有个单元格是写“制表人”的你也可以在宏里自动填入当前操作者的名字通过环境变量获取。6. 进阶技巧与扩展思路掌握了基础批量生成后我们可以玩点更花的让自动化脚本更智能、更强大。6.1 动态命名与复杂规则文件名不一定非要是“1月、2月”。你可以根据任何规则来生成。按列表命名如果你有一组特定的项目名称。var projectList [Alpha项目, Beta项目, Gamma项目]; for (var i 0; i projectList.length; i) { var wb Workbooks.Open(templatePath); wb.ActiveSheet.Range(A1).Value2 projectList[i] 进度报告; wb.SaveAs(${outputDir}\\${projectList[i]}_报告.xlsx); wb.Close(false); }按日期命名生成以当天日期命名的日报或周报。var today new Date(); var dateString today.getFullYear() - (today.getMonth()1).toString().padStart(2, 0) - today.getDate().toString().padStart(2, 0); var wb Workbooks.Open(templatePath); wb.SaveAs(${outputDir}\\每日销售数据_${dateString}.xlsx); wb.Close(false);6.2 交互式增强让用户参与进来完全固定的脚本可能不够灵活。我们可以加入一些简单的交互。输入框获取信息让用户输入年份或前缀。function 交互式生成报表() { // 弹出一个输入框让用户输入年份 var inputYear prompt(请输入要生成报表的年份例如2025:, 2025); if (inputYear null || inputYear ) { alert(已取消操作。); return; // 用户点了取消或没输入 } var year parseInt(inputYear); // 转换为数字 // 接下来就可以使用这个year变量进行循环和命名了 for (var month 1; month 12; month) { // ... 使用 year 和 month 生成文件 ... } alert(报表生成完毕); }选择文件夹路径让用户自己选择把文件存到哪里而不是写死在代码里。这需要调用更复杂的FileDialog对象属于进阶内容但搜索“WPS JS宏 FileDialog”就能找到很多示例。6.3 错误处理与日志记录生产环境的脚本必须健壮。除了前面提到的try...catch还可以把运行日志写入一个文本文件方便事后排查。function 写日志(消息) { var fso new ActiveXObject(Scripting.FileSystemObject); var logFilePath ThisWorkbook.Path \\生成日志.txt; var logFile fso.OpenTextFile(logFilePath, 8, true); // 8追加写入true文件不存在则创建 logFile.WriteLine(new Date().toLocaleString() : 消息); logFile.Close(); } // 然后在循环中成功或失败时调用写日志函数当然使用ActiveXObject可能需要调整WPS的安全设置。对于初学者先用Console.log()在立即窗口查看日志是最简单的。最后分享一个我自己的习惯永远备份你的模板文件。在写宏、调试宏的过程中难免会误操作。把原始的模板文件复制一份放在别的文件夹里再操作或者使用版本控制这是对自己劳动成果最基本的保护。当你看着脚本自动生成几十上百个规整的文件时那种成就感绝对值得你花这点时间去学习和尝试。

相关新闻

如何通过WechatDecrypt实现微信数据的安全自主管理

如何通过WechatDecrypt实现微信数据的安全自主管理

如何通过WechatDecrypt实现微信数据的安全自主管理 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 一、数据困局:为什么我们需要自主解密工具? 1.1 数字资产的"加密牢笼&quo…

2026/7/9 3:00:01 阅读更多 →
为Qwen3模型开发AI Agent:自主任务规划与执行

为Qwen3模型开发AI Agent:自主任务规划与执行

为Qwen3模型开发AI Agent:自主任务规划与执行 最近,我尝试用Qwen3大模型做了一个挺有意思的实验:让它不再只是简单地一问一答,而是变成一个能自己思考、自己动手的“智能助手”。这个助手能干点啥呢?举个例子&#xf…

2026/7/9 3:00:01 阅读更多 →
零代码部署Qwen3-Reranker-0.6B:Gradio可视化界面一键调用

零代码部署Qwen3-Reranker-0.6B:Gradio可视化界面一键调用

零代码部署Qwen3-Reranker-0.6B:Gradio可视化界面一键调用 1. 引言 你有没有遇到过这样的问题:在搜索资料时,明明输入了很具体的关键词,但返回的结果却总是不太对劲,需要自己一条条点开看,才能找到真正有…

2026/7/4 7:46:39 阅读更多 →

最新新闻

“经验沉淀“到底值多少分?增益上限在哪里?

“经验沉淀“到底值多少分?增益上限在哪里?

为什么你现在应该读这篇 "把成功经验存下来复用"这句话几乎是所有 Agent 工程团队的共识,但很少有人能说清楚:这套"经验沉淀"机制到底带来了多少实际收益,换个任务场景还能不能用。这篇论文第一次用严肃的基准测试把这个模糊的直觉变成了可复现的数字。 …

2026/7/9 2:56:15 阅读更多 →
MetaERP 总账日记账和子模块分类账的区别是什么?

MetaERP 总账日记账和子模块分类账的区别是什么?

一、先把两个名词拆明白(ERP 标准定义)1. 总账日记账(GL Journal / 总账凭证)英文:General Journal 存放位置:总账 GL 模块 本质:纯财务手工调整类分录流水,无业务单据支撑&#xff…

2026/7/9 2:56:15 阅读更多 →
拼多多笔试真题-多多的道路建设C++/Py/Java /Js/Go)

拼多多笔试真题-多多的道路建设C++/Py/Java /Js/Go)

多多的道路建设 拼多多技术岗 7月3号笔试 第四题 题目内容 多多村有 N N N 个房子(编号 1 1 1~ N N

2026/7/9 2:54:15 阅读更多 →
高端制造一级赛道,半导体与集成电路二级赛道,EDA 软件三级赛道,封测 EDA 四级赛道,企业技术岗技术管理线所经历的路径和薪资?

高端制造一级赛道,半导体与集成电路二级赛道,EDA 软件三级赛道,封测 EDA 四级赛道,企业技术岗技术管理线所经历的路径和薪资?

赛道层级前置统一一级:高端制造 二级:半导体与集成电路 三级:EDA 工业软件 四级:封测 EDA(细分:传统 SIP/IC 载板、2.5D/3D Chiplet、SI/PI 多物理仿真、3D 跨层验证)一、标准技术管理晋升完整路…

2026/7/9 2:44:11 阅读更多 →
【大白话说Java面试题 第161题】【06_Spring篇】第21题: SpringMVC工作流程

【大白话说Java面试题 第161题】【06_Spring篇】第21题: SpringMVC工作流程

📌 PDF:大白话说Java面试题 — 06_Spring篇 第21题:SpringMVC 的工作流程(DispatcherServlet 的工作流程) 📚 回答: 核心考点: SpringMVC 的工作流程远不止"DispatcherServle…

2026/7/9 2:42:10 阅读更多 →
损失函数(loss)

损失函数(loss)

5-损失函数(Loss) 可能影响网络训练失败_哔哩哔哩_bilibili 回归问题是模型给出一个预测值 分类问题,我们一般使用one-hot进行class的分类 输入特征 x 进入神经网络,经过加权求和、偏置、激活函数,最后输出三个类别的预测值。真实类别用 on…

2026/7/9 2:36:07 阅读更多 →

日新闻

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南 【免费下载链接】ESLyric-LyricsSource Advanced lyrics source for ESLyric in foobar2000 项目地址: https://gitcode.com/gh_mirrors/es/ESLyric-LyricsSource 还在为Foobar2000找不到高质…

2026/7/9 0:01:04 阅读更多 →
ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍

ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍

ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍 【免费下载链接】ElegantBook Elegant LaTeX Template for Books 项目地址: https://gitcode.com/gh_mirrors/el/ElegantBook 你是否曾经为学术书籍的封面设计而烦恼?想要一个既专业又美观的封…

2026/7/9 0:03:06 阅读更多 →
如何高效使用pyodbc:企业级数据库连接终极指南

如何高效使用pyodbc:企业级数据库连接终极指南

如何高效使用pyodbc:企业级数据库连接终极指南 【免费下载链接】pyodbc Python ODBC bridge 项目地址: https://gitcode.com/gh_mirrors/py/pyodbc 在当今数据驱动的商业环境中,企业级数据库连接已成为现代应用开发的核心需求。pyodbc作为一款强大…

2026/7/9 0:07:11 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/8 16:59:55 阅读更多 →

月新闻