{"id":"9f5569b7-2b16-4775-b5c3-314dc0a6828d","shortId":"ZLekD8","kind":"skill","title":"openclaw-deploy","tagline":"在远程服务器上一键部署 OpenClaw。当用户需要安装 OpenClaw、部署 OpenClaw、配置 OpenClaw 到服务器时使用","description":"# OpenClaw 远程一键部署\n\n在远程 Linux 服务器上自动部署 OpenClaw + AI 模型 + 聊天频道。\n\n---\n\n## 第零步：输出傻瓜教程\n\n**skill 启动后，必须先输出以下准备清单**，让用户知道需要什么，然后再用 AskUserQuestion 收集信息：\n\n```markdown\n# OpenClaw 一键部署\n\n欢迎！部署前你需要准备以下东西：\n\n| 序号 | 准备什么 | 说明 | 必需？ |\n|------|----------|------|--------|\n| 1 | 一台 Linux 服务器 | 最低 1GB 内存 + 500MB 磁盘，支持 SSH 登录 | 必需 |\n| 2 | SSH 免密登录 | 确保本机能 `ssh user@host` 直接连上 | 必需 |\n| 3 | AI 模型 API Key | 智谱GLM / DeepSeek / OpenAI / Claude / Kimi / 通义 任选 | 必需 |\n| 4 | 聊天频道 Bot Token | Telegram(@BotFather) 或 Discord 或 飞书，也可以暂不配 | 可选 |\n| 5 | 代理地址 | 中国大陆服务器 + 海外频道(Telegram/Discord)时需要 | 视情况 |\n| 6 | 浏览器控制 | 让 Bot 能操控浏览器搜索/截图/填表，需额外安装 Playwright | 可选 |\n```\n\n---\n\n## 第一步：收集信息\n\n用 AskUserQuestion 收集（$ARGUMENTS 已提供的跳过）。分两轮问：\n\n### 第一轮（必填 3 项）：\n\n用 AskUserQuestion 同时问以下 3 个问题：\n\n1. **SSH 连接信息**（header: \"SSH 连接\"）\n   - 选项根据上下文动态生成（如之前用过的服务器），兜底选项\"其他服务器\"\n2. **AI 模型**（header: \"AI 模型\"）\n   - 智谱 GLM-5（国产，无需代理）\n   - DeepSeek（国产，无需代理）\n   - OpenAI GPT-4o（需代理或海外服务器）\n   - Anthropic Claude（需代理或海外服务器）\n3. **聊天频道**（header: \"聊天频道\"）\n   - Telegram（需 Bot Token，中国大陆需代理）\n   - Discord（需 Bot Token）\n   - 飞书（需 Bot Token）\n   - 暂不配置\n4. **浏览器控制**（header: \"浏览器\"）\n   - 启用（Bot 可操控浏览器搜索/截图/填表）\n   - 暂不配置\n\n### 第二轮（根据第一轮结果追问）：\n\n- 如果用户没提供 API Key → 问 API Key\n- 如果选了聊天频道 → 问 Bot Token\n  - 如果用户没有 Bot Token → 给出创建教程：\n    - Telegram：找 @BotFather，发 `/newbot`\n    - Discord：去 discord.com/developers 创建 Application → Bot\n    - 飞书：去 open.feishu.cn 创建自建应用\n- 如果选了 Telegram/Discord 且服务器在中国大陆 → 问代理地址\n  - 自动判断：如果 SSH 到服务器后 `curl -s --connect-timeout 3 https://api.telegram.org` 失败，则判定需要代理\n\n---\n\n## 第二步：环境检查\n\nSSH 连接到服务器，**单条命令**获取全部信息：\n\n```bash\nssh <SSH_ARGS> \"echo '=== CPU ===' && nproc && echo '=== 内存 ===' && free -h && echo '=== 磁盘 ===' && df -h / && echo '=== 系统 ===' && uname -a && echo '=== Node.js ===' && node -v 2>/dev/null || echo '未安装' && echo '=== npm ===' && npm -v 2>/dev/null || echo '未安装' && echo '=== 包管理器 ===' && which pacman apt yum dnf 2>/dev/null && echo '=== OpenClaw ===' && openclaw --version 2>/dev/null || echo '未安装'\"\n```\n\n**最低要求**：1GB RAM + 500MB 磁盘。不满足则告知用户并停止。\n\n---\n\n## 第三步：安装 Node.js（如未安装）\n\n根据检测到的包管理器：\n\n| 包管理器 | 命令 |\n|----------|------|\n| pacman (Arch) | `pacman -S --noconfirm nodejs npm` |\n| apt (Debian/Ubuntu) | `curl -fsSL https://deb.nodesource.com/setup_22.x \\| bash - && apt install -y nodejs` |\n| dnf (RHEL/Fedora) | `dnf install -y nodejs npm` |\n| yum (CentOS) | `curl -fsSL https://rpm.nodesource.com/setup_22.x \\| bash - && yum install -y nodejs` |\n\n安装后验证：`node -v && npm -v`，确认 Node.js >= 22。\n\n---\n\n## 第四步：安装 OpenClaw\n\n```bash\ncurl -fsSL https://openclaw.ai/install.sh | bash\n```\n\n> **重要**：安装脚本会尝试启动交互式 onboarding wizard，在非 TTY 环境会报 `/dev/tty: No such device or address` 错误。**这是正常的**，OpenClaw 本体已安装成功。\n\n验证：`openclaw --version`\n\n---\n\n## 第五步：写入配置文件\n\n**直接写 `~/.openclaw/openclaw.json`**，不用交互式 wizard。\n\n### 模型配置模板\n\n```json\n{\n  \"models\": {\n    \"mode\": \"merge\",\n    \"providers\": {\n      \"<PROVIDER_NAME>\": {\n        \"baseUrl\": \"<BASE_URL>\",\n        \"apiKey\": \"<API_KEY>\",\n        \"api\": \"openai-completions\",\n        \"models\": [\n          {\n            \"id\": \"<MODEL_ID>\",\n            \"name\": \"<DISPLAY_NAME>\",\n            \"reasoning\": false,\n            \"input\": [\"text\"],\n            \"contextWindow\": 128000,\n            \"maxTokens\": 32000\n          }\n        ]\n      }\n    }\n  },\n  \"agents\": {\n    \"defaults\": {\n      \"model\": {\n        \"primary\": \"<PROVIDER_NAME>/<MODEL_ID>\"\n      },\n      \"memorySearch\": {\n        \"enabled\": false\n      }\n    }\n  },\n  \"gateway\": {\n    \"mode\": \"local\"\n  }\n}\n```\n\n### 常见模型参考\n\n| Provider 名 | MODEL_ID | baseUrl |\n|-------------|----------|---------|\n| zhipu | glm-5 | `https://open.bigmodel.cn/api/paas/v4` |\n| openai | gpt-4o | `https://api.openai.com/v1` |\n| deepseek | deepseek-chat | `https://api.deepseek.com/v1` |\n| kimi | moonshot-v1-128k | `https://api.moonshot.cn/v1` |\n| qwen | qwen-max | `https://dashscope.aliyuncs.com/compatible-mode/v1` |\n| anthropic | claude-sonnet-4-5-20250929 | `https://api.anthropic.com/v1` |\n\n> **注意**：Anthropic 模型的 `api` 字段应为 `\"anthropic-messages\"` 而非 `\"openai-completions\"`。\n\n写入后立即修复权限：\n\n```bash\nmkdir -p ~/.openclaw/agents/main/sessions ~/.openclaw/credentials\nchmod 700 ~/.openclaw\nchmod 600 ~/.openclaw/openclaw.json\n```\n\n---\n\n## 第六步：启动网关（systemd）\n\n按顺序执行：\n\n```bash\n# 安装 systemd 服务\nopenclaw gateway install\n\n# 启用 linger（退出 SSH 后服务不会停）\nloginctl enable-linger $(whoami)\n\n# 启动\nexport XDG_RUNTIME_DIR=/run/user/$(id -u)\nsystemctl --user start openclaw-gateway.service\n```\n\n等待 3 秒后验证：\n\n```bash\nsystemctl --user status openclaw-gateway.service | head -10\n```\n\n确认 `Active: active (running)`。\n\n### 轮换 device token\n\n网关首次启动后，轮换 operator token 修复可能的认证问题：\n\n```bash\n# 先获取 device ID\nDEVICE_ID=$(openclaw devices list 2>&1 | grep -oP '[a-f0-9]{40,}')\n# 轮换 token\nopenclaw devices rotate --role operator --device \"$DEVICE_ID\"\n```\n\n---\n\n## 第七步：配置聊天频道（如需要）\n\n根据用户选择的频道执行对应配置。\n\n### 7a. 设置频道\n\n**Telegram：**\n```bash\nopenclaw config set channels.telegram.enabled true\nopenclaw config set channels.telegram.botToken '<BOT_TOKEN>'\nopenclaw config set channels.telegram.dmPolicy pairing\n```\n\n**Discord：**\n```bash\nopenclaw config set channels.discord.enabled true\nopenclaw config set channels.discord.botToken '<BOT_TOKEN>'\nopenclaw config set channels.discord.dmPolicy pairing\n```\n\n**飞书：**\n```bash\nopenclaw config set channels.feishu.enabled true\nopenclaw config set channels.feishu.token '<BOT_TOKEN>'\nopenclaw config set channels.feishu.dmPolicy pairing\n```\n\n### 7b. 配置代理（中国大陆服务器 + 海外频道时必须）\n\n> **适用场景**：服务器在中国大陆，且频道是 Telegram 或 Discord（需访问海外 API）。\n> 飞书是国内服务，不需要代理。\n\n先测试是否需要代理（自动判断）：\n\n```bash\n# Telegram\ncurl -s --connect-timeout 3 https://api.telegram.org/bot<BOT_TOKEN>/getMe\n# Discord\ncurl -s --connect-timeout 3 https://discord.com/api/v10/users/@me -H \"Authorization: Bot <BOT_TOKEN>\"\n```\n\n如果超时/失败，说明需要代理。用用户提供的代理测试：\n\n```bash\nexport http_proxy='<PROXY_URL>' && export https_proxy='<PROXY_URL>'\ncurl -s --connect-timeout 5 https://api.telegram.org/bot<BOT_TOKEN>/getMe\n```\n\n确认返回成功后，写入 systemd override。\n\n> **重要**：proxy.conf 必须**一次性写完所有环境变量**（代理 + no_proxy + DISPLAY），\n> 不要分多次追加，后续浏览器步骤也不需要再改这个文件。\n\n```bash\nmkdir -p ~/.config/systemd/user/openclaw-gateway.service.d\ncat > ~/.config/systemd/user/openclaw-gateway.service.d/proxy.conf << EOF\n[Service]\nEnvironment=\"http_proxy=<PROXY_URL>\"\nEnvironment=\"https_proxy=<PROXY_URL>\"\nEnvironment=\"no_proxy=127.0.0.1,localhost,::1\"\nEnvironment=\"NO_PROXY=127.0.0.1,localhost,::1\"\nEnvironment=\"DISPLAY=:99\"\nEOF\n```\n\n> **为什么要 `no_proxy`**：没有它，OpenClaw 连本地 Chrome CDP 端口也会走代理，\n> 导致浏览器启动成功但 OpenClaw 检测不到，报 `Failed to start Chrome CDP`。\n> 即使当前不配浏览器，也要加上 `no_proxy`，防止后续开启浏览器时踩坑。\n\n> **为什么要 `DISPLAY=:99`**：浏览器需要显示服务器，即使 headless 模式也需要。\n> 如果不配浏览器，这个变量无害。\n\n### 7c. 重启网关（必须通过 systemd！）\n\n> **关键坑点**：`openclaw config set` 会触发内部热重启，但热重启**不会**加载 systemd 的环境变量（代理）。\n> 所有涉及频道/代理的配置改完后，必须用 `systemctl --user restart` 来重启。\n\n```bash\nexport XDG_RUNTIME_DIR=/run/user/$(id -u)\nsystemctl --user daemon-reload\nsystemctl --user restart openclaw-gateway.service\n```\n\n### 7d. 验证频道连接\n\n等待 5 秒后：\n\n```bash\nopenclaw channels status\n```\n\n确认输出包含 `enabled, configured, running`。\n\n**如果看到 `fetch failed` 或 `Network request failed`**：代理没生效，检查 proxy.conf 并确认是通过 systemctl 重启的。\n\n### 7e. 配对用户\n\n让用户在对应频道给 Bot 发一条消息。Bot 会回复配对码。\n\n> **关键坑点**：配对命令是 `openclaw pairing approve <channel> <CODE>`，\n> **不是** `openclaw devices approve <CODE>`（那个会报 `unknown requestId`）。\n\n```bash\n# 查看待配对列表（必须指定频道名）\nopenclaw pairing list <channel>\n# 例如：openclaw pairing list telegram\n\n# 批准配对\nopenclaw pairing approve <channel> <PAIRING_CODE>\n# 例如：openclaw pairing approve telegram BAEWET79\n```\n\n配对码有效期约 1 小时。如果过期，让用户重新发消息即可生成新码。\n\n---\n\n## 第八步：配置浏览器控制（可选）\n\n> 让 Bot 能操控浏览器，执行搜索、截图、填表等操作。\n> 如果第一步用户选了「暂不配置」，跳过此步。\n\n### 8a. 安装 Playwright Chromium + Xvfb\n\n> **不要用系统自带的 Chromium**。滚动发行版（Arch 等）会出现 ICU/libFLAC 等库版本不匹配，\n> 稳定发行版也可能版本过旧。**统一用 Playwright 自带的 Chromium**，一条命令解决。\n\n```bash\n# 安装 Playwright Chromium（自带所有依赖，不依赖系统库）\nnpx playwright install chromium\n\n# 安装 Xvfb 虚拟显示（无头服务器必须）\n# Arch:\npacman -S --noconfirm xorg-server-xvfb\n# Debian/Ubuntu:\napt install -y xvfb\n```\n\n验证 Playwright Chromium 可运行：\n\n```bash\nPLAYWRIGHT_CHROME=$(find ~/.cache/ms-playwright/chromium-*/chrome-linux/chrome 2>/dev/null | head -1)\n$PLAYWRIGHT_CHROME --version\n```\n\n### 8b. 创建 Chromium Wrapper + 代理中继（需要代理时）\n\n> **为什么需要 wrapper**：\n> 1. OpenClaw 自动检测 `/usr/bin/chromium` 来启动浏览器，wrapper 让它用 Playwright 版本\n> 2. Chromium 不支持 `http_proxy` URL 中嵌入的认证（`user:pass@host`），会报 `ERR_INVALID_AUTH_CREDENTIALS`\n> 3. wrapper 自动 unset 代理环境变量，改用 `--proxy-server` 指向本地无认证代理中继\n\n**如果需要代理**（中国大陆访问海外站点），先搭建本地代理中继：\n\n```bash\n# 创建代理中继脚本（Node.js，去掉认证层，Chrome 直连）\ncat > ~/.openclaw/proxy-relay.js << 'RELAYEOF'\nconst http = require(\"http\");\nconst net = require(\"net\");\nconst UPSTREAM_HOST = process.env.PROXY_HOST || \"127.0.0.1\";\nconst UPSTREAM_PORT = parseInt(process.env.PROXY_PORT || \"7890\", 10);\nconst UPSTREAM_USER = process.env.PROXY_USER || \"\";\nconst UPSTREAM_PASS = process.env.PROXY_PASS || \"\";\nconst LOCAL_PORT = parseInt(process.env.RELAY_PORT || \"7891\", 10);\nconst authHeader = UPSTREAM_USER\n  ? \"Basic \" + Buffer.from(UPSTREAM_USER + \":\" + UPSTREAM_PASS).toString(\"base64\")\n  : null;\nconst server = http.createServer((req, res) => {\n  const opts = { host: UPSTREAM_HOST, port: UPSTREAM_PORT, path: req.url,\n    method: req.method, headers: { ...req.headers } };\n  if (authHeader) opts.headers[\"Proxy-Authorization\"] = authHeader;\n  const proxy = http.request(opts, (pRes) => { res.writeHead(pRes.statusCode, pRes.headers); pRes.pipe(res); });\n  proxy.on(\"error\", (e) => { res.writeHead(502); res.end(String(e)); });\n  req.pipe(proxy);\n});\nserver.on(\"connect\", (req, clientSocket, head) => {\n  const connectReq = \"CONNECT \" + req.url + \" HTTP/1.1\\r\\nHost: \" + req.url + \"\\r\\n\"\n    + (authHeader ? \"Proxy-Authorization: \" + authHeader + \"\\r\\n\" : \"\") + \"\\r\\n\";\n  const proxySocket = net.connect(UPSTREAM_PORT, UPSTREAM_HOST, () => { proxySocket.write(connectReq); });\n  let buf = Buffer.alloc(0);\n  const onData = (chunk) => {\n    buf = Buffer.concat([buf, chunk]);\n    const idx = buf.indexOf(\"\\r\\n\\r\\n\");\n    if (idx === -1) return;\n    proxySocket.removeListener(\"data\", onData);\n    const resp = buf.slice(0, idx).toString();\n    const rest = buf.slice(idx + 4);\n    if (resp.includes(\" 200 \")) {\n      clientSocket.write(\"HTTP/1.1 200 Connection Established\\r\\n\\r\\n\");\n      if (rest.length) clientSocket.write(rest);\n      if (head.length) proxySocket.write(head);\n      proxySocket.pipe(clientSocket); clientSocket.pipe(proxySocket);\n    } else { clientSocket.end(\"HTTP/1.1 502 Bad Gateway\\r\\n\\r\\n\"); proxySocket.end(); }\n  };\n  proxySocket.on(\"data\", onData);\n  proxySocket.on(\"error\", () => clientSocket.destroy());\n  clientSocket.on(\"error\", () => proxySocket.destroy());\n});\nserver.listen(LOCAL_PORT, \"127.0.0.1\", () => {\n  console.log(\"proxy-relay listening on 127.0.0.1:\" + LOCAL_PORT + \" -> \" + UPSTREAM_HOST + \":\" + UPSTREAM_PORT);\n});\nRELAYEOF\n\n# 创建 systemd 服务（用实际的代理信息替换变量）\ncat > ~/.config/systemd/user/proxy-relay.service << EOF\n[Unit]\nDescription=Local Proxy Relay (auth-stripping for Chrome)\nBefore=openclaw-gateway.service\n\n[Service]\nExecStart=/usr/bin/node /root/.openclaw/proxy-relay.js\nEnvironment=\"PROXY_HOST=<UPSTREAM_PROXY_HOST>\"\nEnvironment=\"PROXY_PORT=<UPSTREAM_PROXY_PORT>\"\nEnvironment=\"PROXY_USER=<UPSTREAM_PROXY_USER>\"\nEnvironment=\"PROXY_PASS=<UPSTREAM_PROXY_PASS>\"\nEnvironment=\"RELAY_PORT=7891\"\nRestart=always\nRestartSec=3\n\n[Install]\nWantedBy=default.target\nEOF\n\nexport XDG_RUNTIME_DIR=/run/user/$(id -u)\nsystemctl --user daemon-reload\nsystemctl --user enable --now proxy-relay.service\n\n# 验证中继工作\ncurl -s --connect-timeout 5 -x http://127.0.0.1:7891 https://api.telegram.org | head -1\n```\n\n> **架构说明**：\n> ```\n> Chrome --proxy-server=127.0.0.1:7891 → proxy-relay（无认证）→ 上游代理（带认证）→ 海外网站\n> ```\n\n**创建 wrapper**（根据是否需要代理，选择对应版本）：\n\n```bash\n# 备份系统 chromium（如果有）\nmv /usr/bin/chromium /usr/bin/chromium.system 2>/dev/null\n\n# 获取 Playwright Chrome 路径\nPLAYWRIGHT_CHROME=$(find ~/.cache/ms-playwright/chromium-*/chrome-linux/chrome 2>/dev/null | head -1)\n\n# === 需要代理的版本 ===\ncat > /usr/bin/chromium << EOF\n#!/bin/bash\nunset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY\nexec $PLAYWRIGHT_CHROME --proxy-server=http://127.0.0.1:7891 \"\\$@\"\nEOF\n\n# === 不需要代理的版本 ===\n# cat > /usr/bin/chromium << EOF\n# #!/bin/bash\n# unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY\n# exec $PLAYWRIGHT_CHROME \"\\$@\"\n# EOF\n\nchmod +x /usr/bin/chromium\n\n# 验证\n/usr/bin/chromium --version\n```\n\n> **注意**：写 wrapper 文件时避免通过 SSH 传递 `#!/bin/bash`，\n> 某些 shell（zsh）会把 `!` 转义为 `\\!`。建议用 `scp` 或在远程服务器上直接编辑。\n\n### 8c. 启动 Xvfb 服务\n\n```bash\ncat > ~/.config/systemd/user/xvfb.service << 'EOF'\n[Unit]\nDescription=Xvfb Virtual Framebuffer\nBefore=openclaw-gateway.service\n\n[Service]\nExecStart=/usr/bin/Xvfb :99 -screen 0 1280x720x24 -nolisten tcp\nRestart=always\nRestartSec=3\n\n[Install]\nWantedBy=default.target\nEOF\n\nexport XDG_RUNTIME_DIR=/run/user/$(id -u)\nsystemctl --user daemon-reload\nsystemctl --user enable --now xvfb.service\n```\n\n### 8d. 配置 OpenClaw 浏览器（三个必设项 + profile）\n\n> **三个配置缺一不可**，否则 Chrome 无法在无头服务器上以 root 运行：\n\n```bash\nopenclaw config set browser.enabled true\nopenclaw config set browser.headless true    # 无头模式，不开会尝试打开 GUI\nopenclaw config set browser.noSandbox true   # root 运行必须，否则 Chrome 静默崩溃\n```\n\n创建 headless profile（使用 openclaw 驱动，不用 Chrome 扩展）：\n\n```bash\nopenclaw browser create-profile --name headless --driver openclaw --color '#0066CC'\nopenclaw config set browser.defaultProfile headless\n```\n\n> **不要用默认的 extension driver**。extension driver 需要在 Chrome 里安装 OpenClaw 扩展，\n> 无头服务器上不可能操作。`--driver openclaw` 使用 Playwright 直接驱动。\n\n### 8e. 确保 systemd 环境变量完整\n\n> 如果第 7 步已经写了 proxy.conf（含 `no_proxy` 和 `DISPLAY=:99`），这里**不需要再改**。\n> 如果第 7 步没配代理（不需要代理的场景），这里只需加 `DISPLAY`：\n\n```bash\n# 仅当第 7 步没写过 proxy.conf 时才需要\nmkdir -p ~/.config/systemd/user/openclaw-gateway.service.d\ncat > ~/.config/systemd/user/openclaw-gateway.service.d/proxy.conf << 'EOF'\n[Service]\nEnvironment=\"DISPLAY=:99\"\nEOF\n```\n\n### 8f. 清理 + 验证配置 + 重启\n\n> **重要**：先运行 `openclaw doctor --fix` 清理可能的无效配置 key，\n> 避免网关因配置校验失败反复崩溃重启。\n\n```bash\n# 清理无效配置\nopenclaw doctor --fix\n\n# 杀掉可能残留的 Chrome 进程\nkillall -9 chrome chrome_crashpad 2>/dev/null\nrm -f ~/.openclaw/browser/headless/user-data/SingletonLock 2>/dev/null\n\n# 重启网关\nexport XDG_RUNTIME_DIR=/run/user/$(id -u)\nsystemctl --user daemon-reload\nsystemctl --user restart openclaw-gateway.service\nsleep 5\n\n# 测试导航（用简单站点，首次连接较慢属正常）\nopenclaw browser navigate https://example.com --timeout 60000\n\n# 测试快照\nopenclaw browser snapshot | head -20\n\n# 确认状态（应显示 running: true）\nopenclaw browser status\n```\n\n### 8g. 低功耗设备性能调优（ARM/树莓派等）\n\n> **适用场景**：树莓派、ARM 开发板等低功耗设备。x86 服务器通常不需要。\n> **核心问题**：Chrome 使用 `swiftshader-webgl`（CPU 软件渲染），ARM CPU 处理复杂页面极慢。\n> 内存不是瓶颈（8GB 足够），CPU 才是。\n\n**问题 1：浏览器操作超时 20 秒不够**\n\nOpenClaw 硬编码了 20 秒超时（`timeoutMs: 2e4`），低功耗设备上需要 60 秒。\n\n```bash\n# 修改所有浏览器操作超时：20s → 60s\nfor f in pi-embedded-*.js reply-*.js; do\n  FILE=\"/usr/lib/node_modules/openclaw/dist/$f\"\n  [ -f \"$FILE\" ] && sed -i 's/timeoutMs: 2e4/timeoutMs: 6e4/g' \"$FILE\"\ndone\n\n# 修改浏览器 CLI 命令超时\nfor f in browser-cli-*.js; do\n  FILE=\"/usr/lib/node_modules/openclaw/dist/$f\"\n  [ -f \"$FILE\" ] && sed -i 's/timeoutMs: 2e4/timeoutMs: 6e4/g; s/?? 2e4/?? 6e4/g' \"$FILE\"\ndone\n\n# 修改默认代理超时常量\nsed -i 's/DEFAULT_BROWSER_PROXY_TIMEOUT_MS = 2e4/DEFAULT_BROWSER_PROXY_TIMEOUT_MS = 6e4/g' \\\n  /usr/lib/node_modules/openclaw/dist/pi-embedded-*.js \\\n  /usr/lib/node_modules/openclaw/dist/reply-*.js\n```\n\n**问题 2：Playwright CDP 连接超时太短**\n\nPlaywright 连接 Chrome 有 3 次重试（5s/7s/9s），ARM 设备上不够。改为 15s/20s/25s：\n\n```bash\n# 增加 Playwright CDP 连接超时\nsed -i 's/const timeout = 5e3 + attempt \\* 2e3/const timeout = 15e3 + attempt * 5e3/g' \\\n  /usr/lib/node_modules/openclaw/dist/pw-ai-*.js\n```\n\n**问题 3：Chrome 重启后恢复旧标签**\n\nChrome 从 user-data 恢复上次会话的所有标签页，在低功耗设备上多标签会耗尽 CPU。\n每次重启网关前需要清理：\n\n```bash\n# 关闭所有 Chrome 标签（保留一个空白页）\ncurl -s http://127.0.0.1:18801/json/list 2>/dev/null | \\\n  python3 -c \"\nimport sys,json,urllib.request\ntry:\n  tabs=json.load(sys.stdin)\n  for t in tabs[1:]:\n    urllib.request.urlopen(f'http://127.0.0.1:18801/json/close/{t[\\\"id\\\"]}')\n  print(f'Closed {len(tabs)-1} tabs')\nexcept: pass\n\" 2>/dev/null\n```\n\n> **注意**：以上源码修改会在 OpenClaw 更新后被覆盖，需要重新执行。\n\n**低功耗设备浏览器使用建议**：\n- 避免重型 SPA（Google News、Twitter 等），超过 60 秒仍会超时\n- 优先用轻量级/文本版网站（CNN Lite、RSS feeds、API 接口）\n- 简单页面（example.com、百度）通常 3-5 秒内完成\n- 首次浏览器操作较慢（Playwright 需建立 CDP 连接），后续操作快很多\n\n### 8h. X/Twitter 登录（可选）\n\n> **适用场景**：让 Bot 能以已登录身份浏览 X/Twitter（查看时间线、搜索等）。\n> 需要先完成 8a-8f 的浏览器配置。\n\n**前置条件**：用户需提供 X/Twitter 的 `auth_token`（40 位十六进制）。\n这个 token 可从已登录浏览器的 Cookies 中提取（开发者工具 → Application → Cookies → x.com → auth_token）。\n\n> **核心经验**：**不要尝试在服务器上自动化登录流程！** 直接注入 auth_token 是唯一可靠方案。\n> 我们尝试过 7+ 种登录方案全部失败（见踩坑总结 22-30），原因包括：\n> - X 的登录页在 ARM + swiftshader 上无法渲染\n> - API 登录流程会触发 IP 限频（error 399）\n> - Python HTTP 客户端被 Cloudflare TLS 指纹识别拦截\n> - Chrome 跨域请求（CORS）限制无法绕过\n> - CDP Fetch 拦截开启后 fetch 调用全部报错\n\n#### 获取 auth_token\n\n用户需要在**自己的电脑浏览器**上获取 auth_token（服务器上无法完成登录）：\n\n1. 在电脑浏览器登录 x.com\n2. 打开开发者工具（F12）→ Application → Cookies → `https://x.com`\n3. 找到 `auth_token`，复制值（40 位十六进制字符串）\n\n> **关键理解**：之前\"成功登录\"实际上**不是在服务器上完成登录**，而是复用了一个已有的有效 auth_token。\n> 本质是\"贴了一张有效的门票\"，不是\"重新买票\"。服务器上没有任何可靠方式完成 X 的登录流程。\n\n#### 注入 auth_token 到 Chrome\n\n```python\n# /tmp/x-inject-token.py — 通过 CDP 注入 auth_token\nimport json, socket, struct, hashlib, base64, time, os, urllib.request\n\nCDP_URL = \"http://127.0.0.1:18801\"\nAUTH_TOKEN = \"<用户提供的auth_token>\"\n\n# ... CDP 类（见下方完整代码）...\n\n# 1. 清除旧的 x.com/twitter.com cookies\nall_ck = c.cmd(\"Network.getAllCookies\")\nfor ck in all_ck.get(\"cookies\", []):\n    dom = ck.get(\"domain\", \"\")\n    if \"x.com\" in dom or \"twitter.com\" in dom:\n        c.cmd(\"Network.deleteCookies\", {\"name\": ck[\"name\"], \"domain\": dom})\n\n# 2. 注入 auth_token（必须带 expires 参数！）\nexpires = time.time() + 365 * 86400\nfor dom in [\".x.com\", \".twitter.com\"]:\n    c.cmd(\"Network.setCookie\", {\n        \"name\": \"auth_token\", \"value\": AUTH_TOKEN,\n        \"domain\": dom, \"path\": \"/\", \"secure\": True, \"httpOnly\": True,\n        \"expires\": expires, \"sameSite\": \"None\"\n    })\n\n# 3. 导航到 x.com/home 触发会话建立\nc.cmd(\"Page.navigate\", {\"url\": \"https://x.com/home\"})\ntime.sleep(25)  # ARM 设备需要更长等待\n\n# 4. 验证：页面标题应为 \"(N) Home / X\"，且 cookies 包含 ct0 和 twid\nall_ck = c.cmd(\"Network.getAllCookies\")\n# 从 Network 层读取 cookies（ct0 是 httpOnly，JS 读不到）\n\n# 5. 保存全部 cookies（含 ct0、twid 等会话后生成的 cookie）\nx_ck = {}\nfor ck in all_ck.get(\"cookies\", []):\n    dom = ck.get(\"domain\", \"\")\n    if \"x.com\" in dom or \"twitter.com\" in dom:\n        x_ck[ck[\"name\"]] = ck[\"value\"]\nwith open(os.path.expanduser(\"~/.openclaw/x-cookies.json\"), \"w\") as f:\n    json.dump(x_ck, f, indent=2)\n\n# 6. 回写全部 cookies 并带 expires（确保持久化到 Chrome 用户目录）\nfor name, val in x_ck.items():\n    if isinstance(val, str):\n        for dom in [\".x.com\", \".twitter.com\"]:\n            c.cmd(\"Network.setCookie\", {\n                \"name\": name, \"value\": val, \"domain\": dom,\n                \"path\": \"/\", \"secure\": True,\n                \"httpOnly\": name in (\"auth_token\", \"ct0\"),\n                \"expires\": expires, \"sameSite\": \"None\"\n            })\n```\n\n#### Cookie 持久化（关键！）\n\n> **大坑**：`Network.setCookie` 不带 `expires` 参数时，cookie 只存在内存中，\n> Chrome 重启后**全部丢失**，Twitter 检测到 session 断开会**吊销 auth_token**。\n> 一旦 token 被吊销就**永久失效**，必须用户重新在电脑上登录获取新 token。\n\n**必须做的两件事：**\n\n1. **注入时必须带 `expires` 参数**（设为 1 年后），让 Chrome 写入磁盘持久化\n2. **登录成功后回写全部 cookies**：导航到 x.com/home 后，Twitter 会生成 `ct0`、`twid` 等新 cookie，\n   这些 cookie 也需要用 `Network.setCookie` + `expires` 回写一遍，否则它们也是内存态\n\n**验证 cookie 是否持久化：**\n重启 Chrome 后，检查 cookies 是否还在：\n\n```python\nall_ck = c.cmd(\"Network.getAllCookies\")\nauth = [ck for ck in all_ck.get(\"cookies\", []) if ck[\"name\"] == \"auth_token\"]\nprint(f\"auth_token exists: {len(auth) > 0}\")\n```\n\n#### 验证成功的标志\n\n- 页面标题包含 `Home / X`（不是 `Login` 或空白页）\n- Cookies 中出现 `ct0`（CSRF token）和 `twid`（用户 ID）\n- URL 保持在 `x.com/home`（没被重定向到登录页）\n\n**保存 cookies 供其他工具使用：**\n\n```bash\n# cookies 保存位置\n~/.openclaw/x-cookies.json\n```\n\n> **重要**：`ct0` cookie 是 httpOnly 的，**只能通过 CDP `Network.getAllCookies` 读取**，\n> 不能用 `document.cookie` 读（会返回空）。这是一个常见误判——看到 `ct0: none` 就以为登录失败，\n> 实际上页面标题 `Home / X` 已经证明登录成功了。\n\n**安装 x-tweet-fetcher skill（可选）：**\n\n让 Bot 能通过命令获取 X/Twitter 推文内容：\n\n```bash\n# 手动下载安装（clawhub install 经常限频）\nSKILL_DIR=\"/usr/lib/node_modules/openclaw/skills/x-tweet-fetcher\"\nmkdir -p \"$SKILL_DIR/scripts\"\n\n# 下载 SKILL.md 和 fetch_tweet.py\ncurl -sL \"https://raw.githubusercontent.com/ythx-101/x-tweet-fetcher/main/SKILL.md\" \\\n  -o \"$SKILL_DIR/SKILL.md\"\ncurl -sL \"https://raw.githubusercontent.com/ythx-101/x-tweet-fetcher/main/scripts/fetch_tweet.py\" \\\n  -o \"$SKILL_DIR/scripts/fetch_tweet.py\"\nchmod +x \"$SKILL_DIR/scripts/fetch_tweet.py\"\n\n# 验证\nopenclaw skills list 2>&1 | grep tweet\n```\n\n> **坑**：`fetch_tweet.py` 使用 `urllib.request.urlopen()`，这个函数**不会自动使用 `https_proxy` 环境变量**。\n> 如果服务器需要代理才能访问外网，必须手动添加 ProxyHandler：\n\n```python\n# 在 fetch_tweet.py 的 import 部分加 import os\n# 在 urlopen 之前加：\nproxy_url = os.environ.get(\"https_proxy\") or os.environ.get(\"http_proxy\") or \"\"\nif proxy_url:\n    opener = urllib.request.build_opener(\n        urllib.request.ProxyHandler({\"https\": proxy_url, \"http\": proxy_url})\n    )\nelse:\n    opener = urllib.request.build_opener()\n# 然后用 opener.open(url) 替换 urllib.request.urlopen(url)\n```\n\n---\n\n## 第九步：最终验证\n\n```bash\n# 1. 健康检查\nopenclaw health\n\n# 2. 频道状态\nopenclaw channels status\n\n# 3. 测试模型连通（命令行）\nopenclaw agent --local --agent main -m '你好，简短确认你是什么模型'\n\n# 4. systemd 服务状态\nexport XDG_RUNTIME_DIR=/run/user/$(id -u)\nsystemctl --user status openclaw-gateway.service | head -5\n\n# 5. 浏览器状态（如已配置）\nopenclaw browser status\n```\n\n全部通过后，输出总结表格：\n\n| 项目 | 状态 |\n|------|------|\n| OpenClaw | 版本号 |\n| 模型 | provider/model-id |\n| 网关 | systemd active (running) |\n| Linger | 已启用 |\n| 频道 | 频道名 + running |\n| Bot 链接 | t.me/xxx_bot |\n| 代理 | 有/无 |\n| 浏览器 | running / 未配置 |\n\n---\n\n## 保存凭证\n\n在用户本地工作目录保存一份凭证备忘录：\n\n```\n文件名：openclaw-credentials.txt\n内容：服务器地址、Bot 名称、Bot Token、模型 provider\n```\n\n---\n\n## 踩坑总结（按流程顺序）\n\n| 编号 | 坑 | 原因 | 正确做法 |\n|------|-----|------|----------|\n| 1 | 安装脚本报 `/dev/tty` 错误 | 非交互式 SSH 无 TTY | 忽略，OpenClaw 已装好，手动写配置 |\n| 2 | `openclaw channels add --channel telegram` 报 `Unknown channel` | Telegram 不是通过 `channels add` 配置的 | 用 `openclaw config set channels.telegram.*` |\n| 3 | Telegram API 连不上（`fetch failed`） | 中国大陆无法直连 api.telegram.org | 必须配代理，写入 systemd 环境变量 |\n| 4 | 代理配了但重启后还是 `fetch failed` | `openclaw config set` 触发热重启不加载 systemd 环境变量 | 必须用 `systemctl --user restart` |\n| 5 | `openclaw devices approve <CODE>` 报 `unknown requestId` | 用错命令了 | 正确命令：`openclaw pairing approve telegram <CODE>` |\n| 6 | `openclaw pairing list` 报 `Channel required` | 必须指定频道参数 | `openclaw pairing list telegram` |\n| 7 | 配置验证报错 `dmPolicy=\"open\" requires allowFrom to include \"*\"` | open 模式需要显式设置 allowFrom | 用 `pairing` 模式，不要改成 `open` |\n| 8 | gateway 需要 `gateway.mode` 才能启动 | 手动写配置时漏了 | 配置文件里加 `\"gateway\": {\"mode\": \"local\"}` |\n| 9 | `State integrity` 报目录缺失 | 首次安装未创建必要目录 | `mkdir -p ~/.openclaw/agents/main/sessions ~/.openclaw/credentials` |\n| 10 | 退出 SSH 后网关停止 | systemd user session 无 linger | `loginctl enable-linger` |\n| 11 | 系统 Chromium 启动报库版本不匹配 | Arch 等滚动发行版 ICU/libFLAC 版本不兼容 | 用 Playwright 自带 Chromium，创建 wrapper 替换 `/usr/bin/chromium` |\n| 12 | `Chrome extension relay not reachable at 127.0.0.1:18792` | 默认 profile 用 extension driver，需要 Chrome 扩展 | 创建 headless profile：`--driver openclaw`（用 Playwright 直接驱动） |\n| 13 | `Failed to start Chrome CDP on port 18801`（Chrome 已启动但检测不到） | `http_proxy` 导致 OpenClaw 连 localhost CDP 也走代理 | systemd 环境变量加 `no_proxy=127.0.0.1,localhost,::1` |\n| 14 | 浏览器导航报 `net::ERR_INVALID_AUTH_CREDENTIALS` | Chromium 不支持 `http_proxy` URL 中的 `user:pass@` 认证格式 | wrapper 脚本中 `unset http_proxy https_proxy` |\n| 15 | `browser.headless` 和 `browser.noSandbox` 未设置 | 默认都是 false，root 无头运行必须开启 | `openclaw config set browser.headless true` + `browser.noSandbox true` |\n| 16 | 浏览器操作超时 `timed out after 20000ms` | OpenClaw 硬编码 20 秒超时，ARM 设备 CPU 软件渲染太慢 | 修改源码 `timeoutMs: 2e4` → `6e4`（见 8g 节） |\n| 17 | Playwright CDP 连接超时 `Timeout 9000ms exceeded` | 首次连接重试 5s/7s/9s 不够，ARM 上 Chrome 初始化慢 | 修改源码 `5e3 + attempt * 2e3` → `15e3 + attempt * 5e3`（见 8g 节） |\n| 18 | 重启后浏览器操作卡死（14 个标签恢复） | Chrome 从 user-data 恢复旧会话标签，多标签耗尽 CPU | 重启前用 CDP API 关闭多余标签，或清理 user-data |\n| 19 | Google News 等重型 SPA 始终超时 | ARM + swiftshader 软件渲染，复杂 JS/CSS 渲染超过 60 秒 | 用轻量级网站或 RSS/API 替代，无法通过增加超时解决 |\n| 20 | Chrome 能访问国内站但无法访问海外站 | wrapper 中 unset 了代理变量，Chrome 无法直连海外 | 搭建本地代理中继 + `--proxy-server=127.0.0.1:7891`（见 8b 节） |\n| 21 | SSH 传输 wrapper 脚本 shebang 变成 `#\\!` | zsh 的历史扩展把 `!` 转义成 `\\!` | 用 scp 传输文件，或在远程服务器上直接编辑 |\n| 22 | X 登录页显示 \"Something went wrong\" | ARM + swiftshader 软件渲染无法运行 X 的 React SPA | 不要用浏览器自动化登录，直接注入 auth_token |\n| 23 | Twitter API 登录返回 error 399 \"Could not log you in now\" | 多次失败尝试触发 IP 级别限频 | 不要反复重试登录 API，一旦被限频需等待数小时 |\n| 24 | Python twikit/httpx 被 Cloudflare 403 拦截 | Python HTTP 客户端的 TLS 指纹与浏览器不同 | 只能通过真实浏览器（Chrome CDP）发起请求 |\n| 25 | Chrome fetch + `credentials: 'include'` 报 CORS 错误 | x.com 向 api.twitter.com 带凭据的跨域请求触发 preflight 失败 | 用 CDP `Fetch.enable` 在协议层注入 Cookie 头绕过 CORS |\n| 26 | `document.cookie` 读不到 `ct0` | ct0 是 httpOnly cookie，JS 无权访问 | 用 CDP `Network.getAllCookies` 从协议层读取 |\n| 27 | `urllib.request.urlopen()` 不走代理 | urllib 的 urlopen 默认**不使用** `https_proxy` 环境变量 | 显式创建 `ProxyHandler` + `build_opener` |\n| 28 | env 文件 source 报 `command not found` | 密码/token 中含 `\\|` 等特殊字符未加引号，bash 把 `\\|` 后面当命令执行 | env 文件中所有值用单引号包裹 |\n| 29 | Chrome 重启后 X 登录丢失，auth_token 被吊销 | `Network.setCookie` 不带 `expires` 只存内存，重启后丢失；Twitter 检测 session 断开后吊销 token | 注入 cookie 时**必须带 `expires`**（1 年），登录后回写全部 cookie 也带 expires |\n| 30 | 服务器上所有自动登录方案均失败（API/twikit/CDP Fetch/Chrome JS/CORS） | ARM 软件渲染 + Cloudflare TLS 指纹 + CORS 限制 = 无法在服务器完成登录 | **放弃在服务器登录**，让用户在自己电脑浏览器获取 auth_token 后注入 |","tags":["openclaw","deploy","claude","arsenal","majiayu000","agent-skills","ai-agents","ai-coding-assistant","automation","claude-code","code-review","developer-tools"],"capabilities":["skill","source-majiayu000","skill-openclaw-deploy","topic-agent-skills","topic-ai-agents","topic-ai-coding-assistant","topic-automation","topic-claude","topic-claude-code","topic-code-review","topic-developer-tools","topic-devops","topic-productivity","topic-prompt-engineering","topic-python"],"categories":["claude-arsenal"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/majiayu000/claude-arsenal/openclaw-deploy","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add majiayu000/claude-arsenal","source_repo":"https://github.com/majiayu000/claude-arsenal","install_from":"skills.sh"}},"qualityScore":"0.464","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 29 github stars · SKILL.md body (25,437 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-01T07:01:14.795Z","embedding":null,"createdAt":"2026-04-18T22:24:16.531Z","updatedAt":"2026-05-01T07:01:14.795Z","lastSeenAt":"2026-05-01T07:01:14.795Z","tsv":"'-1':946,1156,1310,1350,1847 '-10':532 '-20':1644 '-20250929':462 '-30':1935 '-5':139,423,461,1881,2526 '-9':1600 '/.cache/ms-playwright/chromium-':941,1345 '/.config/systemd/user/openclaw-gateway.service.d':706,1570 '/.config/systemd/user/openclaw-gateway.service.d/proxy.conf':708,1572 '/.config/systemd/user/proxy-relay.service':1239 '/.config/systemd/user/xvfb.service':1419 '/.openclaw':486 '/.openclaw/agents/main/sessions':482,2694 '/.openclaw/browser/headless/user-data/singletonlock':1608 '/.openclaw/credentials':483,2695 '/.openclaw/openclaw.json':379,489 '/.openclaw/proxy-relay.js':1002 '/.openclaw/x-cookies.json':2179,2352 '/api/paas/v4':426 '/api/v10/users/@me':664 '/bin/bash':1355,1378,1404 '/bot':653,687 '/chrome-linux/chrome':942,1346 '/compatible-mode/v1':455 '/const':1789 '/default_browser_proxy_timeout_ms':1754 '/dev/null':259,267,278,284,944,1337,1348,1605,1610,1820,1852 '/dev/tty':363,2581 '/developers':206 '/g':1717,1742,1746,1756,1794 '/getme':654,688 '/home':2107,2114,2275,2344 '/install.sh':354 '/newbot':201 '/root/.openclaw/proxy-relay.js':1256 '/run/user':516,792,1285,1449,1616,2518 '/setup_22.x':313,332 '/timeoutms':1715,1740 '/tmp/x-inject-token.py':2009 '/token':3040 '/twitter.com':2039 '/usr/bin/chromium':961,1334,1353,1376,1394,1396,2724 '/usr/bin/chromium.system':1335 '/usr/bin/node':1255 '/usr/bin/xvfb':1430 '/usr/lib/node_modules/openclaw/dist':1707,1732 '/usr/lib/node_modules/openclaw/dist/pi-embedded-':1757 '/usr/lib/node_modules/openclaw/dist/pw-ai-':1795 '/usr/lib/node_modules/openclaw/dist/reply-':1759 '/usr/lib/node_modules/openclaw/skills/x-tweet-fetcher':2395 '/v1':433,440,448,465 '/xxx_bot':2554 '/ythx-101/x-tweet-fetcher/main/scripts/fetch_tweet.py':2416 '/ythx-101/x-tweet-fetcher/main/skill.md':2408 '0':1139,1164,1433,2323 '0066cc':1518 '1':40,121,555,722,728,871,958,1679,1835,1972,2035,2259,2264,2429,2491,2579,2775,3071 '10':1025,1043,2696 '11':2709 '12':2725 '127.0.0.1':720,726,1017,1219,1226,1306,1316,1371,1817,1838,2026,2732,2773,2911 '128000':402 '1280x720x24':1434 '128k':445 '13':2750 '14':2776,2862 '15':2799 '15e3':1791,2854 '15s/20s/25s':1776 '16':2815 '17':2836 '18':2860 '18792':2733 '18801':2027,2758 '18801/json/close':1839 '18801/json/list':1818 '19':2880 '1gb':45,288 '2':53,131,258,266,277,283,554,943,967,1336,1347,1604,1609,1762,1819,1851,1975,2068,2188,2269,2428,2495,2591 '20':1681,1685,2823,2898 '200':1174,1177 '20000ms':2820 '20s':1694 '21':2916 '22':345,1934,2930 '23':2947 '24':2965 '25':2116,2981 '26':3002 '27':3016 '28':3031 '29':3048 '2e3':1788,2853 '2e4':1688,1714,1739,1744,1753,2831 '3':62,114,119,153,227,524,650,661,982,1276,1440,1770,1798,1880,1981,2103,2500,2610 '30':3077 '32000':404 '365':2077 '399':1947,2952 '4':75,171,460,1171,2119,2511,2622 '40':562,1911,1986 '403':2970 '4o':148,430 '5':87,684,807,1304,1629,2144,2527,2636 '500mb':47,290 '502':1097,1199 '5e3':1786,1793,2851,2856 '5s/7s/9s':1772,2844 '6':94,2189,2649 '60':1690,1866,2892 '600':488 '60000':1638 '60s':1695 '6e4':1716,1741,1745,1755,2832 '7':1545,1557,1564,1931,2661 '700':485 '7890':1024 '7891':1042,1272,1307,1317,1372,2912 '7a':577 '7b':627 '7c':765 '7d':804 '7e':830 '8':2677 '86400':2078 '8a':887,1902 '8a-8f':1901 '8b':950,2914 '8c':1413 '8d':1462 '8e':1540 '8f':1579,1903 '8g':1652,2834,2858 '8gb':1674 '8h':1889 '9':561,2687 '9000ms':2841 '99':731,758,1431,1553,1577 'a-f0':558 'activ':534,535,2543 'add':2594,2603 'address':368 'agent':405,2504,2506 'ai':19,63,132,135 'all_ck.get':2048,2157,2309 'allowfrom':2666,2671 'alway':1274,1438 'anthrop':150,456,467,472 'anthropic-messag':471 'api':65,184,187,390,469,638,1874,1942,2612,2874,2949,2963 'api.anthropic.com':464 'api.anthropic.com/v1':463 'api.deepseek.com':439 'api.deepseek.com/v1':438 'api.moonshot.cn':447 'api.moonshot.cn/v1':446 'api.openai.com':432 'api.openai.com/v1':431 'api.telegram.org':228,652,686,1308,2617 'api.telegram.org/bot':651,685 'api.twitter.com':2991 'api/twikit/cdp':3079 'apikey':389 'applic':208,1919,1978 'approv':841,845,863,867,2639,2647 'apt':274,307,315,929 'arch':301,895,920,2713 'argument':109 'arm':1654,1658,1670,1773,1939,2117,2825,2846,2886,2936,3082 'askuserquest':29,107,117 'attempt':1787,1792,2852,2855 'auth':980,1247,1909,1922,1927,1964,1969,1983,1994,2004,2013,2028,2070,2087,2090,2225,2250,2304,2314,2318,2322,2781,2945,3053,3092 'auth-strip':1246 'authhead':1045,1077,1082,1118,1122 'author':666,1081,1121 'bad':1200 'baewet79':869 'base64':1055,2020 'baseurl':388,420 'bash':237,314,333,349,355,479,494,526,545,580,596,612,643,672,703,787,809,849,906,937,995,1329,1417,1474,1507,1562,1591,1692,1777,1810,2349,2388,2490,3043 'basic':1048 'bot':77,97,159,164,168,176,191,194,209,667,833,835,879,1895,2384,2550,2567,2569 'botfath':80,199 'browser':1509,1634,1641,1650,1727,2531 'browser-c':1726 'browser.defaultprofile':1522 'browser.enabled':1478 'browser.headless':1483,2800,2811 'browser.nosandbox':1491,2802,2813 'buf':1137,1143,1145 'buf.indexof':1149 'buf.slice':1163,1169 'buffer.alloc':1138 'buffer.concat':1144 'buffer.from':1049 'build':3029 'c':1822 'c.cmd':2043,2061,2084,2109,2133,2211,2302 'cat':707,1001,1238,1352,1375,1418,1571 'cdp':740,750,1764,1780,1886,1958,2011,2024,2032,2360,2755,2767,2838,2873,2979,2996,3013 'cento':327 'channel':811,2498,2593,2595,2599,2602,2654 'channels.discord.bottoken':605 'channels.discord.dmpolicy':609 'channels.discord.enabled':600 'channels.feishu.dmpolicy':625 'channels.feishu.enabled':616 'channels.feishu.token':621 'channels.telegram':2609 'channels.telegram.bottoken':589 'channels.telegram.dmpolicy':593 'channels.telegram.enabled':584 'chat':437 'chmod':484,487,1392,2420 'chrome':739,749,939,948,999,1250,1312,1340,1343,1367,1390,1470,1496,1505,1530,1597,1601,1602,1663,1768,1799,1801,1812,1954,2007,2195,2242,2267,2294,2726,2740,2754,2759,2848,2864,2899,2905,2978,2982,3049 'chromium':890,893,904,909,915,935,952,968,1331,2711,2720,2783 'chunk':1142,1146 'ck':2042,2046,2064,2132,2153,2155,2171,2172,2174,2185,2301,2305,2307,2312 'ck.get':2051,2160 'claud':70,151,458 'claude-sonnet':457 'clawhub':2390 'cli':1721,1728 'clientsocket':1106,1193 'clientsocket.destroy':1212 'clientsocket.end':1197 'clientsocket.on':1213 'clientsocket.pipe':1194 'clientsocket.write':1175,1186 'close':1844 'cloudflar':1951,2969,3084 'cnn':1870 'color':1517 'command':3036 'complet':393,477 'config':582,587,591,598,603,607,614,619,623,771,1476,1481,1489,1520,2607,2627,2809 'configur':815 'connect':225,648,659,682,1104,1110,1178,1302 'connect-timeout':224,647,658,681,1301 'connectreq':1109,1135 'console.log':1220 'const':1004,1008,1012,1018,1026,1031,1036,1044,1057,1062,1083,1108,1127,1140,1147,1161,1167 'contextwindow':401 'cooki':1916,1920,1979,2040,2049,2126,2138,2146,2151,2158,2191,2232,2240,2271,2282,2284,2291,2297,2310,2331,2347,2350,2355,2999,3009,3067,3074 'cor':1956,2987,3001,3087 'could':2953 'cpu':240,1668,1671,1676,1808,2827,2871 'crashpad':1603 'creat':1511 'create-profil':1510 'credenti':981,2782,2984 'csrf':2334 'ct0':2128,2139,2148,2227,2279,2333,2354,2369,3005,3006 'curl':222,309,328,350,645,656,679,1299,1815,2404,2412 'daemon':798,1291,1455,1622 'daemon-reload':797,1290,1454,1621 'dashscope.aliyuncs.com':454 'dashscope.aliyuncs.com/compatible-mode/v1':453 'data':1159,1208,1805,2868,2879 'deb.nodesource.com':312 'deb.nodesource.com/setup_22.x':311 'debian/ubuntu':308,928 'deepseek':68,142,434,436 'deepseek-chat':435 'default':406 'default.target':1279,1443 'deploy':3 'descript':1242,1422 'devic':366,538,547,549,552,566,570,571,844,2638 'df':248 'dir':515,791,1284,1448,1615,2394,2517 'dir/scripts':2399 'dir/scripts/fetch_tweet.py':2419,2423 'dir/skill.md':2411 'discord':82,162,202,595,636,655 'discord.com':205,663 'discord.com/api/v10/users/@me':662 'discord.com/developers':204 'display':700,730,757,1552,1561,1576 'dmpolici':2663 'dnf':276,319,321 'doctor':1586,1594 'document.cookie':2364,3003 'dom':2050,2056,2060,2067,2080,2093,2159,2165,2169,2207,2218 'domain':2052,2066,2092,2161,2217 'done':1719,1748 'driver':1515,1526,1528,1535,2738,2745 'e':1095,1100 'echo':239,242,246,250,254,260,262,268,270,279,285 'els':1196,2478 'embed':1701 'enabl':410,508,814,1295,1459,2707 'enable-ling':507,2706 'env':3032,3046 'environ':711,714,717,723,729,1257,1260,1263,1266,1269,1575 'eof':709,732,1240,1280,1354,1373,1377,1391,1420,1444,1573,1578 'err':978,2779 'error':1094,1211,1214,1946,2951 'establish':1179 'example.com':1636,1877 'exceed':2842 'except':1849 'exec':1365,1388 'execstart':1254,1429 'exist':2320 'expir':2073,2075,2099,2100,2193,2228,2229,2238,2261,2287,3058,3070,3076 'export':512,673,676,788,1281,1445,1612,2514 'extens':1525,1527,2727,2737 'f':1607,1697,1708,1709,1724,1733,1734,1837,1843,2182,2186,2317 'f0':560 'f12':1977 'fail':746,819,823,2615,2625,2751 'fals':398,411,2805 'feed':1873 'fetch':818,1959,1961,2614,2624,2983 'fetch.enable':2997 'fetch/chrome':3080 'fetch_tweet.py':2403,2433,2446 'fetcher':2380 'file':1706,1710,1718,1731,1735,1747 'find':940,1344 'fix':1587,1595 'found':3038 'framebuff':1425 'free':244 'fssl':310,329,351 'gateway':412,499,1201,2678,2684 'gateway.mode':2680 'glm':138,422 'googl':1861,2881 'gpt':147,429 'gpt-4o':146,428 'grep':556,2430 'gui':1487 'h':245,249,665 'hashlib':2019 'head':531,945,1107,1191,1309,1349,1643,2525 'head.length':1189 'header':124,134,155,173,1074 'headless':761,1499,1514,1523,2743 'health':2494 'home':2123,2326,2373 'host':59,976,1014,1016,1064,1066,1133,1230,1259 'http':674,712,970,1005,1007,1357,1361,1380,1384,1949,2462,2475,2761,2785,2795,2973 'http.createserver':1059 'http.request':1085 'http/1.1':1112,1176,1198 'httpon':2097,2141,2222,2357,3008 'https':677,715,1359,1363,1382,1386,2438,2458,2472,2797,3024 'icu/libflac':898,2715 'id':395,419,517,548,550,572,793,1286,1450,1617,1841,2339,2519 'idx':1148,1155,1165,1170 'import':1823,2015,2448,2450 'includ':2668,2985 'indent':2187 'input':399 'instal':316,322,335,500,914,930,1277,1441,2391 'integr':2689 'invalid':979,2780 'ip':1944,2960 'isinst':2203 'js':1702,1704,1729,1758,1760,1796,2142,3010 'js/cors':3081 'js/css':2890 'json':383,1825,2016 'json.dump':2183 'json.load':1829 'key':66,185,188,1589 'killal':1599 'kimi':71,441 'len':1845,2321 'let':1136 'linger':502,509,2545,2704,2708 'linux':16,42 'list':553,854,858,2427,2652,2659 'listen':1224 'lite':1871 'local':414,1037,1217,1227,1243,2505,2686 'localhost':721,727,2766,2774 'log':2955 'login':2329 'loginctl':506,2705 'm':2508 'main':2507 'markdown':31 'max':452 'maxtoken':403 'memorysearch':409 'merg':386 'messag':473 'method':1072 'mkdir':480,704,1568,2396,2692 'mode':385,413,2685 'model':384,394,407,418 'moonshot':443 'moonshot-v1-128k':442 'mv':1333 'n':1117,1124,1126,1151,1153,1181,1183,1203,1205,2122 'name':396,1513,2063,2065,2086,2173,2198,2213,2214,2223,2313 'navig':1635 'net':1009,1011,2778 'net.connect':1129 'network':821,2136 'network.deletecookies':2062 'network.getallcookies':2044,2134,2303,2361,3014 'network.setcookie':2085,2212,2236,2286,3056 'news':1862,2882 'nhost':1114 'noconfirm':304,923 'node':256,339 'node.js':255,295,344,997 'nodej':305,318,324,337 'nolisten':1435 'none':2102,2231,2370 'npm':263,264,306,325,341 'nproc':241 'npx':912 'null':1056 'o':2409,2417 'onboard':358 'ondata':1141,1160,1209 'op':557 'open':2177,2468,2470,2479,2481,2664,2669,2676,3030 'open.bigmodel.cn':425 'open.bigmodel.cn/api/paas/v4':424 'open.feishu.cn':212 'openai':69,145,392,427,476 'openai-complet':391,475 'openclaw':2,5,7,9,11,13,18,32,280,281,348,371,374,498,551,565,581,586,590,597,602,606,613,618,622,737,743,770,810,839,843,852,856,861,865,959,1464,1475,1480,1488,1502,1508,1516,1519,1532,1536,1585,1593,1633,1640,1649,1683,1855,2425,2493,2497,2503,2530,2537,2588,2592,2606,2626,2637,2645,2650,2657,2746,2764,2808,2821 'openclaw-credentials.txt':2564 'openclaw-deploy':1 'openclaw-gateway.service':522,530,803,1252,1427,1627,2524 'openclaw.ai':353 'openclaw.ai/install.sh':352 'opener.open':2483 'oper':542,569 'opt':1063,1086 'opts.headers':1078 'os':2022,2451 'os.environ.get':2457,2461 'os.path.expanduser':2178 'overrid':692 'p':481,705,1569,2397,2693 'pacman':273,300,302,921 'page.navigate':2110 'pair':594,610,626,840,853,857,862,866,2646,2651,2658,2673 'parseint':1021,1039 'pass':975,1033,1035,1053,1268,1850,2790 'path':1070,2094,2219 'pi':1700 'pi-embed':1699 'playwright':102,889,902,908,913,934,938,947,965,1339,1342,1366,1389,1538,1763,1766,1779,1884,2718,2748,2837 'port':1020,1023,1038,1041,1067,1069,1131,1218,1228,1232,1262,1271,2757 'preflight':2993 'pres':1087 'pres.headers':1090 'pres.pipe':1091 'pres.statuscode':1089 'primari':408 'print':1842,2316 'process.env.proxy':1015,1022,1029,1034 'process.env.relay':1040 'profil':1467,1500,1512,2735,2744 'provid':387,416,2572 'provider/model-id':2540 'proxi':675,678,699,713,716,719,725,735,754,971,989,1080,1084,1102,1120,1222,1244,1258,1261,1264,1267,1314,1319,1358,1360,1362,1364,1369,1381,1383,1385,1387,1550,2439,2455,2459,2463,2466,2473,2476,2762,2772,2786,2796,2798,2909,3025 'proxy-author':1079,1119 'proxy-relay':1221,1318 'proxy-relay.service':1297 'proxy-serv':988,1313,1368,2908 'proxy.conf':694,826,1547,1566 'proxy.on':1093 'proxyhandl':2443,3028 'proxysocket':1128,1195 'proxysocket.destroy':1215 'proxysocket.end':1206 'proxysocket.on':1207,1210 'proxysocket.pipe':1192 'proxysocket.removelistener':1158 'proxysocket.write':1134,1190 'python':1948,2008,2299,2444,2966,2972 'python3':1821 'qwen':449,451 'qwen-max':450 'r':1113,1116,1123,1125,1150,1152,1180,1182,1202,1204 'ram':289 'raw.githubusercontent.com':2407,2415 'raw.githubusercontent.com/ythx-101/x-tweet-fetcher/main/scripts/fetch_tweet.py':2414 'raw.githubusercontent.com/ythx-101/x-tweet-fetcher/main/skill.md':2406 'reachabl':2730 'react':2941 'reason':397 'relay':1223,1245,1270,1320,2728 'relayeof':1003,1233 'reload':799,1292,1456,1623 'repli':1703 'req':1060,1105 'req.headers':1075 'req.method':1073 'req.pipe':1101 'req.url':1071,1111,1115 'request':822 'requestid':848,2642 'requir':1006,1010,2655,2665 'res':1061,1092 'res.end':1098 'res.writehead':1088,1096 'resp':1162 'resp.includes':1173 'rest':1168,1187 'rest.length':1185 'restart':785,802,1273,1437,1626,2635 'restartsec':1275,1439 'return':1157 'rhel/fedora':320 'rm':1606 'role':568 'root':1472,1493,2806 'rotat':567 'rpm.nodesource.com':331 'rpm.nodesource.com/setup_22.x':330 'rss':1872 'rss/api':2895 'run':536,816,1647,2544,2549,2559 'runtim':514,790,1283,1447,1614,2516 's/const':1784 's/default_browser_proxy_timeout_ms':1752 's/timeoutms':1713,1738 'samesit':2101,2230 'scp':1411,2927 'screen':1432 'secur':2095,2220 'sed':1711,1736,1750,1782 'server':926,990,1058,1315,1370,2910 'server.listen':1216 'server.on':1103 'servic':710,1253,1428,1574 'session':2247,2702,3063 'set':583,588,592,599,604,608,615,620,624,772,1477,1482,1490,1521,2608,2628,2810 'shebang':2921 'shell':1406 'skill':24,2381,2393,2398,2410,2418,2422,2426 'skill-openclaw-deploy' 'skill.md':2401 'sl':2405,2413 'sleep':1628 'snapshot':1642 'socket':2017 'someth':2933 'sonnet':459 'sourc':3034 'source-majiayu000' 'spa':1860,2884,2942 'ssh':50,54,57,122,125,220,233,238,504,1402,2584,2698,2917 'start':521,748,2753 'state':2688 'status':529,812,1651,2499,2523,2532 'str':2205 'string':1099 'strip':1248 'struct':2018 'swiftshad':1666,1940,2887,2937 'swiftshader-webgl':1665 'sys':1824 'sys.stdin':1830 'systemctl':519,527,783,795,800,828,1288,1293,1452,1457,1619,1624,2521,2633 'systemd':492,496,691,768,777,1235,1542,2512,2542,2620,2630,2700,2769 't.me':2553 't.me/xxx_bot':2552 'tab':1828,1834,1846,1848 'tcp':1436 'telegram':79,157,197,579,634,644,859,868,2596,2600,2611,2648,2660 'telegram/discord':91,215 'text':400 'time':2021,2817 'time.sleep':2115 'time.time':2076 'timeout':226,649,660,683,1303,1637,1785,1790,2840 'timeoutm':1687,2830 'tls':1952,2975,3085 'token':78,160,165,169,192,195,539,543,564,1910,1914,1923,1928,1965,1970,1984,1995,2005,2014,2029,2031,2071,2088,2091,2226,2251,2253,2257,2315,2319,2335,2570,2946,3054,3065,3093 'topic-agent-skills' 'topic-ai-agents' 'topic-ai-coding-assistant' 'topic-automation' 'topic-claude' 'topic-claude-code' 'topic-code-review' 'topic-developer-tools' 'topic-devops' 'topic-productivity' 'topic-prompt-engineering' 'topic-python' 'tostr':1054,1166 'tri':1827 'true':585,601,617,1479,1484,1492,1648,2096,2098,2221,2812,2814 'tti':361,2586 'tweet':2379,2431 'twid':2130,2149,2280,2337 'twikit/httpx':2967 'twitter':1863,2245,2277,2948,3061 'twitter.com':2058,2083,2167,2210 'u':518,794,1287,1451,1618,2520 'unam':252 'unit':1241,1421 'unknown':847,2598,2641 'unset':985,1356,1379,2794,2903 'upstream':1013,1019,1027,1032,1046,1050,1052,1065,1068,1130,1132,1229,1231 'url':972,2025,2111,2340,2456,2467,2474,2477,2484,2487,2787 'urllib':3019 'urllib.request':1826,2023 'urllib.request.build':2469,2480 'urllib.request.proxyhandler':2471 'urllib.request.urlopen':1836,2435,2486,3017 'urlopen':2453,3021 'user':58,520,528,784,796,801,974,1028,1030,1047,1051,1265,1289,1294,1453,1458,1620,1625,1804,2522,2634,2701,2789,2867,2878 'user-data':1803,2866,2877 'v':257,265,340,342 'v1':444 'val':2199,2204,2216 'valu':2089,2175,2215 'version':282,375,949,1397 'virtual':1424 'w':2180 'wantedbi':1278,1442 'webgl':1667 'went':2934 'whoami':510 'wizard':359,381 'wrapper':953,957,963,983,1326,1400,2722,2792,2901,2919 'wrong':2935 'x':1305,1393,1937,2001,2124,2152,2170,2184,2327,2374,2378,2421,2931,2939,3051 'x-tweet-fetch':2377 'x.com':1921,1974,1980,2038,2054,2082,2106,2113,2163,2209,2274,2343,2989 'x.com/home':2105,2112,2273,2342 'x.com/twitter.com':2037 'x/twitter':1890,1897,1907,2386 'x86':1660 'x_ck.items':2201 'xdg':513,789,1282,1446,1613,2515 'xorg':925 'xorg-server-xvfb':924 'xvfb':891,917,927,932,1415,1423 'xvfb.service':1461 'y':317,323,336,931 'yum':275,326,334 'zhipu':421 'zsh':1407,2923 '一台':41 '一旦':2252 '一旦被限频需等待数小时':2964 '一条命令解决':905 '一次性写完所有环境变量':696 '一键部署':33 '三个必设项':1466 '三个配置缺一不可':1468 '上':2847 '上无法渲染':1941 '上游代理':1322 '上获取':1968 '下载':2400 '不会':775 '不会自动使用':2437 '不使用':3023 '不依赖系统库':911 '不够':2845 '不带':2237,3057 '不开会尝试打开':1486 '不支持':969,2784 '不是':842,1998,2328 '不是在服务器上完成登录':1992 '不是通过':2601 '不满足则告知用户并停止':292 '不用':1504 '不用交互式':380 '不能用':2363 '不要分多次追加':701 '不要反复重试登录':2962 '不要尝试在服务器上自动化登录流程':1925 '不要改成':2675 '不要用浏览器自动化登录':2943 '不要用系统自带的':892 '不要用默认的':1524 '不走代理':3018 '不需要代理':640 '不需要代理的场景':1559 '不需要代理的版本':1374 '不需要再改':1555 '且':2125 '且服务器在中国大陆':216 '且频道是':633 '个标签恢复':2863 '个问题':120 '中':2902 '中出现':2332 '中含':3041 '中国大陆无法直连':2616 '中国大陆服务器':89,629 '中国大陆访问海外站点':993 '中国大陆需代理':161 '中嵌入的认证':973 '中提取':1917 '中的':2788 '为什么要':733,756 '为什么需要':956 '之前':1989 '之前加':2454 '也可以暂不配':85 '也带':3075 '也要加上':752 '也走代理':2768 '也需要用':2285 '了代理变量':2904 '仅当第':1563 '从':1802,2135,2865 '从协议层读取':3015 '代理':697,779,2555 '代理中继':954 '代理地址':88 '代理没生效':824 '代理环境变量':986 '代理的配置改完后':781 '代理配了但重启后还是':2623 '以上源码修改会在':1854 '任选':73 '优先用轻量级':1868 '会出现':897 '会回复配对码':836 '会把':1408 '会报':977 '会生成':2278 '会触发内部热重启':773 '会返回空':2366 '传输':2918 '传输文件':2928 '传递':1403 '但热重启':774 '位十六进制':1912 '位十六进制字符串':1987 '低功耗设备上需要':1689 '低功耗设备性能调优':1653 '低功耗设备浏览器使用建议':1858 '你好':2509 '使用':1501,1537,1664,2434 '例如':855,864 '供其他工具使用':2348 '保存':2346 '保存位置':2351 '保存全部':2145 '保存凭证':2561 '保持在':2341 '保留一个空白页':1814 '修复可能的认证问题':544 '修改所有浏览器操作超时':1693 '修改浏览器':1720 '修改源码':2829,2850 '修改默认代理超时常量':1749 '健康检查':2492 '先搭建本地代理中继':994 '先测试是否需要代理':641 '先获取':546 '先运行':1584 '免密登录':55 '兜底选项':129 '全部丢失':2244 '全部通过后':2533 '关键':2234 '关键坑点':769,837 '关键理解':1988 '关闭多余标签':2875 '关闭所有':1811 '其他服务器':130 '内存':46,243 '内存不是瓶颈':1673 '内容':2565 '写':1399 '写入':690,2619 '写入后立即修复权限':478 '写入磁盘持久化':2268 '写入配置文件':377 '准备什么':37 '分两轮问':111 '则判定需要代理':230 '创建':207,951,1234,1325,1498,2721,2742 '创建代理中继脚本':996 '创建自建应用':213 '初始化慢':2849 '到':2006 '到服务器后':221 '到服务器时使用':12 '前置条件':1905 '加载':776 '包含':2127 '包管理器':271,298 '单条命令':235 '即使':760 '即使当前不配浏览器':751 '原因':2577 '原因包括':1936 '去':203,211 '去掉认证层':998 '参数':2074,2262 '参数时':2239 '发':200 '发一条消息':834 '发起请求':2980 '变成':2922 '只存内存':3059 '只存在内存中':2241 '只能通过':2359 '只能通过真实浏览器':2977 '可从已登录浏览器的':1915 '可操控浏览器搜索':177 '可运行':936 '可选':86,103,877,1892,2382 '吊销':2249 '同时问以下':118 '名':417 '名称':2568 '后':2276,2295 '后服务不会停':505 '后注入':3094 '后续操作快很多':1888 '后续浏览器步骤也不需要再改这个文件':702 '后网关停止':2699 '后面当命令执行':3045 '向':2990 '否则':1469,1495 '否则它们也是内存态':2289 '含':1548,2147 '启动':511,1414 '启动后':25 '启动报库版本不匹配':2712 '启动网关':491 '启用':175,501 '命令':299 '命令行':2502 '命令超时':1722 '和':1551,2129,2336,2402,2801 '回写一遍':2288 '回写全部':2190 '国产':140,143 '在':2445,2452 '在低功耗设备上多标签会耗尽':1807 '在协议层注入':2998 '在用户本地工作目录保存一份凭证备忘录':2562 '在电脑浏览器登录':1973 '在远程':15 '在远程服务器上一键部署':4 '在非':360 '坑':2432,2576 '填表':100,179 '填表等操作':883 '增加':1778 '处理复杂页面极慢':1672 '备份系统':1330 '复制值':1985 '复杂':2889 '多标签耗尽':2870 '多次失败尝试触发':2959 '大坑':2235 '失败':229,669,2994 '头绕过':3000 '如之前用过的服务器':128 '如已配置':2529 '如未安装':296 '如果':219 '如果不配浏览器':763 '如果有':1332 '如果服务器需要代理才能访问外网':2441 '如果用户没提供':183 '如果用户没有':193 '如果看到':817 '如果第':1544,1556 '如果第一步用户选了':884 '如果超时':668 '如果过期':873 '如果选了':214 '如果选了聊天频道':189 '如果需要代理':992 '如需要':575 '始终超时':2885 '字段应为':470 '安装':294,347,495,888,907,916,2376 '安装后验证':338 '安装脚本会尝试启动交互式':357 '安装脚本报':2580 '实际上':1991 '实际上页面标题':2372 '客户端的':2974 '客户端被':1950 '密码':3039 '导致':2763 '导致浏览器启动成功但':742 '导航到':2104,2272 '小时':872 '就以为登录失败':2371 '层读取':2137 '已启动但检测不到':2760 '已启用':2546 '已提供的跳过':110 '已经证明登录成功了':2375 '已装好':2589 '带凭据的跨域请求触发':2992 '带认证':1323 '常见模型参考':415 '年':3072 '年后':2265 '并带':2192 '并确认是通过':827 '序号':36 '应显示':1646 '建议用':1410 '开发板等低功耗设备':1659 '开发者工具':1918 '当用户需要安装':6 '必填':113 '必需':39,52,61,74 '必须':695 '必须做的两件事':2258 '必须先输出以下准备清单':26 '必须带':2072,3069 '必须手动添加':2442 '必须指定频道参数':2656 '必须指定频道名':851 '必须用':782,2632 '必须用户重新在电脑上登录获取新':2256 '必须通过':767 '必须配代理':2618 '忽略':2587 '恢复上次会话的所有标签页':1806 '恢复旧会话标签':2869 '成功登录':1990 '我们尝试过':1930 '或':81,83,635,820 '或在远程服务器上直接编辑':1412,2929 '或清理':2876 '或空白页':2330 '截图':99,178,882 '所有涉及频道':780 '手动下载安装':2389 '手动写配置':2590 '手动写配置时漏了':2682 '才是':1677 '才能启动':2681 '打开开发者工具':1976 '执行搜索':881 '扩展':1506,1533,2741 '批准配对':860 '找':198 '找到':1982 '把':3044 '报':745,2597,2640,2653,2986,3035 '报目录缺失':2690 '拦截':2971 '拦截开启后':1960 '持久化':2233 '指向本地无认证代理中继':991 '指纹':3086 '指纹与浏览器不同':2976 '指纹识别拦截':1953 '按流程顺序':2574 '按顺序执行':493 '接口':1875 '推文内容':2387 '搜索等':1899 '搭建本地代理中继':2907 '支持':49 '收集':108 '收集信息':30,105 '改为':1775 '改用':987 '放弃在服务器登录':3090 '文件':3033 '文件中所有值用单引号包裹':3047 '文件名':2563 '文件时避免通过':1401 '文本版网站':1869 '断开会':2248 '断开后吊销':3064 '无':2557,2585,2703 '无头服务器上不可能操作':1534 '无头服务器必须':919 '无头模式':1485 '无头运行必须开启':2807 '无权访问':3011 '无法在无头服务器上以':1471 '无法在服务器完成登录':3089 '无法直连海外':2906 '无法通过增加超时解决':2897 '无认证':1321 '无需代理':141,144 '时':3068 '时才需要':1567 '时需要':92 '是':2140,2356,3007 '是否持久化':2292 '是否还在':2298 '是唯一可靠方案':1929 '显式创建':3027 '智谱':137 '智谱glm':67 '暂不配置':170,180,885 '更新后被覆盖':1856 '替代':2896 '替换':2485,2723 '最低':44 '最低要求':287 '最终验证':2489 '有':1769,2556 '服务':497,1236,1416 '服务器':43 '服务器上所有自动登录方案均失败':3078 '服务器上无法完成登录':1971 '服务器上没有任何可靠方式完成':2000 '服务器上自动部署':17 '服务器在中国大陆':632 '服务器地址':2566 '服务器通常不需要':1661 '服务状态':2513 '未安装':261,269,286 '未设置':2803 '未配置':2560 '本体已安装成功':372 '本质是':1996 '杀掉可能残留的':1596 '来启动浏览器':962 '来重启':786 '架构说明':1311 '某些':1405 '查看待配对列表':850 '查看时间线':1898 '标签':1813 '树莓派':1657 '树莓派等':1655 '核心经验':1924 '核心问题':1662 '根据是否需要代理':1327 '根据检测到的包管理器':297 '根据用户选择的频道执行对应配置':576 '根据第一轮结果追问':182 '检查':825,2296 '检测':3062 '检测不到':744 '检测到':2246 '模型':20,64,133,136,2539,2571 '模型的':468 '模型配置模板':382 '模式':2674 '模式也需要':762 '模式需要显式设置':2670 '次重试':1771 '欢迎':34 '正确做法':2578 '正确命令':2644 '步已经写了':1546 '步没写过':1565 '步没配代理':1558 '每次重启网关前需要清理':1809 '永久失效':2255 '没有它':736 '没被重定向到登录页':2345 '注入':2003,2012,2069,3066 '注入时必须带':2260 '注意':466,1398,1853 '测试导航':1630 '测试快照':1639 '测试模型连通':2501 '浏览器':174,1465,2558 '浏览器导航报':2777 '浏览器控制':95,172 '浏览器操作超时':1680,2816 '浏览器状态':2528 '浏览器需要显示服务器':759 '海外网站':1324 '海外频道':90 '海外频道时必须':630 '清理':1580 '清理可能的无效配置':1588 '清理无效配置':1592 '清除旧的':2036 '渲染超过':2891 '滚动发行版':894 '然后再用':28 '然后用':2482 '版本':966 '版本不兼容':2716 '版本号':2538 '状态':2536 '环境会报':362 '环境变量':2440,2621,2631,3026 '环境变量加':2770 '环境变量完整':1543 '环境检查':232 '用':106,116,2605,2672,2717,2736,2747,2926,2995,3012 '用实际的代理信息替换变量':1237 '用户':2338 '用户提供的auth':2030 '用户目录':2196 '用户需提供':1906 '用户需要在':1966 '用用户提供的代理测试':671 '用简单站点':1631 '用轻量级网站或':2894 '用错命令了':2643 '登录':51,1891 '登录丢失':3052 '登录后回写全部':3073 '登录成功后回写全部':2270 '登录流程会触发':1943 '登录返回':2950 '登录页显示':2932 '百度':1878 '的':1908,2358,2447,2940,3020 '的历史扩展把':2924 '的浏览器配置':1904 '的环境变量':778 '的登录流程':2002 '的登录页在':1938 '直接写':378 '直接注入':1926,2944 '直接连上':60 '直接驱动':1539,2749 '直连':1000 '看到':2368 '硬编码':2822 '硬编码了':1684 '确保':1541 '确保持久化到':2194 '确保本机能':56 '确认':343,533 '确认状态':1645 '确认输出包含':813 '确认返回成功后':689 '磁盘':48,247,291 '种登录方案全部失败':1932 '秒':1691,2893 '秒不够':1682 '秒仍会超时':1867 '秒内完成':1882 '秒后':808 '秒后验证':525 '秒超时':1686,2824 '稳定发行版也可能版本过旧':900 '端口也会走代理':741 '第一步':104 '第一轮':112 '第七步':573 '第三步':293 '第九步':2488 '第二步':231 '第二轮':181 '第五步':376 '第八步':875 '第六步':490 '第四步':346 '第零步':22 '等':896,1864 '等会话后生成的':2150 '等库版本不匹配':899 '等待':523,806 '等新':2281 '等滚动发行版':2714 '等特殊字符未加引号':3042 '等重型':2883 '简单页面':1876 '简短确认你是什么模型':2510 '类':2033 '系统':251,2710 '级别限频':2961 '经常限频':2392 '给出创建教程':196 '统一用':901 '编号':2575 '网关':2541 '网关首次启动后':540 '而是复用了一个已有的有效':1993 '而非':474 '聊天频道':21,76,154,156 '能以已登录身份浏览':1896 '能操控浏览器':880 '能操控浏览器搜索':98 '能访问国内站但无法访问海外站':2900 '能通过命令获取':2385 '脚本':2920 '脚本中':2793 '自动':984 '自动判断':218,642 '自动检测':960 '自己的电脑浏览器':1967 '自带':2719 '自带所有依赖':910 '自带的':903 '节':2835,2859,2915 '获取':1338,1963 '获取全部信息':236 '虚拟显示':918 '被':2968 '被吊销':3055 '被吊销就':2254 '见':2833,2857,2913 '见下方完整代码':2034 '见踩坑总结':1933 '视情况':93 '触发会话建立':2108 '触发热重启不加载':2629 '认证格式':2791 '让':96,878,1894,2266,2383 '让它用':964 '让用户在对应频道给':832 '让用户在自己电脑浏览器获取':3091 '让用户知道需要什么':27 '让用户重新发消息即可生成新码':874 '设为':2263 '设备':2826 '设备上不够':1774 '设备需要更长等待':2118 '设置频道':578 '说明':38 '说明需要代理':670 '读':2365 '读不到':2143,3004 '读取':2362 '调用全部报错':1962 '贴了一张有效的门票':1997 '超过':1865 '足够':1675 '跨域请求':1955 '路径':1341 '跳过此步':886 '踩坑总结':2573 '转义为':1409 '转义成':2925 '轮换':537,541,563 '软件渲染':1669,2888,3083 '软件渲染太慢':2828 '软件渲染无法运行':2938 '输出傻瓜教程':23 '输出总结表格':2534 '运行':1473 '运行必须':1494 '这个':1913 '这个函数':2436 '这个变量无害':764 '这些':2283 '这是一个常见误判':2367 '这是正常的':370 '这里':1554 '这里只需加':1560 '进程':1598 '远程一键部署':14 '连':2765 '连不上':2613 '连接':126,1767,1887 '连接信息':123 '连接到服务器':234 '连接超时':1781,2839 '连接超时太短':1765 '连本地':738 '退出':503,2697 '适用场景':631,1656,1893 '选择对应版本':1328 '选项根据上下文动态生成':127 '通义':72 '通常':1879 '通过':2010 '避免网关因配置校验失败反复崩溃重启':1590 '避免重型':1859 '那个会报':846 '部分加':2449 '部署':8 '部署前你需要准备以下东西':35 '配对命令是':838 '配对用户':831 '配对码有效期约':870 '配置':10,1463 '配置代理':628 '配置文件里加':2683 '配置浏览器控制':876 '配置的':2604 '配置聊天频道':574 '配置验证报错':2662 '里安装':1531 '重启':1582,2293 '重启前用':2872 '重启后':2243,3050 '重启后丢失':3060 '重启后恢复旧标签':1800 '重启后浏览器操作卡死':2861 '重启的':829 '重启网关':766,1611 '重新买票':1999 '重要':356,693,1583,2353 '链接':2551 '错误':369,2582,2988 '问':186,190 '问代理地址':217 '问题':1678,1761,1797 '防止后续开启浏览器时踩坑':755 '限制':3088 '限制无法绕过':1957 '限频':1945 '需':158,163,167 '需代理或海外服务器':149,152 '需建立':1885 '需要':2679,2739 '需要代理时':955 '需要代理的版本':1351 '需要先完成':1900 '需要在':1529 '需要重新执行':1857 '需访问海外':637 '需额外安装':101 '静默崩溃':1497 '非交互式':2583 '页面标题包含':2325 '页面标题应为':2121 '项':115 '项目':2535 '频道':2547 '频道名':2548 '频道状态':2496 '飞书':84,166,210,611 '飞书是国内服务':639 '首次安装未创建必要目录':2691 '首次浏览器操作较慢':1883 '首次连接较慢属正常':1632 '首次连接重试':2843 '驱动':1503 '验证':373,933,1395,2120,2290,2424 '验证中继工作':1298 '验证成功的标志':2324 '验证配置':1581 '验证频道连接':805 '默认':2734,3022 '默认都是':2804","prices":[{"id":"c04d1f7c-9c42-4ef3-af95-38c9b9afbf6e","listingId":"9f5569b7-2b16-4775-b5c3-314dc0a6828d","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"majiayu000","category":"claude-arsenal","install_from":"skills.sh"},"createdAt":"2026-04-18T22:24:16.531Z"}],"sources":[{"listingId":"9f5569b7-2b16-4775-b5c3-314dc0a6828d","source":"github","sourceId":"majiayu000/claude-arsenal/openclaw-deploy","sourceUrl":"https://github.com/majiayu000/claude-arsenal/tree/main/skills/openclaw-deploy","isPrimary":false,"firstSeenAt":"2026-04-18T22:24:16.531Z","lastSeenAt":"2026-05-01T07:01:14.795Z"}],"details":{"listingId":"9f5569b7-2b16-4775-b5c3-314dc0a6828d","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"majiayu000","slug":"openclaw-deploy","github":{"repo":"majiayu000/claude-arsenal","stars":29,"topics":["agent-skills","ai-agents","ai-coding-assistant","automation","claude","claude-code","code-review","developer-tools","devops","productivity","prompt-engineering","python","software-development","typescript","workflows"],"license":"mit","html_url":"https://github.com/majiayu000/claude-arsenal","pushed_at":"2026-04-29T04:12:22Z","description":"52 production-ready Claude Code skills and 7 specialized agents for software development, DevOps, product workflows, and automation.","skill_md_sha":"ee3d3d80afa667f63b1fdf23f3ba53fe22e07041","skill_md_path":"skills/openclaw-deploy/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/majiayu000/claude-arsenal/tree/main/skills/openclaw-deploy"},"layout":"multi","source":"github","category":"claude-arsenal","frontmatter":{"name":"openclaw-deploy","description":"在远程服务器上一键部署 OpenClaw。当用户需要安装 OpenClaw、部署 OpenClaw、配置 OpenClaw 到服务器时使用"},"skills_sh_url":"https://skills.sh/majiayu000/claude-arsenal/openclaw-deploy"},"updatedAt":"2026-05-01T07:01:14.795Z"}}