{
    "version": "https://jsonfeed.org/version/1",
    "title": "Apache Wangye",
    "home_page_url": "https://xxzkid.github.io/",
    "description": "Practical notes on Java, Linux, databases, cloud native technologies, and software engineering.",
    "items": [
        {
            "id": "https://xxzkid.github.io/2026/openclaw-start/",
            "content_html": "<p>在人工智能加速赋能办公场景的今天，如何让大模型真正“走进”你的工作流？OpenClaw 是一个强大的开源网关工具，能够将主流大模型与企业级应用（如飞书、Slack 等）无缝对接，实现智能对话、自动化任务处理等能力。</p>\n<p>本文将带你从零开始，一步步完成 OpenClaw 的安装、配置，并接入飞书机器人，打造属于你自己的 AI 助手。全程图文结合，小白也能轻松上手！</p>\n<p>AI 网关、模型名称和飞书开放平台界面更新较快，执行时应以当前官方文档为准。生产环境必须收紧来源范围、妥善保存密钥，并对机器人可执行的操作设置最小权限。</p>\n<p>为了更好地管理 Node.js 版本，我们首先需要安装 NVM（Node Version Manager）。</p>\n<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>\n<p>👉 下载地址：</p>\n<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>\n<p>下载后双击安装，按提示一步步完成即可。</p>\n<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>\n<p>打开终端，执行以下命令：</p>\n<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>\n<p>安装完成后，加载环境变量：</p>\n<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>\n<p>💡 验证是否安装成功：</p>\n<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>\n<h1>🌱 第二步：安装 Node.js（v22.22.0）</h1>\n<p>OpenClaw 要求 Node.js 版本不低于 v22，推荐使用稳定版本。</p>\n<p>在命令行中运行：</p>\n<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>\n<p>设置为默认版本：</p>\n<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>\n<p>✅ 验证版本：</p>\n<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>\n<h1>🚀 第三步：全局安装 OpenClaw</h1>\n<p>使用 npm 安装 OpenClaw：</p>\n<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>\n<p>安装完成后，可通过以下命令查看版本确认是否成功：</p>\n<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>\n<h1>🧭 第四步：初始化配置 OpenClaw（onboard）</h1>\n<p>运行初始化命令：</p>\n<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>\n<p>你会看到一系列交互式配置选项，以下是推荐选择：</p>\n<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>\n<p>随后会自动跳转至通义千问 OAuth 授权页面：</p>\n<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>\n<p>👉 登录并授权，输入提供的 code 完成绑定</p>\n<p>✅ 授权成功后，系统将自动配置默认模型为 qwen-portal/coder-model</p>\n<p>后续选项建议如下：</p>\n<ul>\n<li class=\"\">Select channel (QuickStart) → Skip for now</li>\n<li class=\"\">Configure skills now? → Yes（推荐）</li>\n<li class=\"\">其余 API Key 设置（如 GOOGLE_PLACES_API_KEY、GEMINI_API_KEY 等）→ 按需选择 No（可后期补充）</li>\n<li class=\"\">Enable hooks? → Skip for now</li>\n</ul>\n<h1>⚙️ 第五步：修改大模型上下文参数（防报错关键步骤）</h1>\n<p>某些模型在处理长文本时容易因上下文超限报错，需手动调整配置文件。</p>\n<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>\n<ul>\n<li class=\"\">Windows 10+： 打开“我的电脑” → C盘 → 在地址栏输入 %USERPROFILE%.openclaw 回车</li>\n<li class=\"\">Linux / macOS： 路径为 ~/.openclaw</li>\n</ul>\n<p>进入目录后，编辑 openclaw.json 文件。</p>\n<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>\n<p>找到以下字段并修改为推荐值：</p>\n<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>\n<p>📌 说明：</p>\n<ul>\n<li class=\"\">contextWindow: 上下文窗口大小，提升至 32000 支持更长对话历史</li>\n<li class=\"\">maxTokens: 单次回复最大输出 token 数，避免截断</li>\n</ul>\n<p>保存文件！</p>\n<h1>🖥️ 第六步：启动 OpenClaw 控制台（Dashboard）</h1>\n<p>运行命令启动服务：</p>\n<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>\n<p>首次启动后会生成 Dashboard 地址：</p>\n<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>\n<p>📌 若提示 “No GUI detected”，请通过 SSH 隧道访问：</p>\n<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>\n<p>然后在本地浏览器打开：</p>\n<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>\n<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>\n<ul>\n<li class=\"\"><a href=\"https://docs.openclaw.ai/gateway/remote\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">https://docs.openclaw.ai/gateway/remote</a></li>\n<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>\n</ul>\n<h1>🐦 第七步：配置飞书机器人（Feishu Bot）</h1>\n<p>我们要让 OpenClaw 接入飞书，实现群聊智能应答。</p>\n<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>\n<p>访问：<a href=\"https://open.feishu.cn/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">https://open.feishu.cn</a> 点击【开发者后台】→【创建企业自建应用】</p>\n<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>\n<ul>\n<li class=\"\">应用名称：openclaw-bot</li>\n<li class=\"\">应用描述：openclaw bot</li>\n</ul>\n<p>点击【创建】</p>\n<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>\n<p>进入【凭据管理】，复制保存：</p>\n<ul>\n<li class=\"\">App ID</li>\n<li class=\"\">App Secret</li>\n</ul>\n<p>⚠️ 这两个值将用于后续配置，请务必妥善保管！</p>\n<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>\n<p>点击【添加应用能力】→【按能力选择】→ 搜索并添加【机器人】</p>\n<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>\n<ul>\n<li class=\"\">名字填写：clawbot</li>\n<li class=\"\">点击【保存】</li>\n</ul>\n<h1>🔧 第八步：配置 OpenClaw 连接飞书</h1>\n<p>回到 .openclaw/openclaw.json 文件，添加飞书频道配置：</p>\n<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>\n<p>📌 参数说明：</p>\n<ul>\n<li class=\"\">enabled: 启用飞书通道</li>\n<li class=\"\">groupPolicy / dmPolicy: 群聊和私聊策略设为 open，表示开放接入</li>\n<li class=\"\">allowFrom: 允许所有来源（生产环境建议限制）</li>\n</ul>\n<p>保存后，重启网关：</p>\n<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>\n<h1>🔔 第九步：设置事件回调与权限</h1>\n<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>\n<ul>\n<li class=\"\">选择【长连接模式】→【保存】</li>\n</ul>\n<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>\n<ul>\n<li class=\"\">点击【添加事件】→ 搜索 im:message:re → 选择【接收消息 im:message:receive_v1】→【确认添加】</li>\n</ul>\n<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>\n<ul>\n<li class=\"\">\n<p>进入【权限管理】→【开通权限】</p>\n</li>\n<li class=\"\">\n<p>搜索并勾选以下权限组：</p>\n<ul>\n<li class=\"\">contact:user.base:readonly（用户基础信息只读）</li>\n<li class=\"\">im:message 相关所有权限（消息读写、发送、接收）</li>\n</ul>\n</li>\n<li class=\"\">\n<p>点击【确认开通】</p>\n</li>\n</ul>\n<h1>🎯 第十步：发布应用，开始对话！</h1>\n<p>所有配置完成后，点击【创建版本】按钮：</p>\n<ul>\n<li class=\"\">输入版本号（如：1.0.0）</li>\n<li class=\"\">填写版本描述</li>\n<li class=\"\">点击【发布】</li>\n</ul>\n<p>发布成功后，返回飞书客户端，你会看到「openclaw-bot」应用已上线！</p>\n<p>🔍 在聊天窗口 @clawbot 或直接私聊，即可开始与 AI 对话。</p>\n<p>🎉 恭喜你，已成功搭建一个基于 OpenClaw 的飞书 AI 助手！</p>\n<h1>📝 温馨提示 &amp; 后续优化建议</h1>\n<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>\n<ul>\n<li class=\"\">后续可配置 BOOT.md 实现启动引导流程（启用 hook）</li>\n<li class=\"\">为不同技能模块添加 API Key，拓展图像生成、语音识别等功能</li>\n<li class=\"\">生产环境建议关闭 allowFrom: [\"*\"]，限制访问来源</li>\n</ul>\n<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>\n<ul>\n<li class=\"\">机器人无响应？检查网关是否运行、端口是否开放</li>\n<li class=\"\">授权失败？确认 OAuth 是否完成，token 是否过期</li>\n<li class=\"\">消息收不到？检查飞书事件订阅和权限是否全部开通</li>\n</ul>\n<h1>🌟 写在最后</h1>\n<p>OpenClaw + 飞书的组合，不仅是一个技术实践，更是智能化办公的起点。你可以在此基础上扩展：</p>\n<ul>\n<li class=\"\">自动会议纪要生成</li>\n<li class=\"\">代码辅助编写</li>\n<li class=\"\">工单自动回复</li>\n<li class=\"\">数据查询助手</li>\n</ul>\n<p>让 AI 真正成为你工作的“副驾驶”。</p>\n<p>赶紧动手试试吧！有任何问题欢迎留言交流，我们一起打造更聪明的办公生态 💬</p>\n<hr>\n<p>📌 本文参考资料：</p>\n<ul>\n<li class=\"\">OpenClaw 官方文档：<a href=\"https://docs.openclaw.ai/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">https://docs.openclaw.ai</a></li>\n<li class=\"\">飞书开放平台：<a href=\"https://open.feishu.cn/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">https://open.feishu.cn</a></li>\n</ul>\n<p>📌 关键词标签：#OpenClaw教程 #飞书机器人 #AI办公自动化 #大模型接入 #Qwen #Nodejs #开发者指南</p>",
            "url": "https://xxzkid.github.io/2026/openclaw-start/",
            "title": "手把手教你安装配置 OpenClaw + 飞书机器人，打造专属 AI 办公助手（超详细教程）",
            "summary": "OpenClaw 接入飞书机器人的完整教程，涵盖安装、模型授权、网关、权限、事件和安全配置。",
            "date_modified": "2026-04-04T12:19:36.000Z",
            "author": {
                "name": "Apache王也道长",
                "url": "https://github.com/jsbxyyx"
            },
            "tags": [
                "AI",
                "OpenClaw",
                "Claude",
                "ChatGPT"
            ]
        },
        {
            "id": "https://xxzkid.github.io/2025/minio-quickstart/",
            "content_html": "<p>minio是一款分布式文件服务器，提供了文件储存与访问的能力。类似阿里云OSS服务。</p>\n<p>快速启动只能证明服务可运行，生产部署还需要考虑多盘冗余、TLS、访问密钥、反向代理、监控和备份。不同版本命令可能调整，执行前应核对对应版本文档。</p>\n<p>环境准备</p>\n<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>\n<p>编写docker-compose.yaml</p>\n<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>\n<p>启动</p>\n<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>\n<p>浏览器访问:</p>\n<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>",
            "url": "https://xxzkid.github.io/2025/minio-quickstart/",
            "title": "minio 快速搭建",
            "summary": "MinIO 快速搭建教程，包含服务启动、数据目录、控制台、客户端别名、Bucket 和安全配置。",
            "date_modified": "2025-12-09T08:00:00.000Z",
            "author": {
                "name": "Apache王也道长",
                "url": "https://github.com/jsbxyyx"
            },
            "tags": [
                "minio",
                "java"
            ]
        },
        {
            "id": "https://xxzkid.github.io/2025/n8n-quickstart/",
            "content_html": "<p>n8n 是一款 AI 工作流自动化平台</p>\n<p>n8n 工作流可能保存 API 密钥和业务数据，不能只启动容器就直接暴露公网。部署时应设置持久化目录、加密密钥、HTTPS、访问控制和数据库备份。</p>\n<p>安装准备</p>\n<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>\n<p>编写docker-compose.yaml</p>\n<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>\n<p>启动</p>\n<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>",
            "url": "https://xxzkid.github.io/2025/n8n-quickstart/",
            "title": "n8n快速搭建",
            "summary": "n8n 快速搭建教程，介绍 Docker 启动、持久化、反向代理、Webhook、认证和备份。",
            "date_modified": "2025-12-09T08:00:00.000Z",
            "author": {
                "name": "Apache王也道长",
                "url": "https://github.com/jsbxyyx"
            },
            "tags": [
                "n8n",
                "ai",
                "java"
            ]
        },
        {
            "id": "https://xxzkid.github.io/2025/minio-data-migration/",
            "content_html": "<p>minio服务器迁移，需要把原来的数据迁移到新的服务器上，minio官方给我们提供了mc的工具来进行迁移</p>\n<p>对象存储迁移不仅要复制当前对象，还要确认版本、删除标记、元数据、生命周期规则和访问策略。正式切换前应先全量同步，再进行增量追平并抽样校验对象数量与哈希。</p>\n<p>下载安装mc</p>\n<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>\n<p>迁移数据准备</p>\n<p>老服务器地址 192.168.1.10:9000</p>\n<p>新服务器地址 192.168.1.11:9000</p>\n<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>\n<blockquote>\n<p>如果是跨机房，可以开放外网进行迁移</p>\n<p>mc alise set 名称 服务地址 用户名 密码</p>\n<p>这里一个叫old 一个叫new</p>\n</blockquote>\n<p>全量迁移，重名文件不覆盖，bucket不存在会自动创建</p>\n<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>\n<p>只是迁移某个bucket，以test为例，目标的bucket需要提前建好（此处假如桶为test）</p>\n<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>\n<p>覆盖重名文件，加--overwrite</p>\n<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>",
            "url": "https://xxzkid.github.io/2025/minio-data-migration/",
            "title": "minio数据迁移",
            "summary": "MinIO 数据迁移教程，介绍 mc mirror、增量同步、校验、版本对象、权限和切换方案。",
            "date_modified": "2025-11-27T08:00:00.000Z",
            "author": {
                "name": "Apache王也道长",
                "url": "https://github.com/jsbxyyx"
            },
            "tags": [
                "minio",
                "java"
            ]
        },
        {
            "id": "https://xxzkid.github.io/2025/opengauss-quickstart/",
            "content_html": "<p>opengauss数据库是一款基于postgres开发的国产数据库。</p>\n<p>快速开始安装\n数据库能够登录只是第一步，实际使用还需规划字符集、时区、认证、备份、监控和磁盘空间。远程访问应限制来源地址，避免使用高权限账号承载业务连接。</p>\n<p>下载安装包并解压</p>\n<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>\n<p>创建数据库用户</p>\n<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>\n<p>修改系统配置</p>\n<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>\n<p>开始安装</p>\n<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>\n<p>登录数据库</p>\n<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>\n<p>创建postgres用户并授权</p>\n<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>\n<p>授权postgres用户远程登录</p>\n<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>\n<p>开放端口</p>\n<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>\n<p>JDBC使用</p>\n<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>\n<p>代码</p>\n<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>",
            "url": "https://xxzkid.github.io/2025/opengauss-quickstart/",
            "title": "opengauss数据库快速开始",
            "summary": "openGauss 数据库快速入门，介绍安装、实例启动、用户创建、远程连接和常用 SQL。",
            "date_modified": "2025-11-26T08:00:00.000Z",
            "author": {
                "name": "Apache王也道长",
                "url": "https://github.com/jsbxyyx"
            },
            "tags": [
                "opengauss",
                "java"
            ]
        },
        {
            "id": "https://xxzkid.github.io/2025/switchomega-config/",
            "content_html": "<p>今天介绍chrome插件 switchomega</p>\n<p>浏览器代理扩展只负责根据规则选择代理服务器，本身并不提供代理节点。导入外部规则列表前应确认来源可信，并避免让账号密码等敏感流量经过未知代理。</p>\n<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>\n<p>chrome 下载 crx</p>\n<p>firefox 下载 xpi</p>\n<p>打开插件</p>\n<p>auto switch == 规则列表设置 == 规则列表网址</p>\n<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>\n<p>按照规则列表匹配请求 == 选择 proxy</p>",
            "url": "https://xxzkid.github.io/2025/switchomega-config/",
            "title": "switchomega 配置",
            "summary": "SwitchOmega 与 ZeroOmega 代理规则配置教程，介绍情景模式、自动切换、规则列表和排错。",
            "date_modified": "2025-09-13T08:00:00.000Z",
            "author": {
                "name": "Apache王也道长",
                "url": "https://github.com/jsbxyyx"
            },
            "tags": [
                "工具",
                "switchomega"
            ]
        },
        {
            "id": "https://xxzkid.github.io/2025/file-rename-quickstart/",
            "content_html": "<p>文件重命名工具</p>\n<p>你是否还在为文件批量重命名发愁，下面的代码很好的解决了文件重命名问题</p>\n<p>批量重命名最重要的不是执行速度，而是避免覆盖和不可逆错误。可靠工具应先生成变更预览，检测重名、非法字符和跨文件系统问题，再让用户确认执行。</p>\n<p>实现代码</p>\n<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>",
            "url": "https://xxzkid.github.io/2025/file-rename-quickstart/",
            "title": "文件重命名工具",
            "summary": "文件批量重命名工具的设计与使用，包含命名规则、冲突检测、预览、回滚和 Java 实现要点。",
            "date_modified": "2025-06-16T08:00:00.000Z",
            "author": {
                "name": "Apache王也道长",
                "url": "https://github.com/jsbxyyx"
            },
            "tags": [
                "文件重命名",
                "工具",
                "java"
            ]
        },
        {
            "id": "https://xxzkid.github.io/2025/npm-install-hang/",
            "content_html": "<p>执行 <code>npm install</code> 长时间没有进度，通常与网络、代理、缓存、依赖解析或 Node.js/npm 版本有关。不要连续重复执行安装命令，应先通过详细日志确认卡在哪个阶段。</p>\n<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>\n<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>\n<p>如果日志停留在下面的位置：</p>\n<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>\n<p>这只表示 npm 正在解析依赖树，真正原因还需要结合它前后的网络请求和报错判断。</p>\n<p>也可以查看 npm 当前环境：</p>\n<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>\n<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>\n<p>先测试当前仓库：</p>\n<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>\n<p>npm 官方 registry 为：</p>\n<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>\n<p>网络访问官方源较慢时，也可以临时使用镜像：</p>\n<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>\n<p>安装完成后，可根据部署环境切回官方源。团队项目不建议随意提交个人网络环境相关的 registry 配置。</p>\n<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>\n<p>曾经配置过代理，但代理服务已经关闭，也会导致安装一直等待：</p>\n<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>\n<p>如果公司网络必须经过代理，应填写实际可用的代理地址，而不是直接删除。</p>\n<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>\n<p>优先使用缓存验证：</p>\n<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>\n<p>只有确认缓存损坏时才强制清理：</p>\n<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>\n<p>清理缓存会使后续依赖重新下载，因此不应作为第一步操作。</p>\n<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>\n<p>项目存在 <code>package-lock.json</code> 时，CI 或需要可重复安装的场景建议使用：</p>\n<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>\n<p>如果怀疑 <code>node_modules</code> 状态异常，可以先移走或删除该目录，再执行 <code>npm ci</code>。不要随意删除 <code>package-lock.json</code>，否则可能引入不同版本的间接依赖。</p>\n<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>\n<p>查看过期依赖：</p>\n<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>\n<p>如果项目较旧，应确认它支持当前 Node.js 版本。原生模块还可能依赖 Python、编译器或系统开发包，详细错误通常会出现在 verbose 日志末尾。</p>\n<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>\n<ol>\n<li class=\"\">使用 <code>npm install --verbose</code> 确认卡住位置。</li>\n<li class=\"\">执行 <code>npm ping</code> 检查 registry。</li>\n<li class=\"\">检查并修正代理配置。</li>\n<li class=\"\">执行 <code>npm cache verify</code>。</li>\n<li class=\"\">有锁文件时尝试 <code>npm ci</code>。</li>\n<li class=\"\">核对 Node.js、npm 与项目依赖的兼容性。</li>\n</ol>",
            "url": "https://xxzkid.github.io/2025/npm-install-hang/",
            "title": "npm install卡住",
            "summary": "系统排查 npm install 卡住或安装速度慢的问题，包括 verbose 日志、网络与代理检查、缓存验证、registry 配置、锁文件和 Node.js 版本处理。",
            "date_modified": "2025-05-29T08:00:00.000Z",
            "author": {
                "name": "Apache王也道长",
                "url": "https://github.com/jsbxyyx"
            },
            "tags": [
                "npm",
                "js"
            ]
        },
        {
            "id": "https://xxzkid.github.io/2025/freeswitch-docker/",
            "content_html": "<p>FreeSWITCH是一个开源的电话软交换平台，支持实时音视频通信及会议，支持SIP及WebRTC等多种通信协议。</p>\n<p>开始制作docker镜像\n容器化 FreeSWITCH 除了构建镜像，还要正确处理 SIP、RTP 端口范围、NAT、时区、录音持久化和进程信号。上线前应进行呼入、呼出、双向音频和容器重启测试。</p>\n<p>编写Dockerfile</p>\n<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>\n<p>制作镜像</p>\n<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>\n<p>启动镜像</p>\n<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>\n<p>启动freeswitch</p>\n<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>\n<p>开放端口</p>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<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>",
            "url": "https://xxzkid.github.io/2025/freeswitch-docker/",
            "title": "freeswitch制作docker镜像",
            "summary": "FreeSWITCH Docker 镜像制作教程，说明编译依赖、模块选择、配置挂载、端口和音频网络问题。",
            "date_modified": "2025-05-12T08:00:00.000Z",
            "author": {
                "name": "Apache王也道长",
                "url": "https://github.com/jsbxyyx"
            },
            "tags": [
                "freeswitch",
                "docker"
            ]
        },
        {
            "id": "https://xxzkid.github.io/2025/http-proxy-with-tinyproxy/",
            "content_html": "<p>今天我们介绍一款轻量级HTTP代理服务器 tinyproxy</p>\n<p>开放代理很容易被滥用并消耗带宽，部署时必须限制来源 IP、监听地址和防火墙规则。Tinyproxy 适合轻量 HTTP 代理，不等同于提供加密隧道的 VPN。</p>\n<p>安装</p>\n<p>先启动一个docker ubuntu 【可选】</p>\n<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>\n<p>进入系统【可选】</p>\n<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>\n<p>安装tinyproxy</p>\n<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>\n<p>编写配置文件</p>\n<p>vim /tmp/tinyproxy.conf</p>\n<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>\n<p>启动程序</p>\n<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>\n<p>验证</p>\n<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>\n<p>结果会返回代理服务器ip</p>\n<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>",
            "url": "https://xxzkid.github.io/2025/http-proxy-with-tinyproxy/",
            "title": "快速搭建HTTP代理服务器",
            "summary": "Tinyproxy 快速搭建 HTTP 代理服务器，包含安装、Allow 访问控制、端口、防火墙和日志排查。",
            "date_modified": "2025-05-09T08:00:00.000Z",
            "author": {
                "name": "Apache王也道长",
                "url": "https://github.com/jsbxyyx"
            },
            "tags": [
                "proxy",
                "tinyproxy",
                "http"
            ]
        },
        {
            "id": "https://xxzkid.github.io/2025/mvn-testcase/",
            "content_html": "<p>Maven 项目通常通过 Surefire 插件执行单元测试。开发和排查问题时，可以只运行某个测试类或测试方法，减少等待时间并快速验证修改结果。</p>\n<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>\n<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>\n<p>该命令会执行当前模块中测试源码目录下符合命名规则的单元测试。</p>\n<p>如果希望先清理旧的编译结果：</p>\n<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>\n<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>\n<p>使用测试类的简单类名：</p>\n<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>\n<p>也可以匹配多个测试类：</p>\n<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>\n<p>使用通配符运行一组测试：</p>\n<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>\n<p>在部分 Shell 中，<code>*</code> 会被展开，因此建议给表达式加引号。</p>\n<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>\n<p>基本格式：</p>\n<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>\n<p>例如：</p>\n<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>\n<p>如果方法是参数化测试或生成了多个用例，实际匹配能力取决于项目所使用的 JUnit 和 Surefire 版本。</p>\n<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>\n<p>使用 <code>-pl</code> 选择需要测试的模块：</p>\n<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>\n<p>常用参数：</p>\n<ul>\n<li class=\"\"><code>-pl module-name</code>：只选择指定模块。</li>\n<li class=\"\"><code>-am</code>：同时构建该模块依赖的其他模块。</li>\n<li class=\"\"><code>-amd</code>：同时构建依赖该模块的下游模块。</li>\n</ul>\n<p>例如：</p>\n<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>\n<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>\n<p>如果出现“No tests were executed”或“No tests matching pattern”：</p>\n<ol>\n<li class=\"\">检查类名和方法名是否拼写正确。</li>\n<li class=\"\">确认测试位于 <code>src/test/java</code>。</li>\n<li class=\"\">检查测试框架是否被 Surefire 正确识别。</li>\n<li class=\"\">查看父 POM 中是否覆盖了 Surefire 的包含或排除规则。</li>\n<li class=\"\">多模块项目确认 <code>-pl</code> 选择的是包含该测试的模块。</li>\n</ol>\n<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>\n<p><code>mvn test</code> 一般由 Surefire 执行单元测试。使用 Failsafe 插件的集成测试通常在 <code>integration-test</code> 和 <code>verify</code> 阶段运行：</p>\n<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>\n<p>如果指定测试没有运行，还应确认该测试属于单元测试还是集成测试。</p>",
            "url": "https://xxzkid.github.io/2025/mvn-testcase/",
            "title": "maven测试指定测试方法",
            "summary": "整理 Maven 运行全部测试、指定测试类、指定测试方法及多模块项目测试的常用命令，并说明 -Dtest、-pl、-am 等参数。",
            "date_modified": "2025-04-17T08:00:00.000Z",
            "author": {
                "name": "Apache王也道长",
                "url": "https://github.com/jsbxyyx"
            },
            "tags": [
                "maven",
                "java"
            ]
        },
        {
            "id": "https://xxzkid.github.io/2025/flutter-faq/",
            "content_html": "<p>flutter 开发常见问题\nFlutter 问题通常与 SDK、Dart、Gradle、Android 工具链和依赖版本共同相关。提交或记录故障时，应附上 flutter doctor、完整错误堆栈和可复现步骤。</p>\n<ol>\n<li class=\"\">下载flutter</li>\n</ol>\n<p>windows 下载</p>\n<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>\n<ol start=\"2\">\n<li class=\"\">环境变量配置</li>\n</ol>\n<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>\n<ol start=\"3\">\n<li class=\"\">排查Running Gradle task 'assembleDebug'...慢问题</li>\n</ol>\n<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>\n<ol start=\"4\">\n<li class=\"\">gradle-wrapper 镜像配置</li>\n</ol>\n<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>\n<ol start=\"5\">\n<li class=\"\">gradle maven镜像配置</li>\n</ol>\n<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>\n<ol start=\"6\">\n<li class=\"\">flutter命令行创建项目</li>\n</ol>\n<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>",
            "url": "https://xxzkid.github.io/2025/flutter-faq/",
            "title": "flutter开发常见问题",
            "summary": "Flutter 开发常见问题汇总，涵盖环境配置、依赖下载、构建失败、设备连接和缓存处理。",
            "date_modified": "2025-03-31T08:00:00.000Z",
            "author": {
                "name": "Apache王也道长",
                "url": "https://github.com/jsbxyyx"
            },
            "tags": [
                "flutter",
                "android"
            ]
        },
        {
            "id": "https://xxzkid.github.io/2025/chromedriver-download/",
            "content_html": "<p>在自动化测试和网络爬虫开发中，chromedriver是连接 Selenium 与 Chrome 浏览器的核心桥梁。然而，安装过程中版本不匹配、路径配置错误等问题常常让人头疼。本文从实战出发，手把手教你如何快速安装并验证 ChromeDriver，避开常见“坑点”！</p>\n<p>浏览器和驱动版本不匹配是 Selenium 启动失败的常见原因。排查时应同时记录 Chrome、ChromeDriver、Selenium 与操作系统架构，并优先使用自动化驱动管理能力。</p>\n<ol>\n<li class=\"\">安装 Chrome 浏览器</li>\n<li class=\"\">查看 Chrome 版本\n打开 Chrome 浏览器，输入 <code>chrome://settings/help</code> 查看版本号（如 108.0.5359.125）版本号的前三位需与 ChromeDriver 完全一致（例如 108.0.5359.x）</li>\n</ol>\n<h1>二、下载与安装 ChromeDriver</h1>\n<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>\n<h1>三、编写程序验证</h1>\n<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>",
            "url": "https://xxzkid.github.io/2025/chromedriver-download/",
            "title": "chrome-driver安装",
            "summary": "ChromeDriver 安装与版本匹配教程，介绍浏览器版本确认、驱动下载、PATH 配置和 Selenium 启动排错。",
            "date_modified": "2025-03-15T08:00:00.000Z",
            "author": {
                "name": "Apache王也道长",
                "url": "https://github.com/jsbxyyx"
            },
            "tags": [
                "chromedriver",
                "selenium",
                "java"
            ]
        },
        {
            "id": "https://xxzkid.github.io/2025/apache-artemis-install/",
            "content_html": "<p>apache artemis是新一代的apache activemq</p>\n<p>安装消息队列不仅要让进程成功启动，还要确认管理端口、消息协议端口、持久化目录和账号配置。生产环境还应关注权限、磁盘容量、JVM 参数和监控。</p>\n<p>安装过程</p>\n<p>apache artemis是一个java程序，所以前提需要安装java，这里我们推荐jdk17</p>\n<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>\n<p>下载</p>\n<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>\n<p>安装</p>\n<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>\n<p>创建实例</p>\n<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>\n<p>可选操作</p>\n<p>修改内存大小</p>\n<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>\n<p>修改cors</p>\n<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>\n<p>修改console为可访问</p>\n<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>",
            "url": "https://xxzkid.github.io/2025/apache-artemis-install/",
            "title": "Apache Artemis安装",
            "summary": "Apache ActiveMQ Artemis 安装与启动教程，包含目录结构、启动命令、管理控制台、端口检查和常见问题。",
            "date_modified": "2025-02-17T08:00:00.000Z",
            "author": {
                "name": "Apache王也道长",
                "url": "https://github.com/jsbxyyx"
            },
            "tags": [
                "activemq",
                "java"
            ]
        },
        {
            "id": "https://xxzkid.github.io/2024/linux-install-mysql8-zip/",
            "content_html": "<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>\n<p>压缩包安装适合需要自定义目录的环境，但不会自动完成系统用户、权限和服务管理配置。安装前应核对操作系统架构、依赖库和 MySQL 小版本，并妥善保存初始化密码。</p>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<p>vim /etc/my.cnf</p>\n<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>\n<p>vim /usr/local/mysql/conf.d/mysqld.conf</p>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<p>vim /etc/systemd/system/mysqld.service</p>\n<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>\n<p>重新加载配置</p>\n<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>\n<p>启动mysql</p>\n<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>\n<p>设置开启服务</p>\n<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>\n<p>停止mysql [可选]</p>\n<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>",
            "url": "https://xxzkid.github.io/2024/linux-install-mysql8-zip/",
            "title": "Linux安装mysql8压缩包版本",
            "summary": "Linux 使用压缩包安装 MySQL 8 的步骤，包括用户目录、初始化、配置、systemd 和安全设置。",
            "date_modified": "2024-09-10T00:00:00.000Z",
            "author": {
                "name": "Apache王也道长",
                "url": "https://github.com/jsbxyyx"
            },
            "tags": [
                "linux",
                "mysql"
            ]
        },
        {
            "id": "https://xxzkid.github.io/2024/spring-boot-163qy-mail/",
            "content_html": "<p>网易企业邮箱\nSMTP: smtphz.qiye.163.com 25(不加密) 994(加密)\n企业邮箱的 SMTP 主机、端口和认证策略可能由管理员调整。配置时应使用环境变量或密钥服务保存凭据，禁止把真实密码提交到 Git 仓库。</p>\n<p>spring boot配置</p>\n<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>\n<p>发送邮件代码</p>\n<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>\n<p>备注：\n<strong>阿里云不允许25端口发送邮件</strong></p>",
            "url": "https://xxzkid.github.io/2024/spring-boot-163qy-mail/",
            "title": "spring boot网易企业邮箱发邮件",
            "summary": "Spring Boot 使用网易企业邮箱发送邮件，介绍 SMTP、TLS、授权码、配置和常见认证错误。",
            "date_modified": "2024-08-03T00:00:00.000Z",
            "author": {
                "name": "Apache王也道长",
                "url": "https://github.com/jsbxyyx"
            },
            "tags": [
                "java",
                "spring-boot",
                "spring",
                "mail"
            ]
        },
        {
            "id": "https://xxzkid.github.io/2024/python-adb-short-video/",
            "content_html": "<p>利用原来 android adb shell</p>\n<p>ADB 自动化只应操作自己的设备和测试应用，并遵守目标平台规则。脚本需要检查设备是否在线、命令返回码、截图路径和循环频率，避免失控操作。</p>\n<p>安装依赖</p>\n<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>\n<p>打开短视频app，执行下面代码</p>\n<p>直接上代码</p>\n<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>",
            "url": "https://xxzkid.github.io/2024/python-adb-short-video/",
            "title": "5行代码带你自动刷短视频小姐姐截图",
            "summary": "Python 调用 ADB 控制 Android 设备并截图的示例，介绍设备连接、命令执行、超时和图片保存。",
            "date_modified": "2024-07-25T08:00:00.000Z",
            "author": {
                "name": "Apache王也道长",
                "url": "https://github.com/jsbxyyx"
            },
            "tags": [
                "python",
                "android"
            ]
        },
        {
            "id": "https://xxzkid.github.io/2024/spring-boot-file-upload/",
            "content_html": "<p>这篇文章主要讲解 spring boot如何上传文件</p>\n<p>文件上传是常见攻击入口，不能直接信任原始文件名、扩展名或 Content-Type。服务端应生成存储名、限制大小和类型，并把上传目录与可执行程序隔离。</p>\n<p>直接上代码</p>\n<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>\n<p>application.yml</p>\n<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>\n<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>",
            "url": "https://xxzkid.github.io/2024/spring-boot-file-upload/",
            "title": "spring boot 文件上传与访问",
            "summary": "Spring Boot 文件上传与访问教程，介绍 MultipartFile、大小限制、存储路径、下载和安全校验。",
            "date_modified": "2024-07-17T08:00:00.000Z",
            "author": {
                "name": "Apache王也道长",
                "url": "https://github.com/jsbxyyx"
            },
            "tags": [
                "spring-boot",
                "spring",
                "java"
            ]
        },
        {
            "id": "https://xxzkid.github.io/2024/pcwechat-sqlite3-handle/",
            "content_html": "<p>查找PC微信数据库句柄</p>\n<p>数据库句柄和函数偏移会随应用版本、编译方式和地址随机化发生变化。本文只用于自有程序或明确授权的兼容性研究，不应读取、修改或传播他人聊天数据。</p>\n<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>\n<p>计算偏移，开始OD调试</p>\n<p>10E79B0D - 10000000 = E79B0D</p>\n<p>OD断点地址为 WeChatWin.dll + 0xE79B0D</p>\n<p>OD基址为：78620000</p>\n<p>78620000 + E79B0D = 79499B0D</p>\n<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>\n<p>然后登录微信</p>\n<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>\n<p>看到有数据库名称</p>\n<p>根据上篇sqlite_exec定位分析</p>\n<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>\n<p>我们确定edi+0x38就是数据库句柄</p>\n<p>我们找到函数头 push ebp 下断点</p>\n<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>\n<p>重新启动微信，断点后扫码登录</p>\n<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>\n<p>我们查看一下edi+0x38的值</p>\n<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>\n<p>当执行到call esi时，值发生变化</p>\n<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>\n<p>我们进入call esi</p>\n<p>单步调试</p>\n<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>\n<p>执行到7953FFF3 esi+0x38 被赋值</p>\n<p>这里就是数据库句柄</p>",
            "url": "https://xxzkid.github.io/2024/pcwechat-sqlite3-handle/",
            "title": "查找PC微信数据库句柄",
            "summary": "调试 PC 应用 SQLite 数据库句柄的分析记录，介绍调用链、寄存器观察、基址和偏移。",
            "date_modified": "2024-05-08T08:00:00.000Z",
            "author": {
                "name": "Apache王也道长",
                "url": "https://github.com/jsbxyyx"
            },
            "tags": [
                "c/c++",
                "微信",
                "PC微信",
                "微信机器人"
            ]
        },
        {
            "id": "https://xxzkid.github.io/2024/ida-sqlite3-exec/",
            "content_html": "<p>IDA定位PC微信sqlite3_exec</p>\n<ol>\n<li class=\"\">定位自己写的程序</li>\n</ol>\n<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>\n<p>二进制版本变化后，函数地址和特征都会改变，固定偏移不能跨版本直接使用。本文仅适用于自有程序或获得授权的兼容性与安全分析，操作前应核对模块版本和加载基址。</p>\n<p><strong>开始找wechat的sqlite3_exec</strong></p>\n<ol start=\"2\">\n<li class=\"\">思路</li>\n</ol>\n<p>所有的数据库执行都必须要先创建数据库，那我们先看从创建数据库SQL开始找</p>\n<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>\n<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>\n<p>CTRL + F</p>\n<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>\n<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>\n<p>鼠标放在黄色区域 按下x</p>\n<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>\n<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>\n<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>\n<p>看call sub_10F20BF0 双击进去看看是怎么样的</p>\n<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>\n<p>可以看到sqlite3_exec函数的结构</p>\n<p>sub_11E24F70 就是sqlite3_exec函数</p>\n<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>\n<p>结论：</p>\n<p>10000000 是我的IDA的基址</p>\n<p>偏移 11E24F70 - 10000000 = 1E24F70</p>",
            "url": "https://xxzkid.github.io/2024/ida-sqlite3-exec/",
            "title": "IDA定位PC微信sqlite3_exec",
            "summary": "使用 IDA 通过字符串引用和调用关系定位 sqlite3_exec 的分析思路，包含基址与偏移计算。",
            "date_modified": "2024-04-30T08:00:00.000Z",
            "author": {
                "name": "Apache王也道长",
                "url": "https://github.com/jsbxyyx"
            },
            "tags": [
                "c/c++",
                "微信",
                "PC微信"
            ]
        }
    ]
}