<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Apache Wangye</title>
        <link>https://xxzkid.github.io/</link>
        <description>Practical notes on Java, Linux, databases, cloud native technologies, and software engineering.</description>
        <lastBuildDate>Sat, 04 Apr 2026 12:19:36 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-Hans</language>
        <copyright>Copyright © 2026 Apache Wangye</copyright>
        <item>
            <title><![CDATA[手把手教你安装配置 OpenClaw + 飞书机器人，打造专属 AI 办公助手（超详细教程）]]></title>
            <link>https://xxzkid.github.io/2026/openclaw-start/</link>
            <guid>https://xxzkid.github.io/2026/openclaw-start/</guid>
            <pubDate>Sat, 04 Apr 2026 12:19:36 GMT</pubDate>
            <description><![CDATA[OpenClaw 接入飞书机器人的完整教程，涵盖安装、模型授权、网关、权限、事件和安全配置。]]></description>
            <content:encoded><![CDATA[<p>在人工智能加速赋能办公场景的今天，如何让大模型真正“走进”你的工作流？OpenClaw 是一个强大的开源网关工具，能够将主流大模型与企业级应用（如飞书、Slack 等）无缝对接，实现智能对话、自动化任务处理等能力。</p>
<p>本文将带你从零开始，一步步完成 OpenClaw 的安装、配置，并接入飞书机器人，打造属于你自己的 AI 助手。全程图文结合，小白也能轻松上手！</p>
<p>AI 网关、模型名称和飞书开放平台界面更新较快，执行时应以当前官方文档为准。生产环境必须收紧来源范围、妥善保存密钥，并对机器人可执行的操作设置最小权限。</p>
<p>为了更好地管理 Node.js 版本，我们首先需要安装 NVM（Node Version Manager）。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-windows-用户">✅ Windows 用户<a href="https://xxzkid.github.io/2026/openclaw-start/#-windows-%E7%94%A8%E6%88%B7" class="hash-link" aria-label="✅ Windows 用户的直接链接" title="✅ Windows 用户的直接链接" translate="no">​</a></h2>
<p>👉 下载地址：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">https://github.com/coreybutler/nvm-windows/releases/download/1.2.2/nvm-setup.exe</span><br></div></code></pre></div></div>
<p>下载后双击安装，按提示一步步完成即可。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-linux--macos-用户">✅ Linux / macOS 用户<a href="https://xxzkid.github.io/2026/openclaw-start/#-linux--macos-%E7%94%A8%E6%88%B7" class="hash-link" aria-label="✅ Linux / macOS 用户的直接链接" title="✅ Linux / macOS 用户的直接链接" translate="no">​</a></h2>
<p>打开终端，执行以下命令：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash</span><br></div></code></pre></div></div>
<p>安装完成后，加载环境变量：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">source ~/.bashrc</span><br></div></code></pre></div></div>
<p>💡 验证是否安装成功：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">nvm version</span><br></div></code></pre></div></div>
<h1>🌱 第二步：安装 Node.js（v22.22.0）</h1>
<p>OpenClaw 要求 Node.js 版本不低于 v22，推荐使用稳定版本。</p>
<p>在命令行中运行：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">nvm install v22.22.0</span><br></div></code></pre></div></div>
<p>设置为默认版本：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">nvm use v22.22.0</span><br></div></code></pre></div></div>
<p>✅ 验证版本：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">node -v</span><br></div></code></pre></div></div>
<h1>🚀 第三步：全局安装 OpenClaw</h1>
<p>使用 npm 安装 OpenClaw：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">npm i -g openclaw@latest</span><br></div></code></pre></div></div>
<p>安装完成后，可通过以下命令查看版本确认是否成功：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">openclaw --version</span><br></div></code></pre></div></div>
<h1>🧭 第四步：初始化配置 OpenClaw（onboard）</h1>
<p>运行初始化命令：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">openclaw onboard</span><br></div></code></pre></div></div>
<p>你会看到一系列交互式配置选项，以下是推荐选择：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">◇  I understand this is personal-by-default and shared/multi-user use requires lock-down. Continue?</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">   → Yes</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">◇  Onboarding mode</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">   → QuickStart</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">◇  Model/auth provider</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">   → Qwen (OAuth)</span><br></div></code></pre></div></div>
<p>随后会自动跳转至通义千问 OAuth 授权页面：</p>
<p>👉 打开提示中的链接（如：<a href="https://chat.qwen.ai/authorize?user_code=XXXXXX%EF%BC%89" target="_blank" rel="noopener noreferrer" class="">https://chat.qwen.ai/authorize?user_code=XXXXXX）</a></p>
<p>👉 登录并授权，输入提供的 code 完成绑定</p>
<p>✅ 授权成功后，系统将自动配置默认模型为 qwen-portal/coder-model</p>
<p>后续选项建议如下：</p>
<ul>
<li class="">Select channel (QuickStart) → Skip for now</li>
<li class="">Configure skills now? → Yes（推荐）</li>
<li class="">其余 API Key 设置（如 GOOGLE_PLACES_API_KEY、GEMINI_API_KEY 等）→ 按需选择 No（可后期补充）</li>
<li class="">Enable hooks? → Skip for now</li>
</ul>
<h1>⚙️ 第五步：修改大模型上下文参数（防报错关键步骤）</h1>
<p>某些模型在处理长文本时容易因上下文超限报错，需手动调整配置文件。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="配置文件路径">配置文件路径：<a href="https://xxzkid.github.io/2026/openclaw-start/#%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%B7%AF%E5%BE%84" class="hash-link" aria-label="配置文件路径：的直接链接" title="配置文件路径：的直接链接" translate="no">​</a></h2>
<ul>
<li class="">Windows 10+： 打开“我的电脑” → C盘 → 在地址栏输入 %USERPROFILE%.openclaw 回车</li>
<li class="">Linux / macOS： 路径为 ~/.openclaw</li>
</ul>
<p>进入目录后，编辑 openclaw.json 文件。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-修改关键参数">🔹 修改关键参数：<a href="https://xxzkid.github.io/2026/openclaw-start/#-%E4%BF%AE%E6%94%B9%E5%85%B3%E9%94%AE%E5%8F%82%E6%95%B0" class="hash-link" aria-label="🔹 修改关键参数：的直接链接" title="🔹 修改关键参数：的直接链接" translate="no">​</a></h2>
<p>找到以下字段并修改为推荐值：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">"models": {</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  "providers": {</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    "models": [</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      {</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        "contextWindow": 32000,</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        "maxTokens": 8192</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      }</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    ]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">}</span><br></div></code></pre></div></div>
<p>📌 说明：</p>
<ul>
<li class="">contextWindow: 上下文窗口大小，提升至 32000 支持更长对话历史</li>
<li class="">maxTokens: 单次回复最大输出 token 数，避免截断</li>
</ul>
<p>保存文件！</p>
<h1>🖥️ 第六步：启动 OpenClaw 控制台（Dashboard）</h1>
<p>运行命令启动服务：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">openclaw gateway start</span><br></div></code></pre></div></div>
<p>首次启动后会生成 Dashboard 地址：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">Dashboard URL: http://127.0.0.1:18789/#token=xxxxx</span><br></div></code></pre></div></div>
<p>📌 若提示 “No GUI detected”，请通过 SSH 隧道访问：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">ssh -N -L 18789:127.0.0.1:18789 用户名@你的服务器IP</span><br></div></code></pre></div></div>
<p>然后在本地浏览器打开：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">http://localhost:18789/</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">http://localhost:18789/#token=xxxxx</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-官方文档参考">📘 官方文档参考：<a href="https://xxzkid.github.io/2026/openclaw-start/#-%E5%AE%98%E6%96%B9%E6%96%87%E6%A1%A3%E5%8F%82%E8%80%83" class="hash-link" aria-label="📘 官方文档参考：的直接链接" title="📘 官方文档参考：的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://docs.openclaw.ai/gateway/remote" target="_blank" rel="noopener noreferrer" class="">https://docs.openclaw.ai/gateway/remote</a></li>
<li class=""><a href="https://docs.openclaw.ai/web/control-ui" target="_blank" rel="noopener noreferrer" class="">https://docs.openclaw.ai/web/control-ui</a></li>
</ul>
<h1>🐦 第七步：配置飞书机器人（Feishu Bot）</h1>
<p>我们要让 OpenClaw 接入飞书，实现群聊智能应答。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1️⃣-登录飞书开放平台">1️⃣ 登录飞书开放平台<a href="https://xxzkid.github.io/2026/openclaw-start/#1%EF%B8%8F%E2%83%A3-%E7%99%BB%E5%BD%95%E9%A3%9E%E4%B9%A6%E5%BC%80%E6%94%BE%E5%B9%B3%E5%8F%B0" class="hash-link" aria-label="1️⃣ 登录飞书开放平台的直接链接" title="1️⃣ 登录飞书开放平台的直接链接" translate="no">​</a></h2>
<p>访问：<a href="https://open.feishu.cn/" target="_blank" rel="noopener noreferrer" class="">https://open.feishu.cn</a> 点击【开发者后台】→【创建企业自建应用】</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2️⃣-创建应用">2️⃣ 创建应用<a href="https://xxzkid.github.io/2026/openclaw-start/#2%EF%B8%8F%E2%83%A3-%E5%88%9B%E5%BB%BA%E5%BA%94%E7%94%A8" class="hash-link" aria-label="2️⃣ 创建应用的直接链接" title="2️⃣ 创建应用的直接链接" translate="no">​</a></h2>
<ul>
<li class="">应用名称：openclaw-bot</li>
<li class="">应用描述：openclaw bot</li>
</ul>
<p>点击【创建】</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3️⃣-获取凭证">3️⃣ 获取凭证<a href="https://xxzkid.github.io/2026/openclaw-start/#3%EF%B8%8F%E2%83%A3-%E8%8E%B7%E5%8F%96%E5%87%AD%E8%AF%81" class="hash-link" aria-label="3️⃣ 获取凭证的直接链接" title="3️⃣ 获取凭证的直接链接" translate="no">​</a></h2>
<p>进入【凭据管理】，复制保存：</p>
<ul>
<li class="">App ID</li>
<li class="">App Secret</li>
</ul>
<p>⚠️ 这两个值将用于后续配置，请务必妥善保管！</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4️⃣-添加机器人能力">4️⃣ 添加机器人能力<a href="https://xxzkid.github.io/2026/openclaw-start/#4%EF%B8%8F%E2%83%A3-%E6%B7%BB%E5%8A%A0%E6%9C%BA%E5%99%A8%E4%BA%BA%E8%83%BD%E5%8A%9B" class="hash-link" aria-label="4️⃣ 添加机器人能力的直接链接" title="4️⃣ 添加机器人能力的直接链接" translate="no">​</a></h2>
<p>点击【添加应用能力】→【按能力选择】→ 搜索并添加【机器人】</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5️⃣-配置机器人名称">5️⃣ 配置机器人名称<a href="https://xxzkid.github.io/2026/openclaw-start/#5%EF%B8%8F%E2%83%A3-%E9%85%8D%E7%BD%AE%E6%9C%BA%E5%99%A8%E4%BA%BA%E5%90%8D%E7%A7%B0" class="hash-link" aria-label="5️⃣ 配置机器人名称的直接链接" title="5️⃣ 配置机器人名称的直接链接" translate="no">​</a></h2>
<ul>
<li class="">名字填写：clawbot</li>
<li class="">点击【保存】</li>
</ul>
<h1>🔧 第八步：配置 OpenClaw 连接飞书</h1>
<p>回到 .openclaw/openclaw.json 文件，添加飞书频道配置：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">{</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  "channels": {</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    "feishu": {</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      "enabled": true,</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      "appId": "你的App ID",</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      "appSecret": "你的App Secret",</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      "domain": "feishu",</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      "groupPolicy": "open",</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      "dmPolicy": "open",</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      "allowFrom": ["*"]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  }</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">}</span><br></div></code></pre></div></div>
<p>📌 参数说明：</p>
<ul>
<li class="">enabled: 启用飞书通道</li>
<li class="">groupPolicy / dmPolicy: 群聊和私聊策略设为 open，表示开放接入</li>
<li class="">allowFrom: 允许所有来源（生产环境建议限制）</li>
</ul>
<p>保存后，重启网关：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">openclaw gateway restart</span><br></div></code></pre></div></div>
<h1>🔔 第九步：设置事件回调与权限</h1>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1️⃣-回到飞书开放平台--事件和回调">1️⃣ 回到飞书开放平台 → 【事件和回调】<a href="https://xxzkid.github.io/2026/openclaw-start/#1%EF%B8%8F%E2%83%A3-%E5%9B%9E%E5%88%B0%E9%A3%9E%E4%B9%A6%E5%BC%80%E6%94%BE%E5%B9%B3%E5%8F%B0--%E4%BA%8B%E4%BB%B6%E5%92%8C%E5%9B%9E%E8%B0%83" class="hash-link" aria-label="1️⃣ 回到飞书开放平台 → 【事件和回调】的直接链接" title="1️⃣ 回到飞书开放平台 → 【事件和回调】的直接链接" translate="no">​</a></h2>
<ul>
<li class="">选择【长连接模式】→【保存】</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2️⃣-添加事件">2️⃣ 添加事件<a href="https://xxzkid.github.io/2026/openclaw-start/#2%EF%B8%8F%E2%83%A3-%E6%B7%BB%E5%8A%A0%E4%BA%8B%E4%BB%B6" class="hash-link" aria-label="2️⃣ 添加事件的直接链接" title="2️⃣ 添加事件的直接链接" translate="no">​</a></h2>
<ul>
<li class="">点击【添加事件】→ 搜索 im:message:re → 选择【接收消息 im:message:receive_v1】→【确认添加】</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3️⃣-开通必要权限">3️⃣ 开通必要权限<a href="https://xxzkid.github.io/2026/openclaw-start/#3%EF%B8%8F%E2%83%A3-%E5%BC%80%E9%80%9A%E5%BF%85%E8%A6%81%E6%9D%83%E9%99%90" class="hash-link" aria-label="3️⃣ 开通必要权限的直接链接" title="3️⃣ 开通必要权限的直接链接" translate="no">​</a></h2>
<ul>
<li class="">
<p>进入【权限管理】→【开通权限】</p>
</li>
<li class="">
<p>搜索并勾选以下权限组：</p>
<ul>
<li class="">contact:user.base:readonly（用户基础信息只读）</li>
<li class="">im:message 相关所有权限（消息读写、发送、接收）</li>
</ul>
</li>
<li class="">
<p>点击【确认开通】</p>
</li>
</ul>
<h1>🎯 第十步：发布应用，开始对话！</h1>
<p>所有配置完成后，点击【创建版本】按钮：</p>
<ul>
<li class="">输入版本号（如：1.0.0）</li>
<li class="">填写版本描述</li>
<li class="">点击【发布】</li>
</ul>
<p>发布成功后，返回飞书客户端，你会看到「openclaw-bot」应用已上线！</p>
<p>🔍 在聊天窗口 @clawbot 或直接私聊，即可开始与 AI 对话。</p>
<p>🎉 恭喜你，已成功搭建一个基于 OpenClaw 的飞书 AI 助手！</p>
<h1>📝 温馨提示 &amp; 后续优化建议</h1>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-推荐优化项">✅ 推荐优化项：<a href="https://xxzkid.github.io/2026/openclaw-start/#-%E6%8E%A8%E8%8D%90%E4%BC%98%E5%8C%96%E9%A1%B9" class="hash-link" aria-label="✅ 推荐优化项：的直接链接" title="✅ 推荐优化项：的直接链接" translate="no">​</a></h2>
<ul>
<li class="">后续可配置 BOOT.md 实现启动引导流程（启用 hook）</li>
<li class="">为不同技能模块添加 API Key，拓展图像生成、语音识别等功能</li>
<li class="">生产环境建议关闭 allowFrom: ["*"]，限制访问来源</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-常见问题排查">🔧 常见问题排查：<a href="https://xxzkid.github.io/2026/openclaw-start/#-%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E6%8E%92%E6%9F%A5" class="hash-link" aria-label="🔧 常见问题排查：的直接链接" title="🔧 常见问题排查：的直接链接" translate="no">​</a></h2>
<ul>
<li class="">机器人无响应？检查网关是否运行、端口是否开放</li>
<li class="">授权失败？确认 OAuth 是否完成，token 是否过期</li>
<li class="">消息收不到？检查飞书事件订阅和权限是否全部开通</li>
</ul>
<h1>🌟 写在最后</h1>
<p>OpenClaw + 飞书的组合，不仅是一个技术实践，更是智能化办公的起点。你可以在此基础上扩展：</p>
<ul>
<li class="">自动会议纪要生成</li>
<li class="">代码辅助编写</li>
<li class="">工单自动回复</li>
<li class="">数据查询助手</li>
</ul>
<p>让 AI 真正成为你工作的“副驾驶”。</p>
<p>赶紧动手试试吧！有任何问题欢迎留言交流，我们一起打造更聪明的办公生态 💬</p>
<hr>
<p>📌 本文参考资料：</p>
<ul>
<li class="">OpenClaw 官方文档：<a href="https://docs.openclaw.ai/" target="_blank" rel="noopener noreferrer" class="">https://docs.openclaw.ai</a></li>
<li class="">飞书开放平台：<a href="https://open.feishu.cn/" target="_blank" rel="noopener noreferrer" class="">https://open.feishu.cn</a></li>
</ul>
<p>📌 关键词标签：#OpenClaw教程 #飞书机器人 #AI办公自动化 #大模型接入 #Qwen #Nodejs #开发者指南</p>]]></content:encoded>
            <category>AI</category>
            <category>OpenClaw</category>
            <category>Claude</category>
            <category>ChatGPT</category>
        </item>
        <item>
            <title><![CDATA[minio 快速搭建]]></title>
            <link>https://xxzkid.github.io/2025/minio-quickstart/</link>
            <guid>https://xxzkid.github.io/2025/minio-quickstart/</guid>
            <pubDate>Tue, 09 Dec 2025 08:00:00 GMT</pubDate>
            <description><![CDATA[MinIO 快速搭建教程，包含服务启动、数据目录、控制台、客户端别名、Bucket 和安全配置。]]></description>
            <content:encoded><![CDATA[<p>minio是一款分布式文件服务器，提供了文件储存与访问的能力。类似阿里云OSS服务。</p>
<p>快速启动只能证明服务可运行，生产部署还需要考虑多盘冗余、TLS、访问密钥、反向代理、监控和备份。不同版本命令可能调整，执行前应核对对应版本文档。</p>
<p>环境准备</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">git docker docker-compose</span><br></div></code></pre></div></div>
<p>编写docker-compose.yaml</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">services:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  minio:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    container_name: minio</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    image: quay.io/minio/minio:RELEASE.2024-09-22T00-33-43Z</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    command: server /data --console-address ":9001"</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    #network_mode: host</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    environment:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      MINIO_ROOT_USER: minioadmin</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      MINIO_ROOT_PASSWORD: minioadmin</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    volumes:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      - "./data:/data"</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    ports:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      - "9000:9000"</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      - "9001:9001"</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    restart: always</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    extra_hosts:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      - "svc175:192.168.0.175"</span><br></div></code></pre></div></div>
<p>启动</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker-compose -f docker-compose.yaml up -d</span><br></div></code></pre></div></div>
<p>浏览器访问:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">http://192.168.0.175:9001</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>minio</category>
            <category>java</category>
        </item>
        <item>
            <title><![CDATA[n8n快速搭建]]></title>
            <link>https://xxzkid.github.io/2025/n8n-quickstart/</link>
            <guid>https://xxzkid.github.io/2025/n8n-quickstart/</guid>
            <pubDate>Tue, 09 Dec 2025 08:00:00 GMT</pubDate>
            <description><![CDATA[n8n 快速搭建教程，介绍 Docker 启动、持久化、反向代理、Webhook、认证和备份。]]></description>
            <content:encoded><![CDATA[<p>n8n 是一款 AI 工作流自动化平台</p>
<p>n8n 工作流可能保存 API 密钥和业务数据，不能只启动容器就直接暴露公网。部署时应设置持久化目录、加密密钥、HTTPS、访问控制和数据库备份。</p>
<p>安装准备</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker docker-compose</span><br></div></code></pre></div></div>
<p>编写docker-compose.yaml</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">services:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  n8n:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    image: docker.n8n.io/n8nio/n8n:2.0.0</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    container_name: n8n</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    privileged: true</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    user: root</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    restart: always</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    ports:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      # web 界面访问端口</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      - "5678:5678"</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    environment:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      - TZ=Asia/Shanghai</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      - N8N_DEFAULT_LOCALE=zh-CN</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      - N8N_SECURE_COOKIE=false</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      - N8N_ENCRYPTION_KEY=1234567890</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      - DB_TYPE=sqlite</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      - DB_SQLITE_DATABASE=/home/node/.n8n/database.sqlite</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    volumes:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      - ./data:/home/node/.n8n</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      # https://github.com/other-blowsnow/n8n-i18n-chinese/releases/download/n8n%401.123.4/editor-ui.tar.gz</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      - ./dist:/usr/local/lib/node_modules/n8n/node_modules/n8n-editor-ui/dist</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    extra_hosts:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      - "node1-svc:192.168.0.175"</span><br></div></code></pre></div></div>
<p>启动</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker-compose up -d</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>n8n</category>
            <category>ai</category>
            <category>java</category>
        </item>
        <item>
            <title><![CDATA[minio数据迁移]]></title>
            <link>https://xxzkid.github.io/2025/minio-data-migration/</link>
            <guid>https://xxzkid.github.io/2025/minio-data-migration/</guid>
            <pubDate>Thu, 27 Nov 2025 08:00:00 GMT</pubDate>
            <description><![CDATA[MinIO 数据迁移教程，介绍 mc mirror、增量同步、校验、版本对象、权限和切换方案。]]></description>
            <content:encoded><![CDATA[<p>minio服务器迁移，需要把原来的数据迁移到新的服务器上，minio官方给我们提供了mc的工具来进行迁移</p>
<p>对象存储迁移不仅要复制当前对象，还要确认版本、删除标记、元数据、生命周期规则和访问策略。正式切换前应先全量同步，再进行增量追平并抽样校验对象数量与哈希。</p>
<p>下载安装mc</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">wget http://dl.minio.org.cn/client/mc/release/linux-amd64/mc</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">chmod +x mc</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">cp -rp mc /usr/bin/mc</span><br></div></code></pre></div></div>
<p>迁移数据准备</p>
<p>老服务器地址 192.168.1.10:9000</p>
<p>新服务器地址 192.168.1.11:9000</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">mc alias set old http://192.168.1.10:9000 adminminio adminminio</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">mc alias set new http://192.168.1.11:9000 adminminio adminminio</span><br></div></code></pre></div></div>
<blockquote>
<p>如果是跨机房，可以开放外网进行迁移</p>
<p>mc alise set 名称 服务地址 用户名 密码</p>
<p>这里一个叫old 一个叫new</p>
</blockquote>
<p>全量迁移，重名文件不覆盖，bucket不存在会自动创建</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">mc mirror old new</span><br></div></code></pre></div></div>
<p>只是迁移某个bucket，以test为例，目标的bucket需要提前建好（此处假如桶为test）</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">mc mirror old/test new/test</span><br></div></code></pre></div></div>
<p>覆盖重名文件，加--overwrite</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">mc mirror --overwrite old/test new/test</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>minio</category>
            <category>java</category>
        </item>
        <item>
            <title><![CDATA[opengauss数据库快速开始]]></title>
            <link>https://xxzkid.github.io/2025/opengauss-quickstart/</link>
            <guid>https://xxzkid.github.io/2025/opengauss-quickstart/</guid>
            <pubDate>Wed, 26 Nov 2025 08:00:00 GMT</pubDate>
            <description><![CDATA[openGauss 数据库快速入门，介绍安装、实例启动、用户创建、远程连接和常用 SQL。]]></description>
            <content:encoded><![CDATA[<p>opengauss数据库是一款基于postgres开发的国产数据库。</p>
<p>快速开始安装
数据库能够登录只是第一步，实际使用还需规划字符集、时区、认证、备份、监控和磁盘空间。远程访问应限制来源地址，避免使用高权限账号承载业务连接。</p>
<p>下载安装包并解压</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">wget https://opengauss.obs.cn-south-1.myhuaweicloud.com/6.0.2/CentOS7/x86/openGauss-Server-6.0.2-CentOS7-x86_64.tar.bz2</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">mkdir -p /usr/local/opengauss &amp;&amp; tar -jxvf openGauss-Server-6.0.2-CentOS7-x86_64.tar.bz2 -C /usr/local/opengauss</span><br></div></code></pre></div></div>
<p>创建数据库用户</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">groupadd -g 1001 dbgrp</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">useradd -u 2001 -g dbgrp omm</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">chown -R omm:dbgrp /usr/local/opengauss</span><br></div></code></pre></div></div>
<p>修改系统配置</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">cat &gt;&gt; /etc/sysctl.conf &lt;&lt; EOF</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.ipv4.tcp_max_tw_buckets = 10000</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.ipv4.tcp_tw_reuse = 1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.ipv4.tcp_tw_recycle = 1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.ipv4.tcp_keepalive_time = 30</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.ipv4.tcp_keepalive_probes = 9</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.ipv4.tcp_keepalive_intvl = 30</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.ipv4.tcp_retries1 = 5</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.ipv4.tcp_syn_retries = 5</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.ipv4.tcp_synack_retries = 5</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.ipv4.tcp_retries2 = 12</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">vm.overcommit_memory = 0</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.ipv4.tcp_rmem = 8192 250000 16777216</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.ipv4.tcp_wmem = 8192 250000 16777216</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.core.wmem_max = 21299200</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.core.rmem_max = 21299200</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.core.wmem_default = 21299200</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.core.rmem_default = 21299200</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.ipv4.ip_local_port_range = 26000 65535</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">kernel.sem = 250 6400000 1000 25600</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">vm.min_free_kbytes = 102400 ##suggest to set as physical memory * 5%</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.core.somaxconn = 65535</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.ipv4.tcp_syncookies = 1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.core.netdev_max_backlog = 65535</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.ipv4.tcp_max_syn_backlog = 65535</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.ipv4.tcp_fin_timeout = 60</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">kernel.shmall = 1152921504606846720</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">kernel.shmmax = 18446744073709551615</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.ipv4.tcp_sack = 1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">net.ipv4.tcp_timestamps = 1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">vm.extfrag_threshold = 500</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">vm.overcommit_ratio = 90</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">EOF</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">sysctl -p</span><br></div></code></pre></div></div>
<p>开始安装</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">su - omm</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">cd /usr/local/opengauss/simpleInstall</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">sh install.sh  -w "xxx" -p 54320</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">source ~/.bashrc</span><br></div></code></pre></div></div>
<p>登录数据库</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">gsql -d postgres -p 54320</span><br></div></code></pre></div></div>
<p>创建postgres用户并授权</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">CREATE USER postgres WITH PASSWORD "xxx";</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">GRANT ALL PRIVILEGES TO postgres;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">\q # 退出sql命令行</span><br></div></code></pre></div></div>
<p>授权postgres用户远程登录</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">gs_guc set -N all -I all -h "host all postgres 0.0.0.0/0 sha256"</span><br></div></code></pre></div></div>
<p>开放端口</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">cd /usr/local/opengauss/data/single_node</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">vim pg_hba.conf</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">#host    all             all             127.0.0.1/32            trust</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">host    all             all             0.0.0.0/0               sha256</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">vim postgresql.conf</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">listen_addresses = '*'</span><br></div></code></pre></div></div>
<p>JDBC使用</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt;!-- 添加依赖 --&gt;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt;dependency&gt;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    &lt;groupId&gt;org.opengauss&lt;/groupId&gt;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    &lt;artifactId&gt;opengauss-jdbc&lt;/artifactId&gt;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    &lt;version&gt;6.0.2&lt;/version&gt;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt;/dependency&gt;</span><br></div></code></pre></div></div>
<p>代码</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">try (Connection conn = DriverManager.getConnection("jdbc:postgresql://ip:port/school", "postgres", "xxx");</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">     PreparedStatement statement = conn.prepareStatement("select * from student");</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">     ResultSet resultSet = statement.executeQuery()){</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    while (resultSet.next()) {</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        ResultSetMetaData metaData = resultSet.getMetaData();</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        for (int i = 0; i &lt; metaData.getColumnCount(); i++) {</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            String columnName = metaData.getColumnName(i + 1);</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            System.out.println(columnName + ": " + resultSet.getString(columnName));</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        }</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        System.out.println("---------------");</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">} catch (SQLException e) {</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    throw new RuntimeException(e);</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">}</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>opengauss</category>
            <category>java</category>
        </item>
        <item>
            <title><![CDATA[switchomega 配置]]></title>
            <link>https://xxzkid.github.io/2025/switchomega-config/</link>
            <guid>https://xxzkid.github.io/2025/switchomega-config/</guid>
            <pubDate>Sat, 13 Sep 2025 08:00:00 GMT</pubDate>
            <description><![CDATA[SwitchOmega 与 ZeroOmega 代理规则配置教程，介绍情景模式、自动切换、规则列表和排错。]]></description>
            <content:encoded><![CDATA[<p>今天介绍chrome插件 switchomega</p>
<p>浏览器代理扩展只负责根据规则选择代理服务器，本身并不提供代理节点。导入外部规则列表前应确认来源可信，并避免让账号密码等敏感流量经过未知代理。</p>
<p>下载地址：<a href="https://github.com/zero-peak/ZeroOmega/releases" target="_blank" rel="noopener noreferrer" class="">https://github.com/zero-peak/ZeroOmega/releases</a></p>
<p>chrome 下载 crx</p>
<p>firefox 下载 xpi</p>
<p>打开插件</p>
<p>auto switch == 规则列表设置 == 规则列表网址</p>
<p><a href="https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt" target="_blank" rel="noopener noreferrer" class="">https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt</a></p>
<p>按照规则列表匹配请求 == 选择 proxy</p>]]></content:encoded>
            <category>工具</category>
            <category>switchomega</category>
        </item>
        <item>
            <title><![CDATA[文件重命名工具]]></title>
            <link>https://xxzkid.github.io/2025/file-rename-quickstart/</link>
            <guid>https://xxzkid.github.io/2025/file-rename-quickstart/</guid>
            <pubDate>Mon, 16 Jun 2025 08:00:00 GMT</pubDate>
            <description><![CDATA[文件批量重命名工具的设计与使用，包含命名规则、冲突检测、预览、回滚和 Java 实现要点。]]></description>
            <content:encoded><![CDATA[<p>文件重命名工具</p>
<p>你是否还在为文件批量重命名发愁，下面的代码很好的解决了文件重命名问题</p>
<p>批量重命名最重要的不是执行速度，而是避免覆盖和不可逆错误。可靠工具应先生成变更预览，检测重名、非法字符和跨文件系统问题，再让用户确认执行。</p>
<p>实现代码</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">String[] args = new String[]{"C:\\tests"};</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">String matchRegex = "(\\d{6})";</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">String replaceRegex = "$1.json";</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Pattern pattern = Pattern.compile(matchRegex);</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">File file = new File(args[0]);</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">if (file.exists()) {</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    File[] files = file.listFiles();</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    if (files != null) {</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        System.out.println("files : " + files.length);</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        for (File f : files) {</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            Matcher matcher = pattern.matcher(f.getName());</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            if (matcher.matches()) {</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">                String s = matcher.replaceAll(replaceRegex);</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">                System.out.println(s);</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">                f.renameTo(new File(f.getParent() + File.separator + s));</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        }</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">}</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>文件重命名</category>
            <category>工具</category>
            <category>java</category>
        </item>
        <item>
            <title><![CDATA[npm install卡住]]></title>
            <link>https://xxzkid.github.io/2025/npm-install-hang/</link>
            <guid>https://xxzkid.github.io/2025/npm-install-hang/</guid>
            <pubDate>Thu, 29 May 2025 08:00:00 GMT</pubDate>
            <description><![CDATA[系统排查 npm install 卡住或安装速度慢的问题，包括 verbose 日志、网络与代理检查、缓存验证、registry 配置、锁文件和 Node.js 版本处理。]]></description>
            <content:encoded><![CDATA[<p>执行 <code>npm install</code> 长时间没有进度，通常与网络、代理、缓存、依赖解析或 Node.js/npm 版本有关。不要连续重复执行安装命令，应先通过详细日志确认卡在哪个阶段。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-打开详细日志">1. 打开详细日志<a href="https://xxzkid.github.io/2025/npm-install-hang/#1-%E6%89%93%E5%BC%80%E8%AF%A6%E7%BB%86%E6%97%A5%E5%BF%97" class="hash-link" aria-label="1. 打开详细日志的直接链接" title="1. 打开详细日志的直接链接" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">npm install --verbose</span><br></div></code></pre></div></div>
<p>如果日志停留在下面的位置：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">npm timing idealTree:userRequests Completed in 0ms</span><br></div></code></pre></div></div>
<p>这只表示 npm 正在解析依赖树，真正原因还需要结合它前后的网络请求和报错判断。</p>
<p>也可以查看 npm 当前环境：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">node -v</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">npm -v</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">npm config get registry</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">npm config get proxy</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">npm config get https-proxy</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-检查-registry-是否可访问">2. 检查 registry 是否可访问<a href="https://xxzkid.github.io/2025/npm-install-hang/#2-%E6%A3%80%E6%9F%A5-registry-%E6%98%AF%E5%90%A6%E5%8F%AF%E8%AE%BF%E9%97%AE" class="hash-link" aria-label="2. 检查 registry 是否可访问的直接链接" title="2. 检查 registry 是否可访问的直接链接" translate="no">​</a></h2>
<p>先测试当前仓库：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">npm ping</span><br></div></code></pre></div></div>
<p>npm 官方 registry 为：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">npm config set registry https://registry.npmjs.org/</span><br></div></code></pre></div></div>
<p>网络访问官方源较慢时，也可以临时使用镜像：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">npm config set registry https://registry.npmmirror.com/</span><br></div></code></pre></div></div>
<p>安装完成后，可根据部署环境切回官方源。团队项目不建议随意提交个人网络环境相关的 registry 配置。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-检查错误的代理配置">3. 检查错误的代理配置<a href="https://xxzkid.github.io/2025/npm-install-hang/#3-%E6%A3%80%E6%9F%A5%E9%94%99%E8%AF%AF%E7%9A%84%E4%BB%A3%E7%90%86%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="3. 检查错误的代理配置的直接链接" title="3. 检查错误的代理配置的直接链接" translate="no">​</a></h2>
<p>曾经配置过代理，但代理服务已经关闭，也会导致安装一直等待：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">npm config delete proxy</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">npm config delete https-proxy</span><br></div></code></pre></div></div>
<p>如果公司网络必须经过代理，应填写实际可用的代理地址，而不是直接删除。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-验证-npm-缓存">4. 验证 npm 缓存<a href="https://xxzkid.github.io/2025/npm-install-hang/#4-%E9%AA%8C%E8%AF%81-npm-%E7%BC%93%E5%AD%98" class="hash-link" aria-label="4. 验证 npm 缓存的直接链接" title="4. 验证 npm 缓存的直接链接" translate="no">​</a></h2>
<p>优先使用缓存验证：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">npm cache verify</span><br></div></code></pre></div></div>
<p>只有确认缓存损坏时才强制清理：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">npm cache clean --force</span><br></div></code></pre></div></div>
<p>清理缓存会使后续依赖重新下载，因此不应作为第一步操作。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-根据锁文件重新安装">5. 根据锁文件重新安装<a href="https://xxzkid.github.io/2025/npm-install-hang/#5-%E6%A0%B9%E6%8D%AE%E9%94%81%E6%96%87%E4%BB%B6%E9%87%8D%E6%96%B0%E5%AE%89%E8%A3%85" class="hash-link" aria-label="5. 根据锁文件重新安装的直接链接" title="5. 根据锁文件重新安装的直接链接" translate="no">​</a></h2>
<p>项目存在 <code>package-lock.json</code> 时，CI 或需要可重复安装的场景建议使用：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">npm ci</span><br></div></code></pre></div></div>
<p>如果怀疑 <code>node_modules</code> 状态异常，可以先移走或删除该目录，再执行 <code>npm ci</code>。不要随意删除 <code>package-lock.json</code>，否则可能引入不同版本的间接依赖。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-检查依赖和运行时版本">6. 检查依赖和运行时版本<a href="https://xxzkid.github.io/2025/npm-install-hang/#6-%E6%A3%80%E6%9F%A5%E4%BE%9D%E8%B5%96%E5%92%8C%E8%BF%90%E8%A1%8C%E6%97%B6%E7%89%88%E6%9C%AC" class="hash-link" aria-label="6. 检查依赖和运行时版本的直接链接" title="6. 检查依赖和运行时版本的直接链接" translate="no">​</a></h2>
<p>查看过期依赖：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">npm outdated</span><br></div></code></pre></div></div>
<p>如果项目较旧，应确认它支持当前 Node.js 版本。原生模块还可能依赖 Python、编译器或系统开发包，详细错误通常会出现在 verbose 日志末尾。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="快速排查顺序">快速排查顺序<a href="https://xxzkid.github.io/2025/npm-install-hang/#%E5%BF%AB%E9%80%9F%E6%8E%92%E6%9F%A5%E9%A1%BA%E5%BA%8F" class="hash-link" aria-label="快速排查顺序的直接链接" title="快速排查顺序的直接链接" translate="no">​</a></h2>
<ol>
<li class="">使用 <code>npm install --verbose</code> 确认卡住位置。</li>
<li class="">执行 <code>npm ping</code> 检查 registry。</li>
<li class="">检查并修正代理配置。</li>
<li class="">执行 <code>npm cache verify</code>。</li>
<li class="">有锁文件时尝试 <code>npm ci</code>。</li>
<li class="">核对 Node.js、npm 与项目依赖的兼容性。</li>
</ol>]]></content:encoded>
            <category>npm</category>
            <category>js</category>
        </item>
        <item>
            <title><![CDATA[freeswitch制作docker镜像]]></title>
            <link>https://xxzkid.github.io/2025/freeswitch-docker/</link>
            <guid>https://xxzkid.github.io/2025/freeswitch-docker/</guid>
            <pubDate>Mon, 12 May 2025 08:00:00 GMT</pubDate>
            <description><![CDATA[FreeSWITCH Docker 镜像制作教程，说明编译依赖、模块选择、配置挂载、端口和音频网络问题。]]></description>
            <content:encoded><![CDATA[<p>FreeSWITCH是一个开源的电话软交换平台，支持实时音视频通信及会议，支持SIP及WebRTC等多种通信协议。</p>
<p>开始制作docker镜像
容器化 FreeSWITCH 除了构建镜像，还要正确处理 SIP、RTP 端口范围、NAT、时区、录音持久化和进程信号。上线前应进行呼入、呼出、双向音频和容器重启测试。</p>
<p>编写Dockerfile</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">FROM debian:bullseye</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">RUN sed -i 's/http:\/\/deb.debian.org/http:\/\/mirrors.aliyun.com/g' /etc/apt/sources.list</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">RUN apt-get update &amp;&amp; DEBIAN_FRONTEND=noninteractive apt-get -yq install git</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">RUN git clone https://github.com/signalwire/freeswitch /usr/src/freeswitch</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">RUN git clone https://github.com/signalwire/libks /usr/src/libs/libks</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">RUN git clone https://github.com/freeswitch/sofia-sip /usr/src/libs/sofia-sip</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">RUN git clone https://github.com/freeswitch/spandsp /usr/src/libs/spandsp</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">RUN git clone https://github.com/signalwire/signalwire-c /usr/src/libs/signalwire-c</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">RUN DEBIAN_FRONTEND=noninteractive apt-get -yq install \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># build</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    build-essential cmake automake autoconf 'libtool-bin|libtool' pkg-config \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># general</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    libssl-dev zlib1g-dev libdb-dev unixodbc-dev libncurses5-dev libexpat1-dev libgdbm-dev bison erlang-dev libtpl-dev libtiff5-dev uuid-dev \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># core</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    libpcre3-dev libedit-dev libsqlite3-dev libcurl4-openssl-dev nasm \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># core codecs</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    libogg-dev libspeex-dev libspeexdsp-dev \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># mod_enum</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    libldns-dev \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># mod_python3</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    python3-dev \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># mod_av</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    libavformat-dev libswscale-dev libavresample-dev \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># mod_lua</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    liblua5.2-dev \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># mod_opus</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    libopus-dev \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># mod_pgsql</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    libpq-dev \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># mod_sndfile</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    libsndfile1-dev libflac-dev libogg-dev libvorbis-dev \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># mod_shout</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    libshout3-dev libmpg123-dev libmp3lame-dev</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">RUN cd /usr/src/libs/libks &amp;&amp; cmake . -DCMAKE_INSTALL_PREFIX=/usr -DWITH_LIBBACKTRACE=1 &amp;&amp; make install</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">RUN cd /usr/src/libs/sofia-sip &amp;&amp; ./bootstrap.sh &amp;&amp; ./configure CFLAGS="-g -ggdb" --with-pic --with-glib=no --without-doxygen --disable-stun --prefix=/usr &amp;&amp; make -j`nproc --all` &amp;&amp; make install</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">RUN cd /usr/src/libs/spandsp &amp;&amp; ./bootstrap.sh &amp;&amp; ./configure CFLAGS="-g -ggdb" --with-pic --prefix=/usr &amp;&amp; make -j`nproc --all` &amp;&amp; make install</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">RUN cd /usr/src/libs/signalwire-c &amp;&amp; PKG_CONFIG_PATH=/usr/lib/pkgconfig cmake . -DCMAKE_INSTALL_PREFIX=/usr &amp;&amp; make install</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Enable modules</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">RUN sed -i 's|#formats/mod_shout|formats/mod_shout|' /usr/src/freeswitch/build/modules.conf.in</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">RUN cd /usr/src/freeswitch &amp;&amp; ./bootstrap.sh -j</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">RUN cd /usr/src/freeswitch &amp;&amp; ./configure</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">RUN cd /usr/src/freeswitch &amp;&amp; make -j`nproc` &amp;&amp; make install</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Cleanup the image</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">RUN apt-get clean</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Uncomment to cleanup even more</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">#RUN rm -rf /usr/src/*</span><br></div></code></pre></div></div>
<p>制作镜像</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker build -t fs:latest .</span><br></div></code></pre></div></div>
<p>启动镜像</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker run -itd --net=host --name fs fs:latest</span><br></div></code></pre></div></div>
<p>启动freeswitch</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker exec -it fs bash</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">cd /usr/local/freeswitch</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">./bin/freeswitch</span><br></div></code></pre></div></div>
<p>开放端口</p>





































































































<table><thead><tr><th>FireWall Ports</th><th>Network Protocol</th><th>Application Protocol</th><th>Description</th></tr></thead><tbody><tr><td>1719</td><td>UDP</td><td>H.323 Gatekeeper RAS port</td><td></td></tr><tr><td>1720</td><td>TCP</td><td>H.323 Call Signaling</td><td></td></tr><tr><td>2855-2856</td><td>TCP</td><td>MSRP</td><td>Used for call with messaging</td></tr><tr><td>3478</td><td>UDP</td><td>STUN service</td><td>Used for NAT traversal</td></tr><tr><td>3479</td><td>UDP</td><td>STUN service</td><td>Used for NAT traversal</td></tr><tr><td>5002</td><td>TCP</td><td>MLP protocol server</td><td></td></tr><tr><td>5003</td><td>UDP</td><td>Neighborhood service</td><td></td></tr><tr><td>5060</td><td>UDP &amp; TCP</td><td>SIP UAS</td><td>Used for SIP signaling (Standard SIP Port, for default Internal Profile)</td></tr><tr><td>5070</td><td>UDP &amp; TCP</td><td>SIP UAS</td><td>Used for SIP signaling (For default "NAT" Profile)</td></tr><tr><td>5080</td><td>UDP &amp; TCP</td><td>SIP UAS</td><td>Used for SIP signaling (For default "External" Profile)</td></tr><tr><td>8021</td><td>TCP</td><td>ESL</td><td>Used for mod_event_socket *</td></tr><tr><td>16384-32768</td><td>UDP</td><td>RTP/ RTCP multimedia streaming</td><td>Used for audio/video data in SIP, Verto, and other protocols</td></tr><tr><td>5066</td><td>TCP</td><td>Websocket</td><td>Used for WebRTC</td></tr><tr><td>7443</td><td>TCP</td><td>Websocket</td><td>Used for WebRTC</td></tr><tr><td>8081-8082</td><td>TCP</td><td>Websocket</td><td>Used for Verto</td></tr></tbody></table>]]></content:encoded>
            <category>freeswitch</category>
            <category>docker</category>
        </item>
        <item>
            <title><![CDATA[快速搭建HTTP代理服务器]]></title>
            <link>https://xxzkid.github.io/2025/http-proxy-with-tinyproxy/</link>
            <guid>https://xxzkid.github.io/2025/http-proxy-with-tinyproxy/</guid>
            <pubDate>Fri, 09 May 2025 08:00:00 GMT</pubDate>
            <description><![CDATA[Tinyproxy 快速搭建 HTTP 代理服务器，包含安装、Allow 访问控制、端口、防火墙和日志排查。]]></description>
            <content:encoded><![CDATA[<p>今天我们介绍一款轻量级HTTP代理服务器 tinyproxy</p>
<p>开放代理很容易被滥用并消耗带宽，部署时必须限制来源 IP、监听地址和防火墙规则。Tinyproxy 适合轻量 HTTP 代理，不等同于提供加密隧道的 VPN。</p>
<p>安装</p>
<p>先启动一个docker ubuntu 【可选】</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker run -itd -p 8888:8888 ubuntu-test ubuntu:22.04</span><br></div></code></pre></div></div>
<p>进入系统【可选】</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">docker exec -it ubuntu-test bash</span><br></div></code></pre></div></div>
<p>安装tinyproxy</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">apt update</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">apt install tinyproxy -y</span><br></div></code></pre></div></div>
<p>编写配置文件</p>
<p>vim /tmp/tinyproxy.conf</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">Port 8888</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Listen 0.0.0.0</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Timeout 600</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">BindSame yes</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">MaxClients 1024</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">#Allow 0.0.0.0</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">#Allow ::1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">DisableViaHeader Yes</span><br></div></code></pre></div></div>
<p>启动程序</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">tinyproxy -d -c /tmp/tinyproxy.conf</span><br></div></code></pre></div></div>
<p>验证</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">export ip=xx.xx.xxx.xxx</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">curl --proxy http://$ip:8888 http://httpbin.org/ip</span><br></div></code></pre></div></div>
<p>结果会返回代理服务器ip</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">{</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  "origin": "xx.xx.xxx.xxx"</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">}</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>proxy</category>
            <category>tinyproxy</category>
            <category>http</category>
        </item>
        <item>
            <title><![CDATA[maven测试指定测试方法]]></title>
            <link>https://xxzkid.github.io/2025/mvn-testcase/</link>
            <guid>https://xxzkid.github.io/2025/mvn-testcase/</guid>
            <pubDate>Thu, 17 Apr 2025 08:00:00 GMT</pubDate>
            <description><![CDATA[整理 Maven 运行全部测试、指定测试类、指定测试方法及多模块项目测试的常用命令，并说明 -Dtest、-pl、-am 等参数。]]></description>
            <content:encoded><![CDATA[<p>Maven 项目通常通过 Surefire 插件执行单元测试。开发和排查问题时，可以只运行某个测试类或测试方法，减少等待时间并快速验证修改结果。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="运行全部单元测试">运行全部单元测试<a href="https://xxzkid.github.io/2025/mvn-testcase/#%E8%BF%90%E8%A1%8C%E5%85%A8%E9%83%A8%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95" class="hash-link" aria-label="运行全部单元测试的直接链接" title="运行全部单元测试的直接链接" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">mvn test</span><br></div></code></pre></div></div>
<p>该命令会执行当前模块中测试源码目录下符合命名规则的单元测试。</p>
<p>如果希望先清理旧的编译结果：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">mvn clean test</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="指定测试类">指定测试类<a href="https://xxzkid.github.io/2025/mvn-testcase/#%E6%8C%87%E5%AE%9A%E6%B5%8B%E8%AF%95%E7%B1%BB" class="hash-link" aria-label="指定测试类的直接链接" title="指定测试类的直接链接" translate="no">​</a></h2>
<p>使用测试类的简单类名：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">mvn test -Dtest=UserServiceTest</span><br></div></code></pre></div></div>
<p>也可以匹配多个测试类：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">mvn test -Dtest=UserServiceTest,OrderServiceTest</span><br></div></code></pre></div></div>
<p>使用通配符运行一组测试：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">mvn test -Dtest='*ServiceTest'</span><br></div></code></pre></div></div>
<p>在部分 Shell 中，<code>*</code> 会被展开，因此建议给表达式加引号。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="指定测试方法">指定测试方法<a href="https://xxzkid.github.io/2025/mvn-testcase/#%E6%8C%87%E5%AE%9A%E6%B5%8B%E8%AF%95%E6%96%B9%E6%B3%95" class="hash-link" aria-label="指定测试方法的直接链接" title="指定测试方法的直接链接" translate="no">​</a></h2>
<p>基本格式：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">mvn test -Dtest=测试类名#测试方法名</span><br></div></code></pre></div></div>
<p>例如：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">mvn test -Dtest=UserServiceTest#shouldCreateUser</span><br></div></code></pre></div></div>
<p>如果方法是参数化测试或生成了多个用例，实际匹配能力取决于项目所使用的 JUnit 和 Surefire 版本。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="多模块项目指定模块">多模块项目指定模块<a href="https://xxzkid.github.io/2025/mvn-testcase/#%E5%A4%9A%E6%A8%A1%E5%9D%97%E9%A1%B9%E7%9B%AE%E6%8C%87%E5%AE%9A%E6%A8%A1%E5%9D%97" class="hash-link" aria-label="多模块项目指定模块的直接链接" title="多模块项目指定模块的直接链接" translate="no">​</a></h2>
<p>使用 <code>-pl</code> 选择需要测试的模块：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">mvn test -pl seata-spring-autoconfigure \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  -Dtest=org.apache.seata.spring.boot.autoconfigure.SeataCoreAutoConfigurationTest \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  -Dspring-boot.version=3.2.0 \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  -Dspring-framework.version=6.1.1</span><br></div></code></pre></div></div>
<p>常用参数：</p>
<ul>
<li class=""><code>-pl module-name</code>：只选择指定模块。</li>
<li class=""><code>-am</code>：同时构建该模块依赖的其他模块。</li>
<li class=""><code>-amd</code>：同时构建依赖该模块的下游模块。</li>
</ul>
<p>例如：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">mvn test -pl user-service -am -Dtest=UserServiceTest</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="没有匹配到测试时">没有匹配到测试时<a href="https://xxzkid.github.io/2025/mvn-testcase/#%E6%B2%A1%E6%9C%89%E5%8C%B9%E9%85%8D%E5%88%B0%E6%B5%8B%E8%AF%95%E6%97%B6" class="hash-link" aria-label="没有匹配到测试时的直接链接" title="没有匹配到测试时的直接链接" translate="no">​</a></h2>
<p>如果出现“No tests were executed”或“No tests matching pattern”：</p>
<ol>
<li class="">检查类名和方法名是否拼写正确。</li>
<li class="">确认测试位于 <code>src/test/java</code>。</li>
<li class="">检查测试框架是否被 Surefire 正确识别。</li>
<li class="">查看父 POM 中是否覆盖了 Surefire 的包含或排除规则。</li>
<li class="">多模块项目确认 <code>-pl</code> 选择的是包含该测试的模块。</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="单元测试与集成测试">单元测试与集成测试<a href="https://xxzkid.github.io/2025/mvn-testcase/#%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E4%B8%8E%E9%9B%86%E6%88%90%E6%B5%8B%E8%AF%95" class="hash-link" aria-label="单元测试与集成测试的直接链接" title="单元测试与集成测试的直接链接" translate="no">​</a></h2>
<p><code>mvn test</code> 一般由 Surefire 执行单元测试。使用 Failsafe 插件的集成测试通常在 <code>integration-test</code> 和 <code>verify</code> 阶段运行：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">mvn verify</span><br></div></code></pre></div></div>
<p>如果指定测试没有运行，还应确认该测试属于单元测试还是集成测试。</p>]]></content:encoded>
            <category>maven</category>
            <category>java</category>
        </item>
        <item>
            <title><![CDATA[flutter开发常见问题]]></title>
            <link>https://xxzkid.github.io/2025/flutter-faq/</link>
            <guid>https://xxzkid.github.io/2025/flutter-faq/</guid>
            <pubDate>Mon, 31 Mar 2025 08:00:00 GMT</pubDate>
            <description><![CDATA[Flutter 开发常见问题汇总，涵盖环境配置、依赖下载、构建失败、设备连接和缓存处理。]]></description>
            <content:encoded><![CDATA[<p>flutter 开发常见问题
Flutter 问题通常与 SDK、Dart、Gradle、Android 工具链和依赖版本共同相关。提交或记录故障时，应附上 flutter doctor、完整错误堆栈和可复现步骤。</p>
<ol>
<li class="">下载flutter</li>
</ol>
<p>windows 下载</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">https://storage.googleapis.com/flutter_infra_release/releases/stable/windows/flutter_windows_3.29.2-stable.zip</span><br></div></code></pre></div></div>
<ol start="2">
<li class="">环境变量配置</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">PUB_HOSTED_URL=https://pub.flutter-io.cn</span><br></div></code></pre></div></div>
<ol start="3">
<li class="">排查Running Gradle task 'assembleDebug'...慢问题</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">cd android</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">.\gradlew.bat clean</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">查看那个下载慢，就把对应的包放到.gradle\caches\modules-2\files-2.1\</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">例如：kotlin-compiler-embeddable 1.8.22</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">目录：org.jetbrains.kotlin\kotlin-compiler-embeddable\1.8.22\d539a5dfaa4137bfdfec1322f569e8797da51d21</span><br></div></code></pre></div></div>
<ol start="4">
<li class="">gradle-wrapper 镜像配置</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">#distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.10.2-all.zip</span><br></div></code></pre></div></div>
<ol start="5">
<li class="">gradle maven镜像配置</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">android\build.gradle.kts</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">maven { url=uri("https://mirrors.tencent.com/nexus/repository/maven-public/") }</span><br></div></code></pre></div></div>
<ol start="6">
<li class="">flutter命令行创建项目</li>
</ol>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">flutter create my_app</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>flutter</category>
            <category>android</category>
        </item>
        <item>
            <title><![CDATA[chrome-driver安装]]></title>
            <link>https://xxzkid.github.io/2025/chromedriver-download/</link>
            <guid>https://xxzkid.github.io/2025/chromedriver-download/</guid>
            <pubDate>Sat, 15 Mar 2025 08:00:00 GMT</pubDate>
            <description><![CDATA[ChromeDriver 安装与版本匹配教程，介绍浏览器版本确认、驱动下载、PATH 配置和 Selenium 启动排错。]]></description>
            <content:encoded><![CDATA[<p>在自动化测试和网络爬虫开发中，chromedriver是连接 Selenium 与 Chrome 浏览器的核心桥梁。然而，安装过程中版本不匹配、路径配置错误等问题常常让人头疼。本文从实战出发，手把手教你如何快速安装并验证 ChromeDriver，避开常见“坑点”！</p>
<p>浏览器和驱动版本不匹配是 Selenium 启动失败的常见原因。排查时应同时记录 Chrome、ChromeDriver、Selenium 与操作系统架构，并优先使用自动化驱动管理能力。</p>
<ol>
<li class="">安装 Chrome 浏览器</li>
<li class="">查看 Chrome 版本
打开 Chrome 浏览器，输入 <code>chrome://settings/help</code> 查看版本号（如 108.0.5359.125）版本号的前三位需与 ChromeDriver 完全一致（例如 108.0.5359.x）</li>
</ol>
<h1>二、下载与安装 ChromeDriver</h1>
<p><a href="https://googlechromelabs.github.io/chrome-for-testing/" target="_blank" rel="noopener noreferrer" class="">https://googlechromelabs.github.io/chrome-for-testing/</a></p>
<h1>三、编写程序验证</h1>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">from selenium import webdriver</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">options = webdriver.ChromeOptions()</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">options.binary_location = 'chrome path'</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">driver = webdriver.Chrome(executable_path='chromedriver path', options=options)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">driver.get("https://www.baidu.com")</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">driver.maximize_window()</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">driver.quit()</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>chromedriver</category>
            <category>selenium</category>
            <category>java</category>
        </item>
        <item>
            <title><![CDATA[Apache Artemis安装]]></title>
            <link>https://xxzkid.github.io/2025/apache-artemis-install/</link>
            <guid>https://xxzkid.github.io/2025/apache-artemis-install/</guid>
            <pubDate>Mon, 17 Feb 2025 08:00:00 GMT</pubDate>
            <description><![CDATA[Apache ActiveMQ Artemis 安装与启动教程，包含目录结构、启动命令、管理控制台、端口检查和常见问题。]]></description>
            <content:encoded><![CDATA[<p>apache artemis是新一代的apache activemq</p>
<p>安装消息队列不仅要让进程成功启动，还要确认管理端口、消息协议端口、持久化目录和账号配置。生产环境还应关注权限、磁盘容量、JVM 参数和监控。</p>
<p>安装过程</p>
<p>apache artemis是一个java程序，所以前提需要安装java，这里我们推荐jdk17</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">export JAVA_HOME=/usr/local/jdk17</span><br></div></code></pre></div></div>
<p>下载</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">wget -O apache-artemis-2.39.0-bin.tar.gz https://www.apache.org/dyn/closer.cgi?filename=activemq/activemq-artemis/2.39.0/apache-artemis-2.39.0-bin.tar.gz&amp;action=download</span><br></div></code></pre></div></div>
<p>安装</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">tar -zxvf apache-artemis-2.39.0-bin.tar.gz</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">cd apache-artemis-2.39.0</span><br></div></code></pre></div></div>
<p>创建实例</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">./bin/artemis create broker </span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">--user: </span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">What is the default username? </span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">admin (输入账号) </span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">--password: </span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">is mandatory with this configuration: </span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">What is the default password? </span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">(输入账号密码)</span><br></div></code></pre></div></div>
<p>可选操作</p>
<p>修改内存大小</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">vim ./etc/artemis.profile</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Java Opts</span><br></div></code></pre></div></div>
<p>修改cors</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">vim ./etc/jolokia-access.xml</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt;allow-origin&gt;*://*&lt;/allow-origin&gt;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<p>修改console为可访问</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">vim ./etc/bootstrap.xml</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt;binding name="artemis" uri="http://0.0.0.0:8161"&gt;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>]]></content:encoded>
            <category>activemq</category>
            <category>java</category>
        </item>
        <item>
            <title><![CDATA[Linux安装mysql8压缩包版本]]></title>
            <link>https://xxzkid.github.io/2024/linux-install-mysql8-zip/</link>
            <guid>https://xxzkid.github.io/2024/linux-install-mysql8-zip/</guid>
            <pubDate>Tue, 10 Sep 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Linux 使用压缩包安装 MySQL 8 的步骤，包括用户目录、初始化、配置、systemd 和安全设置。]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="下载mysql8">下载mysql8<a href="https://xxzkid.github.io/2024/linux-install-mysql8-zip/#%E4%B8%8B%E8%BD%BDmysql8" class="hash-link" aria-label="下载mysql8的直接链接" title="下载mysql8的直接链接" translate="no">​</a></h2>
<p>压缩包安装适合需要自定义目录的环境，但不会自动完成系统用户、权限和服务管理配置。安装前应核对操作系统架构、依赖库和 MySQL 小版本，并妥善保存初始化密码。</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">https://dev.mysql.com/downloads/mysql/</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.39-linux-glibc2.28-x86_64.tar.xz</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="安装依赖工具">安装依赖工具<a href="https://xxzkid.github.io/2024/linux-install-mysql8-zip/#%E5%AE%89%E8%A3%85%E4%BE%9D%E8%B5%96%E5%B7%A5%E5%85%B7" class="hash-link" aria-label="安装依赖工具的直接链接" title="安装依赖工具的直接链接" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">apt install xz-utils -y</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="解压缩">解压缩<a href="https://xxzkid.github.io/2024/linux-install-mysql8-zip/#%E8%A7%A3%E5%8E%8B%E7%BC%A9" class="hash-link" aria-label="解压缩的直接链接" title="解压缩的直接链接" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">xz -dk mysql-8.0.39-linux-glibc2.28-x86_64.tar.xz</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">tar -xvf mysql-8.0.39-linux-glibc2.28-x86_64.tar</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">mv mysql-8.0.39-linux-glibc2.28-x86_64 mysql</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">mv mysql /usr/local/mysql</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="创建mysql数据目录">创建mysql数据目录<a href="https://xxzkid.github.io/2024/linux-install-mysql8-zip/#%E5%88%9B%E5%BB%BAmysql%E6%95%B0%E6%8D%AE%E7%9B%AE%E5%BD%95" class="hash-link" aria-label="创建mysql数据目录的直接链接" title="创建mysql数据目录的直接链接" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">mkdir /usr/local/mysql/data</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">mkdir /usr/local/mysql/mysqld</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">mkdir /usr/local/mysql/mysql-files</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">mkdir /usr/local/mysql/conf.d/</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="编写配置文件">编写配置文件<a href="https://xxzkid.github.io/2024/linux-install-mysql8-zip/#%E7%BC%96%E5%86%99%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6" class="hash-link" aria-label="编写配置文件的直接链接" title="编写配置文件的直接链接" translate="no">​</a></h2>
<p>vim /etc/my.cnf</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain"># For advice on how to change settings please see</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">[mysqld]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">#</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Remove leading # and set to the amount of RAM for the most important data</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># innodb_buffer_pool_size = 128M</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">#</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Remove leading # to turn on a very important data integrity option: logging</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># changes to the binary log between backups.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># log_bin</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">#</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Remove leading # to set options mainly useful for reporting servers.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># The server defaults are faster for transactions and fast SELECTs.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Adjust sizes as needed, experiment to find the optimal values.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># join_buffer_size = 128M</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># sort_buffer_size = 2M</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># read_rnd_buffer_size = 2M</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Remove leading # to revert to previous value for default_authentication_plugin,</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># this will increase compatibility with older clients. For background, see:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># default-authentication-plugin=mysql_native_password</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">skip-host-cache</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">skip-name-resolve</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">datadir=/usr/local/mysql/data</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">socket=/usr/local/mysql/mysqld/mysqld.sock</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">secure-file-priv=/usr/local/mysql/mysql-files</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">user=mysql</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">pid-file=/usr/local/mysql/mysqld/mysqld.pid</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">[client]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">socket=/usr/local/mysql/mysqld/mysqld.sock</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">!includedir /usr/local/mysql/conf.d/</span><br></div></code></pre></div></div>
<p>vim /usr/local/mysql/conf.d/mysqld.conf</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">[mysqld]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">bind-address = 0.0.0.0</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">max_connections=2000</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">#binlog_format=ROW</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">#binlog_row_image=full</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">#binlog_expire_logs_seconds=15552000</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">#expire_logs_days=180</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">#server_id=1</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="创建启动用户与授权">创建启动用户与授权<a href="https://xxzkid.github.io/2024/linux-install-mysql8-zip/#%E5%88%9B%E5%BB%BA%E5%90%AF%E5%8A%A8%E7%94%A8%E6%88%B7%E4%B8%8E%E6%8E%88%E6%9D%83" class="hash-link" aria-label="创建启动用户与授权的直接链接" title="创建启动用户与授权的直接链接" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">groupadd mysql</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">useradd -r -g mysql -s /bin/false mysql</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">chown -R mysql:mysql /usr/local/mysql</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="初始化mysql">初始化mysql<a href="https://xxzkid.github.io/2024/linux-install-mysql8-zip/#%E5%88%9D%E5%A7%8B%E5%8C%96mysql" class="hash-link" aria-label="初始化mysql的直接链接" title="初始化mysql的直接链接" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">记录输出的密码 A temporary password is generated for root@localhost: xxxxxxxx</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="设置开机启动">设置开机启动<a href="https://xxzkid.github.io/2024/linux-install-mysql8-zip/#%E8%AE%BE%E7%BD%AE%E5%BC%80%E6%9C%BA%E5%90%AF%E5%8A%A8" class="hash-link" aria-label="设置开机启动的直接链接" title="设置开机启动的直接链接" translate="no">​</a></h2>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">ln -s /usr/local/mysql/  /usr/bin/</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">cp -a support-files/mysql.server /etc/init.d/mysqld</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">chmod +x /etc/init.d/mysqld</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="编写服务配置">编写服务配置<a href="https://xxzkid.github.io/2024/linux-install-mysql8-zip/#%E7%BC%96%E5%86%99%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="编写服务配置的直接链接" title="编写服务配置的直接链接" translate="no">​</a></h2>
<p>vim /etc/systemd/system/mysqld.service</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">[Unit]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Description=MySQL Community Server</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">After=network.target</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">[Service]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Type=forking</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">ExecStart=/usr/local/mysql/support-files/mysql.server start</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">ExecStop=/usr/local/mysql/support-files/mysql.server stop</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">User=mysql</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Group=mysql</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Restart=always</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">[Install]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">WantedBy=multi-user.target</span><br></div></code></pre></div></div>
<p>重新加载配置</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">systemctl daemon-reload</span><br></div></code></pre></div></div>
<p>启动mysql</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">systemctl start mysqld</span><br></div></code></pre></div></div>
<p>设置开启服务</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">systemctl enable mysqld</span><br></div></code></pre></div></div>
<p>停止mysql [可选]</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">systemctl stop mysqld</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>linux</category>
            <category>mysql</category>
        </item>
        <item>
            <title><![CDATA[spring boot网易企业邮箱发邮件]]></title>
            <link>https://xxzkid.github.io/2024/spring-boot-163qy-mail/</link>
            <guid>https://xxzkid.github.io/2024/spring-boot-163qy-mail/</guid>
            <pubDate>Sat, 03 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Spring Boot 使用网易企业邮箱发送邮件，介绍 SMTP、TLS、授权码、配置和常见认证错误。]]></description>
            <content:encoded><![CDATA[<p>网易企业邮箱
SMTP: smtphz.qiye.163.com 25(不加密) 994(加密)
企业邮箱的 SMTP 主机、端口和认证策略可能由管理员调整。配置时应使用环境变量或密钥服务保存凭据，禁止把真实密码提交到 Git 仓库。</p>
<p>spring boot配置</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">spring:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  mail:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    host: smtphz.qiye.163.com</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    port: 994</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    username: xxxxxx</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    password: xxxxxx</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    properties:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      "mail.smtp.auth": true</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      "mail.smtp.ssl.enable": true</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      "mail.smtp.starttls.enable": false</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      "mail.smtp.starttls.required": false</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      "mail.debug": true</span><br></div></code></pre></div></div>
<p>发送邮件代码</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">@Autowired</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">private JavaMailSender mailSender;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">@Value("${spring.mail.username}")</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">private String from;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">String to = "xxx@example.com";</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">String code = "1234";</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">MimeMessage message = mailSender.createMimeMessage();</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">try {</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    message.setFrom(new InternetAddress(from));</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    message.setRecipients(MimeMessage.RecipientType.TO, to);</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    final String subject = "Verification\u00A0Code";</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    final String html = "&lt;p&gt;Your verification code is :&lt;/p&gt;" +</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            "&lt;h1&gt;${code}&lt;/h1&gt;" +</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            "&lt;p&gt;Please enter it within 5 minutes.&lt;/p&gt;";</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    message.setSubject(subject);</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    message.setContent(html.replace("${code}", code), "text/html; charset=utf-8");</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">} catch (MessagingException e) {</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    throw new ApiException(500, "send mail failed.");</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">}</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">mailSender.send(message);</span><br></div></code></pre></div></div>
<p>备注：
<strong>阿里云不允许25端口发送邮件</strong></p>]]></content:encoded>
            <category>java</category>
            <category>spring-boot</category>
            <category>spring</category>
            <category>mail</category>
        </item>
        <item>
            <title><![CDATA[5行代码带你自动刷短视频小姐姐截图]]></title>
            <link>https://xxzkid.github.io/2024/python-adb-short-video/</link>
            <guid>https://xxzkid.github.io/2024/python-adb-short-video/</guid>
            <pubDate>Thu, 25 Jul 2024 08:00:00 GMT</pubDate>
            <description><![CDATA[Python 调用 ADB 控制 Android 设备并截图的示例，介绍设备连接、命令执行、超时和图片保存。]]></description>
            <content:encoded><![CDATA[<p>利用原来 android adb shell</p>
<p>ADB 自动化只应操作自己的设备和测试应用，并遵守目标平台规则。脚本需要检查设备是否在线、命令返回码、截图路径和循环频率，避免失控操作。</p>
<p>安装依赖</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">pip install adbutils==2.7.2</span><br></div></code></pre></div></div>
<p>打开短视频app，执行下面代码</p>
<p>直接上代码</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">import os</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">from datetime import datetime</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">import adbutils</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">def main():</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    d = adbutils.adb.device_list()[0]</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    while True:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        name = datetime.now().strftime("%Y%m%d%H%M%S") + '.png'</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        d.shell("screencap -p /sdcard/DCIM/screenshot.png", encoding=None)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        d.sync.pull_file('/sdcard/DCIM/screenshot.png', name)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        print(f'screenshot : {name}')</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        d.shell('input swipe 760 1600 760 800 200')</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">if __name__ == '__main__':</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    main()</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>python</category>
            <category>android</category>
        </item>
        <item>
            <title><![CDATA[spring boot 文件上传与访问]]></title>
            <link>https://xxzkid.github.io/2024/spring-boot-file-upload/</link>
            <guid>https://xxzkid.github.io/2024/spring-boot-file-upload/</guid>
            <pubDate>Wed, 17 Jul 2024 08:00:00 GMT</pubDate>
            <description><![CDATA[Spring Boot 文件上传与访问教程，介绍 MultipartFile、大小限制、存储路径、下载和安全校验。]]></description>
            <content:encoded><![CDATA[<p>这篇文章主要讲解 spring boot如何上传文件</p>
<p>文件上传是常见攻击入口，不能直接信任原始文件名、扩展名或 Content-Type。服务端应生成存储名、限制大小和类型，并把上传目录与可执行程序隔离。</p>
<p>直接上代码</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">package com.test.file.controller;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">import com.test.code.R;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">import jakarta.servlet.http.HttpServletRequest;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">import lombok.extern.slf4j.Slf4j;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">import org.apache.commons.io.FilenameUtils;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">import org.springframework.beans.factory.annotation.Value;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">import org.springframework.web.bind.annotation.PostMapping;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">import org.springframework.web.bind.annotation.RequestParam;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">import org.springframework.web.bind.annotation.RestController;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">import org.springframework.web.multipart.MultipartFile;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">import java.io.File;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">import java.io.IOException;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">import java.text.SimpleDateFormat;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">import java.util.Date;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">import java.util.UUID;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">@Slf4j</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">@RestController</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">public class FileController {</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    // like D:/data/</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    @Value("${web.upload-path}")</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    private String uploadPath;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    // 允许上传的文件扩展名</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    private static final String[] ALLOW_EXTENSIONS = new String[]{</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            // 图片</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            "jpg", "jpeg", "png", "gif", "bmp",</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            // 压缩包</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            "zip", "rar", "gz", "7z", "cab",</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            // 音视频,</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            "wav", "avi", "mp4", "mp3", "m3u8", "ogg", "wma", "wmv", "rm", "rmvb", "aac", "mov", "asf", "flv",</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            // 文档</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            "doc", "docx", "xls", "xlsx", "ppt", "pptx", "pot", "txt", "csv", "md", "pdf"</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    };</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    /**</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">     * 判断文件名是否允许上传</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">     *</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">     * @param fileName 文件名</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">     * @return</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">     */</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    public boolean isAllow(String fileName) {</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        String ext = FilenameUtils.getExtension(fileName).toLowerCase();</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        for (String allowExtension : ALLOW_EXTENSIONS) {</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            if (allowExtension.toLowerCase().equals(ext)) {</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">                return true;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        }</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        return false;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    @PostMapping("/upload")</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    public R upload(HttpServletRequest request, @RequestParam("file") MultipartFile uploadFile) {</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        String fileName = uploadFile.getOriginalFilename();</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        if (isAllow(fileName)) {</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            // 在 uploadPath 文件夹中通过日期对上传的文件归类保存</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            // 比如：/2019/06/06/cf13891e-4b95-4000-81eb-b6d70ae44930.png</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            String format = new SimpleDateFormat("yyyy/MM/dd/").format(new Date());</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            File folder = new File(uploadPath + format);</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            if (!folder.isDirectory()) {</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">                folder.mkdirs();</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            // 对上传的文件重命名，避免文件重名</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            String newName = UUID.randomUUID() + fileName.substring(fileName.lastIndexOf("."));</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            try {</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">                // 文件保存</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">                uploadFile.transferTo(new File(folder.getAbsolutePath(), newName));</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">                // 返回上传文件的访问路径</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">                String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/" + format + newName;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">                log.info("url:[{}]", url);</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">                return R.ok().addData("url", url);</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            } catch (IOException e) {</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">                log.error("upload file failure.", e);</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">                return R.error(R.ERROR).message("文件上传失败");</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            }</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        }</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        return R.error(R.PARAM_ERROR).message("文件格式不正确");</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    }</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">}</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<p>application.yml</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">web:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  upload-path: /data/</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">spring:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  web:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    resources:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${web.upload-path}</span><br></div></code></pre></div></div>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt;dependency&gt;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    &lt;groupId&gt;commons-io&lt;/groupId&gt;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    &lt;artifactId&gt;commons-io&lt;/artifactId&gt;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    &lt;version&gt;2.13.0&lt;/version&gt;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt;/dependency&gt;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt;dependency&gt;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">&lt;/dependency&gt;</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>spring-boot</category>
            <category>spring</category>
            <category>java</category>
        </item>
        <item>
            <title><![CDATA[查找PC微信数据库句柄]]></title>
            <link>https://xxzkid.github.io/2024/pcwechat-sqlite3-handle/</link>
            <guid>https://xxzkid.github.io/2024/pcwechat-sqlite3-handle/</guid>
            <pubDate>Wed, 08 May 2024 08:00:00 GMT</pubDate>
            <description><![CDATA[调试 PC 应用 SQLite 数据库句柄的分析记录，介绍调用链、寄存器观察、基址和偏移。]]></description>
            <content:encoded><![CDATA[<p>查找PC微信数据库句柄</p>
<p>数据库句柄和函数偏移会随应用版本、编译方式和地址随机化发生变化。本文只用于自有程序或明确授权的兼容性研究，不应读取、修改或传播他人聊天数据。</p>
<p><img decoding="async" loading="lazy" alt="/public/images/sqlite3-handle-1.png" src="https://xxzkid.github.io/assets/images/sqlite3-handle-1-5c0fd9fb21587c8d1ae4b8536104fa60.png" width="1092" height="464" class="img_ev3q"></p>
<p>计算偏移，开始OD调试</p>
<p>10E79B0D - 10000000 = E79B0D</p>
<p>OD断点地址为 WeChatWin.dll + 0xE79B0D</p>
<p>OD基址为：78620000</p>
<p>78620000 + E79B0D = 79499B0D</p>
<p><img decoding="async" loading="lazy" alt="/public/images/sqlite3-handle-2.png" src="data:image/png;base64,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" width="1112" height="188" class="img_ev3q"></p>
<p>然后登录微信</p>
<p><img decoding="async" loading="lazy" alt="/public/images/sqlite3-handle-3.png" src="https://xxzkid.github.io/assets/images/sqlite3-handle-3-81eb4ba1c1649b7ea7f04fee71ee8edd.png" width="1161" height="710" class="img_ev3q"></p>
<p>看到有数据库名称</p>
<p>根据上篇sqlite_exec定位分析</p>
<p><img decoding="async" loading="lazy" alt="/public/images/sqlite3-handle-8.png" src="https://xxzkid.github.io/assets/images/sqlite3-handle-8-7bca17b28e3c24fdd40427b3e9a9029a.png" width="1243" height="971" class="img_ev3q"></p>
<p>我们确定edi+0x38就是数据库句柄</p>
<p>我们找到函数头 push ebp 下断点</p>
<p><img decoding="async" loading="lazy" alt="/public/images/sqlite3-handle-4.png" src="https://xxzkid.github.io/assets/images/sqlite3-handle-4-cfacafb7923b39fb2b20ba76ea1e014e.png" width="1485" height="967" class="img_ev3q"></p>
<p>重新启动微信，断点后扫码登录</p>
<p><img decoding="async" loading="lazy" alt="/public/images/sqlite3-handle-5.png" src="https://xxzkid.github.io/assets/images/sqlite3-handle-5-6c4dcd456129cb4483954fd3f25a4cde.png" width="1547" height="971" class="img_ev3q"></p>
<p>我们查看一下edi+0x38的值</p>
<p><img decoding="async" loading="lazy" alt="/public/images/sqlite3-handle-6.png" src="https://xxzkid.github.io/assets/images/sqlite3-handle-6-746be55d1afd3456d007858b80db3d0d.png" width="1551" height="949" class="img_ev3q"></p>
<p>当执行到call esi时，值发生变化</p>
<p><img decoding="async" loading="lazy" alt="/public/images/sqlite3-handle-7.png" src="https://xxzkid.github.io/assets/images/sqlite3-handle-7-a510612364e4dd9a0660f48a589bb759.png" width="1557" height="960" class="img_ev3q"></p>
<p>我们进入call esi</p>
<p>单步调试</p>
<p><img decoding="async" loading="lazy" alt="/public/images/sqlite3-handle-9.png" src="https://xxzkid.github.io/assets/images/sqlite3-handle-9-04d71ea35ed01e406d367da121bd9241.png" width="529" height="449" class="img_ev3q"></p>
<p>执行到7953FFF3 esi+0x38 被赋值</p>
<p>这里就是数据库句柄</p>]]></content:encoded>
            <category>c/c++</category>
            <category>微信</category>
            <category>PC微信</category>
            <category>微信机器人</category>
        </item>
        <item>
            <title><![CDATA[IDA定位PC微信sqlite3_exec]]></title>
            <link>https://xxzkid.github.io/2024/ida-sqlite3-exec/</link>
            <guid>https://xxzkid.github.io/2024/ida-sqlite3-exec/</guid>
            <pubDate>Tue, 30 Apr 2024 08:00:00 GMT</pubDate>
            <description><![CDATA[使用 IDA 通过字符串引用和调用关系定位 sqlite3_exec 的分析思路，包含基址与偏移计算。]]></description>
            <content:encoded><![CDATA[<p>IDA定位PC微信sqlite3_exec</p>
<ol>
<li class="">定位自己写的程序</li>
</ol>
<p><img decoding="async" loading="lazy" alt="/public/images/sqlite3-0.png" src="data:image/png;base64,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" width="867" height="168" class="img_ev3q"></p>
<p>二进制版本变化后，函数地址和特征都会改变，固定偏移不能跨版本直接使用。本文仅适用于自有程序或获得授权的兼容性与安全分析，操作前应核对模块版本和加载基址。</p>
<p><strong>开始找wechat的sqlite3_exec</strong></p>
<ol start="2">
<li class="">思路</li>
</ol>
<p>所有的数据库执行都必须要先创建数据库，那我们先看从创建数据库SQL开始找</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">create table if not exists ...</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="/public/images/sqlite3-1.jpg" src="https://xxzkid.github.io/assets/images/sqlite3-1-b5a74216666881ab9fb23590c6a8e472.jpg" width="846" height="455" class="img_ev3q"></p>
<p>CTRL + F</p>
<p><img decoding="async" loading="lazy" alt="/public/images/sqlite3-2.png" src="https://xxzkid.github.io/assets/images/sqlite3-2-1fb6a3e5578167ba188f340ca9df0e1b.png" width="1138" height="729" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="/public/images/sqlite3-3.png" src="https://xxzkid.github.io/assets/images/sqlite3-3-ad2242c8f349cace24143a607b525569.png" width="1054" height="767" class="img_ev3q"></p>
<p>鼠标放在黄色区域 按下x</p>
<p><img decoding="async" loading="lazy" alt="/public/images/sqlite3-4.png" src="https://xxzkid.github.io/assets/images/sqlite3-4-0a005592c027617f3def0c2dbd03fbf5.png" width="890" height="569" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="/public/images/sqlite3-5.png" src="https://xxzkid.github.io/assets/images/sqlite3-5-ec57d9d040ff82c7c30144e3c1450764.png" width="1070" height="643" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="/public/images/sqlite3-6.png" src="https://xxzkid.github.io/assets/images/sqlite3-6-af734ca15693a864d30035c72023c47a.png" width="929" height="633" class="img_ev3q"></p>
<p>看call sub_10F20BF0 双击进去看看是怎么样的</p>
<p><img decoding="async" loading="lazy" alt="/public/images/sqlite3-7.png" src="https://xxzkid.github.io/assets/images/sqlite3-7-7b241fd8a451a50972ccdaa16d1010a1.png" width="893" height="621" class="img_ev3q"></p>
<p>可以看到sqlite3_exec函数的结构</p>
<p>sub_11E24F70 就是sqlite3_exec函数</p>
<p><img decoding="async" loading="lazy" alt="/public/images/sqlite3-8.png" src="https://xxzkid.github.io/assets/images/sqlite3-8-0b36c2445f561c53b88c84529ea924a6.png" width="1111" height="664" class="img_ev3q"></p>
<p>结论：</p>
<p>10000000 是我的IDA的基址</p>
<p>偏移 11E24F70 - 10000000 = 1E24F70</p>]]></content:encoded>
            <category>c/c++</category>
            <category>微信</category>
            <category>PC微信</category>
        </item>
    </channel>
</rss>