逆向解析小某书接口签名:X-S/X-T参数生成算法与Python复现
1. 项目概述与目标定位最近在分析一些主流内容平台的接口加密逻辑小某书的web端是一个挺有意思的目标。它的接口防护机制在业内算是比较有代表性的尤其是其homefeed首页信息流接口使用了多个动态生成的签名参数比如X-S、X-T、X-S-COMMON。这些参数是服务端验证请求合法性的关键直接关系到我们能否模拟客户端行为稳定地获取数据。这个逆向分析的核心就是搞清楚这些参数是怎么算出来的以及如何用代码复现这个计算过程。这不仅仅是破解一个签名更是理解一套完整的客户端-服务端交互安全模型。对于前端开发、爬虫工程师或者对Web安全感兴趣的朋友来说这个过程能让你深入理解现代Web应用如何在前端实施反爬策略以及逆向工程的基本方法论。你会发现很多看似复杂的加密其核心逻辑往往藏在经过混淆和压缩的JavaScript代码里等待被梳理和还原。接下来我会带你一步步拆解这个“黑盒”从接口抓包定位关键代码到静态分析与动态调试最后实现参数的本地生成。2. 逆向分析的核心思路与准备工作逆向分析不是盲目地碰运气它需要一个清晰的策略。我们的目标很明确找到生成X-S、X-T、X-S-COMMON这三个参数的JavaScript代码逻辑。整体思路可以概括为“由外而内动静结合”。2.1 核心思路拆解首先“由外而内”指的是从网络请求这个最外层的表现入手。我们通过浏览器开发者工具的Network面板捕获到携带目标参数的请求观察其规律。比如X-T看起来很像一个时间戳X-S像是一个哈希值X-S-COMMON则可能是一个通用签名。这一步是定位的起点。其次“动静结合”是具体的技术手段。“静”指的是静态分析即直接搜索、阅读反混淆后的JavaScript源码。“动”指的是动态调试通过下断点、Hook函数、监控堆栈调用等方式在代码运行时观察其执行流程和变量状态。对于混淆严重的代码动态调试往往是破局的关键。2.2 环境与工具准备工欲善其事必先利其器。以下是本次分析需要用到的核心工具它们各自扮演着不同的角色浏览器开发者工具 (Chrome DevTools)这是我们的主战场。Network面板用于抓包Sources面板用于静态查看和调试JS代码Console面板用于执行一些测试代码。全局搜索与代码定位技巧在Sources面板中可以使用CtrlShiftF(Windows) 或CmdOptF(Mac) 进行全局文件搜索。直接搜索参数名如X-S可能无果因为代码被压缩了。更有效的方法是搜索其被赋值的地方比如x-s、x_s、headers[X-S]或者其可能的前缀。断点与调试在怀疑的代码行左侧单击设置断点。当请求再次发出执行流暂停时就可以在Scope面板查看局部变量在Call Stack面板查看函数调用链这是理清逻辑的黄金时刻。Hook技术对于难以直接定位的加密函数我们可以通过重写标准API来“钩住”它。例如如果怀疑使用了CryptoJS或浏览器的SubtleCrypto进行加密可以提前注入代码在它们被调用时打印出输入参数和结果。注意在进行任何调试或Hook操作前务必在无痕窗口或专门的测试浏览器中进行避免对你日常使用的账号和浏览器环境造成干扰。同时所有分析应仅用于学习与研究目的严格遵守相关服务条款。3. 接口分析与关键参数定位一切分析都始于一次真实的网络请求。打开小某书Web端清空Network记录然后滚动页面触发新的homefeed加载。3.1 请求抓包与初步观察在Network面板中筛选XHR/Fetch请求找到那个包含homefeed关键词的请求。点击查看其Headers详情我们的焦点在Request Headers部分。通常你会看到类似这样的结构X-S: 7g9s8df7g9sdf79g8sd7f9g X-T: 1715167890123 X-S-COMMON: a1b2c3d4e5f6...X-T这个值通常是一个13位数字一眼就能看出是JavaScript的毫秒级时间戳Date.now()。它的作用很可能是标识请求发起的时间用于服务端校验请求的新鲜性防止重放攻击。X-S和X-S-COMMON这两个是明显的哈希字符串长度固定可能是32位或64位十六进制。它们极有可能是对请求的某些部分如URL、时间戳、固定盐值、请求体等进行特定算法如MD5、SHA256、HMAC计算得出的签名。X-S可能是本次请求的独立签名而X-S-COMMON可能是会话级别的通用签名。3.2 逆向入口的寻找策略直接搜索X-S字符串在压缩的JS文件中很难有结果。我们需要更聪明的搜索词搜索headers对象被赋值的地方例如headers[x-s]或headers[\X-S\]。搜索网络请求库如axios、fetch的拦截器interceptors部分签名逻辑常常封装在这里。搜索sign、encrypt、md5、sha256、hmac等关键词。最有效的方法在Network面板中找到那个homefeed请求右键选择Copy-Copy as cURL。然后将其粘贴到文本编辑器你会看到完整的请求头。观察Cookie中是否有类似a1xxxxx的字段这个a1有时是生成X-S-COMMON的关键。在JS代码中搜索这个Cookie名也可能定位到相关逻辑。通过以上方法你大概率会定位到一个或几个关键的JavaScript文件其中包含了参数构造的逻辑。这些文件通常经过Webpack等工具打包变量名被混淆成a、b、c、t、e、n、r等单字母但函数结构和逻辑是完整的。4. 静态代码分析与逻辑梳理找到疑似文件后我们需要静下心来阅读代码。虽然变量名面目全非但代码的“骨架”和“模式”依然清晰可辨。4.1 反混淆与代码格式化首先在Sources面板中点击代码区域左下角的{}(Pretty-print) 按钮将压缩成一行的代码格式化恢复缩进和换行这能极大提升可读性。4.2 关键函数识别与逻辑追踪格式化后围绕我们搜索到的关键代码行比如给X-S赋值的那一行展开分析。假设我们找到的代码片段是这样的t.headers[X-S] (0, o.md5)(s c u);这里(0, o.md5)是一种确保this上下文正确的函数调用方式o.md5很可能就是MD5函数。那么X-S的值就是md5(s c u)的结果。接下来的任务就是搞清楚s、c、u这三个变量是什么。向上追溯在代码中点击s、c、u这些变量名或者在其定义行设置断点查看它们是如何计算出来的。它们可能是s: 可能是时间戳X-T。c: 可能是请求的pathname如/api/sns/web/v1/homefeed。u: 可能是一个固定的盐值secret或者来自Cookie的某个令牌。分析函数调用链查看Call Stack了解是哪个函数调用了当前这个赋值逻辑。这通常是一个请求拦截器或一个独立的签名函数。理解这个调用链有助于我们掌握签名的触发时机和上下文。4.3 还原算法步骤通过静态阅读和动态调试结合我们最终要还原出类似如下的伪代码逻辑function generateSign(path, timestamp, secret, payload) { // 1. 可能对参数进行特定顺序的拼接 let signStr ${timestamp}${path}${JSON.stringify(payload)}${secret}; // 2. 可能需要对字符串进行URL编码或排序 // 3. 使用特定的哈希算法计算 let hash md5(signStr); // 或 sha256, hmac-sha256 // 4. 可能对哈希结果进行二次处理如截取、转大写 return hash.toUpperCase(); }这个secret盐值是关键它可能硬编码在JS中也可能从初始接口或Cookie中动态获取。硬编码的盐值相对容易找到动态获取的则需要追踪其来源。5. 动态调试与参数生成验证静态分析给出了假设动态调试则是验证假设、获取关键动态值的唯一途径。5.1 断点调试实战在我们推测的签名生成函数入口或者给headers赋值的代码行打上断点。刷新页面或触发请求代码执行会在此暂停。观察变量在Scope面板中展开Local、Closure作用域查看所有局部变量的值。记录下s、c、u的实际内容。这能直接验证我们的猜测。单步执行使用F10(Step Over) 和F11(Step Into) 逐行执行观察每一步计算的结果确保逻辑理解无误。计算验证在Console面板中我们可以手动模拟计算。例如拿到断点处的s、c、u的值然后自己写一个JS的MD5函数或使用CryptoJS进行计算将结果与即将赋值给X-S的值对比。如果一致恭喜你核心算法破解成功。5.2 Hook函数捕获关键信息如果代码经过深度混淆断点难以精准设置或者我们想批量查看签名输入可以使用Hook。例如我们怀疑它使用了浏览器的btoa、atob或CryptoJS// 在Console中执行或通过浏览器插件注入 let _originalBtoa window.btoa; window.btoa function(data) { console.trace(btoa called with:, data); // 打印调用栈和输入 let result _originalBtoa.apply(this, arguments); console.log(btoa result:, result); return result; }; // 如果使用CryptoJS if (window.CryptoJS CryptoJS.MD5) { let _originalMD5 CryptoJS.MD5; CryptoJS.MD5 function(message) { console.log(MD5 input:, message.toString()); let result _originalMD5.apply(this, arguments); console.log(MD5 output:, result.toString()); return result; }; }执行Hook代码后再触发请求就能在Console中看到加密函数的输入输出这对于理解签名原材料至关重要。6. 算法还原与Python/Node.js复现一旦在浏览器环境中完全弄清了算法下一步就是脱离浏览器用服务端语言如Python或Node.js复现实现自动化。6.1 确定算法细节通过调试你需要明确以下几点拼接顺序timestamp、path、payload、secret以什么顺序拼接中间是否有连接符如、|、空字符串数据格式payload是JSON字符串吗是否需要按字母顺序排序是否需要去除空格哈希算法确定是MD5、SHA1还是SHA256是否是HMAC模式结果处理哈希结果是十六进制字符串吗是否需要转为大写或小写是否只取前16位或后16位6.2 Python复现实例假设我们最终确定的算法是X-S MD5( X-T 请求路径 排序后的JSON字符串 固定盐值 ).upper()import hashlib import json import time import urllib.parse def generate_x_s(path: str, payload: dict, secret: str) - tuple: 生成小某书homefeed接口的X-T和X-S参数 :param path: 请求路径如 ‘/api/sns/web/v1/homefeed’ :param payload: 请求体参数字典 :param secret: 从JS中提取的固定盐值 :return: (x_t, x_s) # 1. 生成13位毫秒时间戳 X-T x_t str(int(time.time() * 1000)) # 2. 处理payload按key排序然后转为紧凑JSON字符串 sorted_payload json.dumps(payload, separators(‘,‘, ‘:‘), sort_keysTrue) # separators(‘,‘, ‘:‘) 用于移除JSON中的空格 # 3. 按特定顺序拼接字符串 sign_string x_t path sorted_payload secret # 4. 计算MD5并转为大写 m hashlib.md5() m.update(sign_string.encode(‘utf-8‘)) x_s m.hexdigest().upper() return x_t, x_s # 使用示例 api_path “/api/sns/web/v1/homefeed” request_payload {“cursor_score“: ““, “num“: 20, “refresh_type“: 1} # 这个secret需要从JS代码中提取是破解的核心 extracted_secret “d1b4f8a3e7c2“ x_t, x_s generate_x_s(api_path, request_payload, extracted_secret) print(f“X-T: {x_t}“) print(f“X-S: {x_s}“)6.3 Node.js复现实例对于更复杂的、依赖浏览器特定环境或第三方库如CryptoJS的算法用Node.js复现可能更直接因为Node.js的JavaScript环境与浏览器更相似。const crypto require(‘crypto‘); const CryptoJS require(‘crypto-js‘); // 如果需要完全还原CryptoJS的逻辑 function generateSign(path, payload, secret) { const x_t Date.now().toString(); // 假设算法与Python示例相同 const sortedPayloadStr JSON.stringify(payload, Object.keys(payload).sort()); const signStr x_t path sortedPayloadStr secret; // 使用Node.js内置crypto模块 const hash crypto.createHash(‘md5‘).update(signStr).digest(‘hex‘); const x_s hash.toUpperCase(); return { x_t, x_s }; } // 或者如果原代码使用了CryptoJS.MD5 function generateSignWithCryptoJS(path, payload, secret) { const x_t Date.now().toString(); const sortedPayloadStr JSON.stringify(payload, Object.keys(payload).sort()); const signStr x_t path sortedPayloadStr secret; const hash CryptoJS.MD5(CryptoJS.enc.Utf8.parse(signStr)); const x_s hash.toString(CryptoJS.enc.Hex).toUpperCase(); return { x_t, x_s }; }7. 常见问题、反爬策略与应对技巧在实际操作中你绝不会一帆风顺。小某书和其他大型平台一样部署了多层反爬机制。7.1 常见问题排查表问题现象可能原因排查思路与解决方案生成的X-S与服务端验证不匹配1. 拼接顺序或内容错误。2. 盐值(secret)错误或动态变化。3. 哈希算法或编码方式错误。4. 忽略了某些隐藏参数如cookie中的某个字段。1.仔细核对用调试工具捕获一次完整的请求记录下此刻所有的输入精确的时间戳、完整的URL、原始的请求体字符串、所有的Cookie。用这些原始数据代入你的算法逐字符比对。2.检查盐值确认secret是静态还是动态。如果是动态的例如来自另一个接口的响应需要先实现获取secret的流程。3.验证算法在浏览器Console中用你还原的算法和抓取的原始数据计算一遍确保结果与抓包数据完全一致。请求返回403/412等状态码1. 签名参数正确但缺少其他必要校验头如User-Agent,Referer。2. IP请求频率过高被限制。3. Cookie失效或异常。1.模拟完整头部使用curl或Postman原样重放一次成功的请求然后逐个移除或修改头部找出哪些是必需的。2.控制请求速率在代码中增加随机延时如time.sleep(random.uniform(1, 3))避免高频请求。3.维护会话定期检查Cookie有效性必要时重新走登录或验证流程获取新Cookie。无法在源码中找到明显的加密函数1. 代码被高度混淆和压缩。2. 加密逻辑被隐藏在Webpack打包的模块中。3. 使用了WebAssembly进行加密计算。1.尝试搜索特征值搜索可能存在的常量如初始化向量iv、魔数0x5A827999等。2.Hook通用API重点Hookfetch、XMLHttpRequest、crypto.subtle、Function构造函数等。3.关注WebAssembly在Network面板中过滤.wasm文件如果存在则加密核心可能在其中需要更底层的逆向分析。算法不定期更新平台主动更新了加密逻辑或盐值。1.建立监控机制定期运行测试用例校验签名是否还能通过。2.代码抽象将签名生成算法封装成独立的、易于配置和更新的模块。3.关注JS文件变化注意核心JS文件的版本号或哈希值是否变化。7.2 高级反爬策略与应对环境检测平台JS可能会检测浏览器环境如navigator属性、WebGL渲染器、字体列表等。纯脚本请求缺乏这些特征。应对方法是使用puppeteer、playwright或selenium等无头浏览器工具来模拟真实浏览器环境但代价是性能低。折中方案是研究其检测点在请求中补全必要的环境指纹头。代码混淆与动态加载核心加密代码可能被分割成多个小函数动态加载和执行。这增加了静态分析的难度。应对方法是耐心通过断点跟踪执行流逐步绘制出函数调用关系图。请求链依赖X-S-COMMON参数可能依赖于之前某个接口返回的令牌形成请求链。必须按正确顺序模拟整个用户会话流程而不能孤立地调用目标接口。7.3 我的实操心得保持耐心与细致逆向工程是体力活也是脑力活一个字符的差异都会导致失败。务必对每次抓包的数据做详细记录和比对。善用对比法同时抓取两次成功的请求对比它们的参数差异。哪些变了如时间戳哪些没变如盐值这能快速帮你锁定变量。从易到难先攻克看似最简单的X-T再解决X-S最后处理X-S-COMMON。每验证一步信心就增加一分。不要忽视Cookie很多签名算法的关键盐值或种子就藏在Cookie的某个字段里。a1、web_session这类Cookie往往是重点。封装与测试算法还原后立即将其封装成函数并编写单元测试用历史抓包数据验证其正确性。这能确保后续代码修改不会破坏已有功能。逆向分析就像解谜每一次成功的参数还原都是对前端安全机制的一次深刻理解。这个过程锻炼的不仅仅是技术更是解决问题的思维方式和耐心。记住我们的目的是学习和研究技术实现所有的操作都应在法律和平台规则允许的范围内进行。

相关新闻

TDDI芯片CP测试方案设计:针对数千PIN脚的探针卡选型与并行测试策略

TDDI芯片CP测试方案设计:针对数千PIN脚的探针卡选型与并行测试策略

TDDI芯片CP测试方案设计:探针卡选型与并行测试策略深度解析1. 引言:TDDI芯片测试的特殊挑战在显示驱动与触控集成芯片(TDDI)领域,CP测试面临的核心难题直接源于其架构特性——单颗芯片往往集成2000-5000个I/O引脚&…

2026/7/13 9:00:56阅读更多 →
UG NX 12 历史与无历史模式对比:3个场景解析同步建模适用边界

UG NX 12 历史与无历史模式对比:3个场景解析同步建模适用边界

UG NX 12 历史与无历史模式对比:3个场景解析同步建模适用边界 在三维设计领域,UG NX 12提供了两种截然不同的建模思路:历史记录模式与无历史记录模式。这两种模式并非简单的功能差异,而是代表了参数化设计与直接建模两种设计哲学。…

2026/7/13 9:00:56阅读更多 →
NCMconverter终极指南:快速解锁加密音乐跨平台播放自由

NCMconverter终极指南:快速解锁加密音乐跨平台播放自由

NCMconverter终极指南:快速解锁加密音乐跨平台播放自由 【免费下载链接】NCMconverter NCMconverter将ncm文件转换为mp3或者flac文件 项目地址: https://gitcode.com/gh_mirrors/nc/NCMconverter 你是否曾经从音乐平台下载了心爱的歌曲,却发现在车…

2026/7/13 8:55:55阅读更多 →
⭐️Windows 7官方原版ISO镜像终极下载指南与版本全解析

⭐️Windows 7官方原版ISO镜像终极下载指南与版本全解析

1. Windows 7系统镜像下载前的准备工作在开始下载Windows 7官方原版ISO镜像之前,我们需要做好一些准备工作。首先,要明确自己的需求:你是要在老旧电脑上安装,还是在虚拟机中使用?或者是需要特定版本用于软件开发测试&a…

2026/7/13 13:22:14阅读更多 →
Linux系统核心特性与实用管理命令详解

Linux系统核心特性与实用管理命令详解

1. Linux系统概述与核心特性Linux是一种开源的类Unix操作系统内核,由林纳斯托瓦兹于1991年首次发布。作为现代计算领域最重要的基础设施之一,Linux以其稳定性、安全性和灵活性著称。不同于商业操作系统,Linux遵循GNU通用公共许可证(GPL)&…

2026/7/13 13:22:14阅读更多 →
1987年8月24日下午13-15点出生性格、运势和命运

1987年8月24日下午13-15点出生性格、运势和命运

从命理学的角度来探讨1987年8月24日下午13 - 15点出生之人的性格、运势和命运,是一件饶有趣味的事情。这一时间段出生于丁卯年戊申月乙巳日癸未时,出生之人往往带有乙木的特质。乙木代表着花草之木,具有柔韧、温和、灵动的特性。他们通常性格…

2026/7/13 13:22:14阅读更多 →
如何3分钟快速获取国家中小学智慧教育平台电子课本:智能解析工具完整指南

如何3分钟快速获取国家中小学智慧教育平台电子课本:智能解析工具完整指南

如何3分钟快速获取国家中小学智慧教育平台电子课本:智能解析工具完整指南 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本…

2026/7/13 13:22:14阅读更多 →
Unity捏脸系统实战:BlendShape与Skinned Mesh Renderer核心技术解析

Unity捏脸系统实战:BlendShape与Skinned Mesh Renderer核心技术解析

1. 项目概述:从“捏脸”需求到技术选型在角色扮演、社交应用乃至虚拟偶像领域,一个高度自定义的角色外观系统往往是吸引用户沉浸其中的关键。而“捏脸”作为其中最直观、最富创造性的环节,其技术实现直接决定了用户体验的上限。很多开发者初次…

2026/7/13 13:22:14阅读更多 →
告别格式困扰:3秒搞定网页图片格式转换的Chrome神器

告别格式困扰:3秒搞定网页图片格式转换的Chrome神器

告别格式困扰:3秒搞定网页图片格式转换的Chrome神器 【免费下载链接】Save-Image-as-Type Save Image as Type is an chrome extension which add Save as PNG / JPG / WebP to the context menu of image. 项目地址: https://gitcode.com/gh_mirrors/sa/Save-Ima…

2026/7/13 13:17:14阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/13 4:47:19阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/13 0:50:34阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/13 4:52:09阅读更多 →
卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

研究痛点提出(提出问题)重组肠激酶是融合标签切除核心工具酶,当前原核表达体系存在三大标准化难题,直接阻碍可复现的蛋白质分离纯化流程搭建:Trx、GST、单 SUMO 标签融合产物绝大多数为包涵体,沉淀占比超 9…

2026/7/13 0:04:58阅读更多 →
语音转文字工具AsrTools:让音频整理变得简单高效

语音转文字工具AsrTools:让音频整理变得简单高效

语音转文字工具AsrTools:让音频整理变得简单高效 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into accurate text …

2026/7/13 0:04:58阅读更多 →
Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools 你是否曾经想要调整Palwor…

2026/7/13 0:04:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/13 4:21:17阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/13 4:08:53阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/12 21:43:43阅读更多 →