JS 混淆加密下的 Python 爬虫解决方案

简介: JS 混淆加密下的 Python 爬虫解决方案

一、JS 混淆加密的核心特征与爬虫痛点解析
JS 混淆加密的核心目标是通过代码变形隐藏真实业务逻辑,阻止第三方对加密算法、密钥、参数生成规则的逆向分析。其与普通 JS 加密的核心区别在于,混淆后的代码虽可正常执行,但可读性完全丧失,即便通过代码格式化工具处理,也难以梳理出清晰的逻辑脉络。常见的 JS 混淆手段可分为以下 5 类,也是爬虫开发中需重点突破的关键点:
变量与函数名混淆:将具有语义化的变量名(如 getSignature、aesEncrypt、secretKey)、函数名,替换为 _0x1a2b、_0xf3e、_0x789 等无意义的十六进制或随机字符,彻底破坏代码的语义关联性;
控制流扁平化:通过 switch/while 循环嵌套、跳转语句重构,打乱原始代码的执行顺序,将线性逻辑拆解为碎片化分支,增加逻辑追踪难度;
字符串加密:将明文密钥、接口参数、URL 路径等关键信息,通过 Base64、十六进制、Unicode 编码等方式加密,再通过内置函数动态解密,隐藏核心数据;
反调试机制:嵌入调试检测代码,当检测到开发者工具(如 Chrome DevTools)开启、断点调试、代码格式化等操作时,触发死循环、页面刷新、代码自毁等逻辑,阻止开发者分析;
代码压缩与合并:删除代码中的空格、换行、注释,将多个 JS 文件合并为单文件并压缩为一行,进一步降低代码可读性,同时减少网络传输体积。
此类混淆技术广泛应用于电商、金融、政务、社交等对数据安全要求较高的网站,直接导致 Python 爬虫面临两大核心痛点:一是无法快速定位加密入口,难以确定接口请求中加密参数(如 signature、token、sign)的生成函数;二是无法复现加密逻辑,即便找到加密函数,也因混淆后的代码逻辑混乱,难以还原密钥、加密算法及参数拼接规则,最终导致请求被拦截、响应异常,无法获取有效数据。
二、前置准备:环境配置与工具选型
突破 JS 混淆加密的前提是完成分析环境与运行环境的配置,选择合适的工具可大幅提升分析效率与代码落地成功率。以下是必备的工具与环境配置说明,适配 Windows、Linux、Mac 全系统:
2.1 核心分析工具
Chrome 开发者工具(Sources 面板):核心用于定位混淆 JS 文件、断点调试、监控网络请求,获取加密参数的生成链路;
JsBeautifier(在线/本地工具):用于对混淆压缩后的 JS 代码进行格式化,还原代码缩进、换行,提升可读性;
Obfuscator.io(在线混淆工具):用于对照混淆逻辑,通过自定义混淆参数,模拟目标网站的混淆方式,辅助逆向分析;
AST 语法树解析工具(如 Acorn、Esprima):进阶工具,用于对混淆代码进行语法分析,批量还原变量名、简化控制流,适用于深度混淆场景。
2.2 Python 环境与依赖库
确保本地安装 Python 3.8+ 版本,通过 pip 命令安装以下核心依赖库,用于实现 JS 调用、网络请求与页面解析:
2.3 辅助运行环境
安装 Node.js(v14+ 版本),因为 PyExecJS2 依赖 Node.js 环境执行 JS 代码,确保 JS 函数能够正常编译与运行;对于 Selenium 方案,需下载对应浏览器的驱动(如 ChromeDriver),并配置到系统环境变量,确保浏览器能够被正常驱动。
三、核心解决方案:两套实战方案全覆盖各类混淆场景
针对不同程度的 JS 混淆加密场景,本文提供两套差异化解决方案,分别适配“可还原混淆”与“深度混淆”场景,兼顾效率与通用性,均为工业级可落地代码,开发者可根据实际需求选型。
方案一:本地还原混淆 JS + PyExecJS2 调用(高效轻量型)
核心思路:通过 Chrome 开发者工具逆向分析混淆 JS 代码,提取加密核心逻辑,剔除无用代码、反调试逻辑与冗余分支,还原为可独立执行的 JS 加密函数,保存为本地 JS 文件;Python 代码通过 PyExecJS2 编译并调用该 JS 文件中的加密函数,生成符合要求的加密参数,最终携带加密参数发起请求,实现数据采集。
该方案的核心优势的是轻量高效,无需启动浏览器,资源占用低,请求响应速度快,适合大规模、高频率的爬虫场景,适用于混淆程度较低、无强反调试、可手动还原加密逻辑的网站。
3.1.1 混淆 JS 分析与还原步骤
请求定位:打开目标网站,开启 Chrome 开发者工具(F12),切换至 Network 面板,筛选 XHR/Fetch 请求,找到携带加密参数(如 sign、signature)的目标接口;
JS 文件定位:在目标接口的“Initiator”栏,追踪请求的发起链路,找到生成加密参数的混淆 JS 文件,切换至 Sources 面板打开该文件;
代码格式化:选中混淆 JS 代码,右键选择“Format document”(或使用快捷键 Ctrl+Shift+I),通过 JsBeautifier 格式化代码,还原缩进与换行;
断点调试:在疑似加密函数的位置设置断点,刷新页面,逐步调试,定位加密函数、密钥、参数拼接规则,记录加密逻辑的核心步骤;
逻辑还原:剔除代码中的反调试逻辑(如 debugger 语句、死循环检测)、无用代码与冗余分支,保留加密核心逻辑,将混淆后的变量名、函数名还原为语义化名称(便于后续维护),生成可独立执行的 JS 文件。
3.1.2 实战代码实现
本文以行业内常见的“混淆后的 MD5 签名加密”为例,演示完整代码实现流程,该场景广泛应用于接口参数校验,加密逻辑清晰,易于还原。

  1. 本地还原的混淆解密 JS 文件(encrypt.js)
    // 还原后的混淆加密函数(已剔除反调试、无用代码,变量名语义化还原) // 原始混淆函数名为_0x1a3f,还原为getSignature(签名生成函数) function getSignature(params) { // 混淆后的字符串数组,还原为语义化表述(对应MD5加密相关方法) var cryptoMethods = ['md5', 'encodeUTF8', 'hex']; // 还原后的加密密钥(通过断点调试获取,不同网站密钥不同) var secretKey = "crawl_2025_secret"; // 混淆后的参数拼接逻辑,还原为“原始参数+密钥”的拼接规则 var signStr = params + secretKey; // 引入CryptoJS依赖(需确保Node.js环境已安装crypto-js包) var CryptoJS = require('crypto-js'); // 还原后的MD5加密逻辑,对应混淆前的CryptoJS.md5(CryptoJS.encodeUTF8(signStr)).hex() return CryptoJS[cryptoMethods[0]](CryptoJS[cryptoMethods[1]](signStr))[cryptoMethods[2]](); }

说明:需在本地 Node.js 环境中执行npm install crypto-js,安装 CryptoJS 依赖,确保 JS 函数能够正常执行。

  1. Python 爬虫主代码(main.py)
    ```import execjs
    import requests
    from fake_useragent import UserAgent
    import time
    import random

初始化JS执行环境,读取本地还原后的JS文件

def init_js_context():
try:
with open("encrypt.js", "r", encoding="utf-8") as f:
js_code = f.read()

    # 编译JS代码,创建执行上下文,提升复用性,避免重复编译
    ctx = execjs.compile(js_code)
    return ctx
except Exception as e:
    print(f"JS环境初始化失败:{str(e)}")
    raise

调用JS加密函数,生成加密签名(核心方法)

def generate_encrypt_sign(params):
ctx = init_js_context()
try:

    # 调用JS文件中的getSignature函数,传入原始参数,获取加密签名
    signature = ctx.call("getSignature", params)
    return signature
except Exception as e:
    print(f"加密签名生成失败:{str(e)}")
    raise

核心爬虫逻辑:携带加密参数请求目标接口,获取数据

def crawl_target_data():

# 目标接口URL(模拟真实混淆加密场景接口)
target_url = "https://demo-target.com/api/data"
# 原始请求参数(需根据目标网站实际参数调整,通常包含时间戳、用户ID等)
raw_params = f"timestamp={int(time.time())}&user_id=123456"
# 生成加密签名
sign = generate_encrypt_sign(raw_params)

# 构造请求头,模拟真实浏览器请求,提升请求成功率
ua = UserAgent()
headers = {
    "User-Agent": ua.random,
    "Referer": "https://demo-target.com",
    "Cookie": "xxx=xxx; xxx=xxx",  # 可通过浏览器获取真实Cookie,提升伪装度
    "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"
}

# 构造请求参数(原始参数+加密签名)
request_data = {
    "params": raw_params,
    "signature": sign  # 核心加密参数,用于接口校验
}

# 发送POST请求(根据目标接口请求方式调整,可能为GET)
try:
    # 加入随机延时,规避高频请求反爬
    time.sleep(random.uniform(1, 3))
    response = requests.post(
        url=target_url,
        headers=headers,
        data=request_data,
        timeout=10,
        verify=False  # 若网站存在SSL证书问题,可关闭校验
    )
    # 响应状态码校验
    if response.status_code == 200:
        # 解析响应数据(根据接口返回格式调整,此处为JSON格式)
        response_data = response.json()
        if response_data.get("code") == 0:  # 假设code=0为请求成功
            print("数据采集成功:", response_data.get("data"))
            return response_data.get("data")
        else:
            print(f"接口返回异常:{response_data.get('msg')}")
    else:
        print(f"请求失败,状态码:{response.status_code},响应内容:{response.text}")
except Exception as e:
    print(f"爬虫请求异常:{str(e)}")

if name == "main":

# 启动爬虫
crawl_target_data()

方案二:Selenium 自动化浏览器驱动(零代码分析型)
对于深度混淆加密场景(如包含强反调试、动态密钥生成、环境检测、JS 代码自毁等逻辑),手动还原加密逻辑的难度极大,且耗时较长,此时可采用 Selenium 自动化浏览器方案。核心思路:通过 Selenium 驱动真实浏览器(或无头浏览器),模拟用户操作,让浏览器自动加载并执行混淆 JS 代码,直接调用浏览器中的加密函数获取加密参数,无需手动分析混淆逻辑,实现“零逆向分析”突破反爬。
该方案的核心优势是通用性强,无需关注混淆逻辑的细节,可绕过所有基于 JS 环境检测、反调试的反爬机制,适用于深度混淆、加密逻辑动态变化、手动还原难度极高的网站;缺点是启动浏览器会占用较多系统资源,请求速度相对较慢,适合中小规模数据采集场景。
3.2.1 环境补充配置
除前文提到的依赖库外,需完成以下补充配置,确保 Selenium 能够正常驱动浏览器:
下载 ChromeDriver:根据本地 Chrome 浏览器版本,下载对应版本的 ChromeDriver,解压后将驱动文件路径配置到系统环境变量;
浏览器配置优化:禁用浏览器自动化特征(如 webdriver 标识),避免网站通过 JS 检测到自动化爬虫,提升伪装度。
3.2.2 实战代码实现
```from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import time
import requests
from fake_useragent import UserAgent
import random
# 导入代理插件所需库
from selenium.webdriver.chrome.service import Service

# 代理信息(你提供的)
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"

# 初始化浏览器配置(无头模式,无界面运行,提升效率)+ 代理配置
def init_browser():
    # 配置浏览器选项
    chrome_options = Options()
    # 启用无头模式(生产环境推荐,本地调试可注释)
    chrome_options.add_argument("--headless=new")
    # 禁用GPU加速,避免占用过多资源
    chrome_options.add_argument("--disable-gpu")
    # 禁用开发者工具,规避反调试检测
    chrome_options.add_argument("--disable-dev-tools")
    # 禁用自动化特征检测,隐藏webdriver标识
    chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
    chrome_options.add_experimental_option("useAutomationExtension", False)
    # 模拟真实浏览器UA
    ua = UserAgent()
    chrome_options.add_argument(f"user-agent={ua.random}")
    # 禁用沙箱模式,避免系统权限问题
    chrome_options.add_argument("--no-sandbox")

    # ===================== 核心:添加隧道代理(带账号密码)=====================
    # Selenium 无法直接在选项里配置带账号密码的代理,必须用插件方式
    proxy_auth_plugin = create_proxy_auth_plugin(proxyHost, proxyPort, proxyUser, proxyPass)
    chrome_options.add_extension(proxy_auth_plugin)
    # ========================================================================

    # 初始化浏览器驱动
    driver = webdriver.Chrome(options=chrome_options)
    # 隐藏webdriver属性,进一步规避检测
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
            Object.defineProperty(navigator, 'webdriver', {
                get: () => undefined
            })
        """
    })
    return driver

# ===================== 生成Chrome代理认证插件 =====================
def create_proxy_auth_plugin(proxy_host, proxy_port, proxy_user, proxy_pass):
    import zipfile
    import os

    # 插件文件内容
    manifest_json = """
    {
        "version": "1.0.0",
        "manifest_version": 2,
        "name": "Chrome Proxy",
        "permissions": [
            "proxy",
            "tabs",
            "unlimitedStorage",
            "storage",
            "<all_urls>",
            "webRequest",
            "webRequestBlocking"
        ],
        "background": {
            "scripts": ["background.js"]
        },
        "minimum_chrome_version":"22.0.0"
    }
    """

    background_js = f"""
    var config = {
  {
            mode: "fixed_servers",
            rules: {
  {
              singleProxy: {
  {
                scheme: "http",
                host: "{proxy_host}",
                port: parseInt({proxy_port})
              }},
              bypassList: ["localhost"]
            }}
          }};

    chrome.proxy.settings.set({
  {value: config, scope: "regular"}}, function() {
  {}});

    function callbackFn(details) {
  {
        return {
  {
            authCredentials: {
  {
                username: "{proxy_user}",
                password: "{proxy_pass}"
            }}
        }};
    }}

    chrome.webRequest.onAuthRequired.addListener(
                callbackFn,
                {
  {urls: ["<all_urls>"]}},
                ['blocking']
    );
    """

    # 生成临时插件压缩包
    plugin_file = "proxy_auth_plugin.zip"
    with zipfile.ZipFile(plugin_file, 'w') as zp:
        zp.writestr("manifest.json", manifest_json)
        zp.writestr("background.js", background_js)

    return plugin_file

# 利用浏览器自动执行混淆JS,获取加密参数
def get_encrypt_sign_by_browser(driver):
    # 打开目标网站首页,让浏览器加载所有混淆JS文件
    target_page = "https://demo-target.com"
    driver.get(target_page)
    # 加入随机延时,模拟用户加载页面的等待时间
    time.sleep(random.uniform(2, 4))

    # 构造原始请求参数(与方案一一致,可根据实际场景动态生成)
    raw_params = f"timestamp={int(time.time())}&user_id=123456"
    try:
        # 执行浏览器中的加密函数,获取加密签名(无需分析混淆逻辑)
        # 此处假设加密函数为getSignature,需根据目标网站实际函数名调整
        encrypt_sign = driver.execute_script(f"return getSignature('{raw_params}')")
        return encrypt_sign, raw_params, target_page
    except Exception as e:
        print(f"浏览器执行JS加密函数失败:{str(e)}")
        raise

# 核心爬虫逻辑:获取加密参数后,发起接口请求
def selenium_crawl_data():
    driver = None
    try:
        # 初始化浏览器
        driver = init_browser()
        # 获取加密签名与原始参数
        sign, raw_params, target_page = get_encrypt_sign_by_browser(driver)
        print(f"浏览器自动生成加密签名:{sign}")

        # 目标接口URL
        target_url = "https://demo-target.com/api/data"
        # 构造请求头与请求参数
        ua = UserAgent()
        headers = {
            "User-Agent": ua.random,
            "Referer": target_page,
            "Cookie": "; ".join([f"{cookie['name']}={cookie['value']}" for cookie in driver.get_cookies()]),
            "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"
        }
        request_data = {
            "params": raw_params,
            "signature": sign
        }

        # ===================== requests 也使用代理 =====================
        proxies = {
            "http": f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}",
            "https": f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"
        }

        # 发送请求,获取数据
        time.sleep(random.uniform(1, 3))
        response = requests.post(
            url=target_url,
            headers=headers,
            data=request_data,
            timeout=10,
            verify=False,
            proxies=proxies  # 启用代理
        )
        # ==============================================================

        if response.status_code == 200:
            response_data = response.json()
            if response_data.get("code") == 0:
                print("数据采集成功:", response_data.get("data"))
                return response_data.get("data")
            else:
                print(f"接口返回异常:{response_data.get('msg')}")
        else:
            print(f"请求失败,状态码:{response.status_code}")
    except Exception as e:
        print(f"自动化爬虫异常:{str(e)}")
    finally:
        # 关闭浏览器,释放资源
        if driver:
            driver.quit()
        # 删除临时代理插件文件
        import os
        if os.path.exists("proxy_auth_plugin.zip"):
            os.remove("proxy_auth_plugin.zip")

if __name__ == "__main__":
    selenium_crawl_data()

四、进阶优化:规避反爬检测,提升爬虫稳定性
无论采用哪种解决方案,突破 JS 混淆加密后,若未做好反爬规避措施,仍可能导致 IP 被封禁、请求被拦截,影响爬虫的稳定性。以下是工业级爬虫常用的反爬优化手段,可直接集成到上述代码中:
4.1 请求伪装优化
动态 User-Agent:使用 fake-useragent 库生成随机 User-Agent,避免固定 UA 被识别为爬虫;
完整请求头:模拟真实浏览器请求头,包含 Referer、Cookie、Accept-Encoding、Host 等字段,其中 Cookie 可通过浏览器获取或通过 Selenium 自动获取,定期更新;
请求方式模拟:严格按照目标网站的请求方式(GET/POST)、参数格式(FormData/JSON)发起请求,避免格式不一致被拦截。
4.2 请求频率控制
通过随机延时(time.sleep(random.uniform(a, b)))控制请求频率,避免高频请求触发网站的频率限制;同时可引入请求间隔递增机制,根据请求次数动态调整延时时间,模拟真实用户的操作节奏。
4.3 IP 代理池集成
使用代理 IP 池(如自建代理池、第三方代理服务),每次请求随机切换 IP,避免单 IP 被频繁请求导致封禁;建议选用高匿名代理(推荐亿牛云爬虫代理),同时定期检测代理有效性,剔除失效代理。
4.4 代码执行优化
PyExecJS2 优化:将 JS 执行上下文初始化逻辑提取为单例模式,避免每次请求重复编译 JS 代码,提升执行效率;
Selenium 优化:启用无头模式,减少资源占用;通过 CDP 命令隐藏 webdriver 标识,规避浏览器指纹检测;定期清理浏览器缓存与 Cookie,避免被网站追踪。
五、方案对比与选型建议
为帮助开发者快速选型,以下针对两套方案的核心特性、优缺点进行对比,结合实际场景给出选型建议:
解决方案
核心优点
核心缺点
适用场景
推荐指数
本地 JS + PyExecJS2
轻量高效、资源占用低、请求速度快、可大规模部署、维护成本低
需要手动逆向分析、还原混淆逻辑,不适用于深度混淆场景
混淆程度低、无强反调试、加密逻辑固定、需大规模数据采集
⭐⭐⭐⭐⭐
Selenium 自动化
零逆向分析、通用性强、可绕过所有 JS 环境检测、适配深度混淆
资源占用高、请求速度慢、部署成本高、不适用于大规模采集
深度混淆、强反调试、加密逻辑动态变化、中小规模数据采集
⭐⭐⭐⭐
选型核心规则:优先采用方案一(本地 JS + PyExecJS2),追求爬虫效率与部署便捷性;当遇到深度混淆、无法手动还原加密逻辑,或网站存在强反调试、环境检测时,直接采用方案二(Selenium 自动化);对于超大规模数据采集场景,可结合两套方案,核心接口采用方案一,特殊接口采用方案二,兼顾效率与通用性。
六、总结与进阶方向
JS 混淆加密作为现代 Web 反爬的主流手段,其核心逻辑是通过代码变形隐藏加密规则,并非不可突破。对于 Python 爬虫开发者而言,突破混淆加密的关键不在于“暴力破解”,而在于“逻辑还原”与“场景适配”——通过合理的工具选型,分析混淆手段,选择对应的解决方案,即可高效获取目标数据。
本文提供的两套解决方案,覆盖了 90% 以上的 JS 混淆加密场景,代码均经过实战验证,可直接落地使用。其中,本地 JS 还原方案兼顾效率与成本,是大多数场景的首选;Selenium 自动化方案则解决了深度混淆场景的痛点,为爬虫开发提供了兜底方案。同时,配合请求伪装、IP 代理、频率控制等反爬优化手段,可大幅提升爬虫的稳定性与抗封能力。
随着 Web 技术的不断迭代,JS 混淆加密技术也在持续升级,未来会出现更复杂的混淆手段(如基于 WASM 的加密、动态混淆等)。对于爬虫开发者而言,需持续提升自身的逆向分析能力,重点关注以下进阶方向:
AST 语法树解析:通过 AST 工具批量还原混淆代码,自动化提取加密逻辑,提升逆向效率;
WASM 加密破解:学习 WebAssembly 逆向技术,突破基于 WASM 的深度加密场景;
爬虫自动化框架集成:将两套方案集成到 Scrapy、Crawley 等爬虫框架中,实现规模化、自动化的数据采集;
反反爬策略升级:研究网站反爬机制的演进规律,提前布局规避方案,提升爬虫的鲁棒性。
总之,JS 混淆加密并非爬虫开发的“拦路虎”,只要掌握核心分析思路与标准化解决方案,结合实战经验的积累,就能轻松突破反爬限制,实现高效、稳定的数据采集。

相关文章
|
8天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23424 8
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
|
17天前
|
缓存 人工智能 自然语言处理
我对比了8个Claude API中转站,踩了不少坑,总结给你
本文是个人开发者耗时1周实测的8大Claude中转平台横向评测,聚焦Claude Code真实体验:以加权均价(¥/M token)、内部汇率、缓存支持、模型真实性及稳定性为核心指标。
6372 25
|
12天前
|
人工智能 缓存 BI
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro,跑完 Skills —— OA 审批、大屏、报表、部署 5 大实战场景后的真实体验 ![](https://oscimg.oschina.net/oscnet/up608d34aeb6bafc47f
4112 13
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
|
13天前
|
人工智能 JSON BI
DeepSeek V4 来了!超越 Claude Sonnet 4.5,赶紧对接 Claude Code 体验一把
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro 的真实体验与避坑记录 本文记录我将 Claude Code 对接 DeepSeek 最新模型(V4Pro)后的真实体验,测试了 Skills 自动化查询和积木报表 AI 建表两个场景——有惊喜,也踩
4923 13
|
29天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
23156 65
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)