{
  "schemaVersion": "1.0",
  "item": {
    "slug": "rednote",
    "name": "小红书 - RedNote",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/hi-yu/rednote",
    "canonicalUrl": "https://clawhub.ai/hi-yu/rednote",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "manual_only",
    "downloadUrl": "/downloads/rednote",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=rednote",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "check_env.sh",
      "SKILL.md",
      "scripts/cover.sh",
      "scripts/generate.sh",
      "references/content-guide.md",
      "references/title-guide.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Open the source page and confirm the package flow manually.",
      "Review SKILL.md if you can obtain the files.",
      "Treat this source as manual setup until the download is verified."
    ],
    "agentAssist": {
      "summary": "Use the source page and any available docs to guide the install because the item currently does not return a direct package file.",
      "steps": [
        "Open the source page via Open source listing.",
        "If you can obtain the package, extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the source page and extracted files."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I tried to install a skill package from Yavira, but the item currently does not return a direct package file. Inspect the source page and any extracted docs, then tell me what you can confirm and any manual steps still required."
        },
        {
          "label": "Upgrade existing",
          "body": "I tried to upgrade a skill package from Yavira, but the item currently does not return a direct package file. Compare the source page and any extracted docs with my current installation, then summarize what changed and what manual follow-up I still need."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "slug": "rednote",
      "status": "source_issue",
      "reason": "not_found",
      "recommendedAction": "review_source",
      "checkedAt": "2026-05-12T23:49:35.565Z",
      "expiresAt": "2026-05-13T23:49:35.565Z",
      "httpStatus": 404,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=rednote",
      "contentType": "text/plain",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=rednote",
        "contentDisposition": null,
        "redirectLocation": null,
        "bodySnippet": null,
        "slug": "rednote"
      },
      "scope": "item",
      "summary": "Known item issue.",
      "detail": "This item's current download entry is known to bounce back to a listing or homepage instead of returning a package file.",
      "primaryActionLabel": "Open source listing",
      "primaryActionHref": "https://clawhub.ai/hi-yu/rednote"
    },
    "validation": {
      "installChecklist": [
        "Open the source listing and confirm there is a real package or setup artifact available.",
        "Review SKILL.md before asking your agent to continue.",
        "Treat this source as manual setup until the upstream download flow is fixed."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/rednote",
    "agentPageUrl": "https://openagent3.xyz/skills/rednote/agent",
    "manifestUrl": "https://openagent3.xyz/skills/rednote/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/rednote/agent.md"
  },
  "agentAssist": {
    "summary": "Use the source page and any available docs to guide the install because the item currently does not return a direct package file.",
    "steps": [
      "Open the source page via Open source listing.",
      "If you can obtain the package, extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the source page and extracted files."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I tried to install a skill package from Yavira, but the item currently does not return a direct package file. Inspect the source page and any extracted docs, then tell me what you can confirm and any manual steps still required."
      },
      {
        "label": "Upgrade existing",
        "body": "I tried to upgrade a skill package from Yavira, but the item currently does not return a direct package file. Compare the source page and any extracted docs with my current installation, then summarize what changed and what manual follow-up I still need."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "📕 小红书全能助手",
        "body": "两大核心能力：文案创作（标题+正文+封面图）和 平台操作（发布+搜索+互动）。\n\n文案创作默认使用当前对话的主模型，无需额外配置。"
      },
      {
        "title": "零、查看可用模型（仅当用户询问时）",
        "body": "当用户询问\"有哪些模型\"、\"当前模型\"、\"可用模型\"、\"能用什么模型\"时，读取配置文件展示：\n\n# 查看当前主模型\ncat ~/.openclaw/openclaw.json | jq -r '.agents.defaults.model.primary // .agents.defaults.model // \"未设置\"' 2>/dev/null\n\n# 查看所有可用模型（提供商/模型ID - 名称）\ncat ~/.openclaw/openclaw.json | jq -r '.models.providers | to_entries[] | .key as $p | .value.models[]? | \"\\($p)/\\(.id) - \\(.name)\"' 2>/dev/null"
      },
      {
        "title": "一、文案创作流程",
        "body": "当用户要求写笔记、生成文案、创作小红书内容时，按 标题 → 正文 → 封面图 三步执行，每步需用户确认后再继续。"
      },
      {
        "title": "1.1 生成标题",
        "body": "优先使用当前对话模型直接生成，参考 references/title-guide.md 中的规范生成5个不同风格的标题。\n\n核心要求：每个标题使用不同风格，20字以内，含1-2个emoji，禁用平台禁忌词。\n\n备用方案：如果用户明确配置了 XHS_AI_API_KEY 环境变量并要求使用指定 API，可调用脚本：\n\nbash {baseDir}/scripts/generate.sh title \"内容摘要\"\n\n输出后询问用户：选择哪个标题？可修改或自定义。默认选第一个。"
      },
      {
        "title": "1.2 生成正文",
        "body": "优先使用当前对话模型直接生成，参考 references/content-guide.md 中的规范，根据选定标题生成正文。\n\n核心要求：600-800字，像朋友聊天的语气，禁用列表/编号，用自然段落呈现，文末5-10个#标签。\n\n备用方案：如果用户明确配置了 XHS_AI_API_KEY 环境变量并要求使用指定 API，可调用脚本：\n\nbash {baseDir}/scripts/generate.sh content \"完整内容\" \"选定标题\"\n\n输出后询问用户：是否满意？可要求修改。确认后进入封面图步骤。"
      },
      {
        "title": "1.3 生成封面图",
        "body": "封面图结构：1080x1440（3:4），上半部分为主题图片（1080x720），下半部分为纯色底+标题文字（1080x720）。\n\n1.3.1 询问用户选择封面图片来源\n\n必须先询问用户：\n\n封面图的主题图片，你想怎么来？\n\nAI 自动生成 — 根据文案主题自动生成匹配的图片\n上传自己的图片 — 提供图片路径，我来帮你拼接封面\n\n1.3.2A 用户选择「AI生成」\n\n继续询问 prompt 方式：\n\nAI图片的提示词，你想怎么来？\n\n预设推荐 — 我根据你的文案主题自动生成最佳英文prompt\n自定义提示词 — 你提供想要的画面描述，我来翻译成英文prompt\n\n预设推荐：Agent 参考 references/cover-guide.md 自动生成英文 prompt，展示给用户确认后执行。\n\n自定义提示词：用户描述画面，Agent 翻译/优化为英文 prompt，展示确认后执行。\n\n确认 prompt 后，根据主题从 references/cover-guide.md 配色库选择底色和字色（必须主动搭配，禁止白底黑字）。\n\n生图模型选择策略\n\n优先尝试当前对话使用的模型直接生图（如果当前模型支持图片生成）。Agent 在自己的对话环境中直接调用生图能力：\n\n生成 3:2 比例的主题图片，保存到临时文件（如 /tmp/xhs_ai_img.png）\n然后调用 cover.sh 时传入 __USER_IMAGE__:/tmp/xhs_ai_img.png，跳过脚本内置的 API 调用\n\n如果当前模型不支持生图（生成失败或明确不具备图片生成能力），询问用户：\n\n当前模型不支持图片生成，请选择生图方式：\n\nGoogle Gemini — 需要提供 GEMINI_API_KEY（获取地址）\nOpenAI / OpenAI兼容API — 需要提供 API Key 和 Base URL\n其他方式 — 你来提供图片，我帮你拼接封面\n\n用户选择后，设置对应的环境变量再调用 cover.sh：\n\nGemini：GEMINI_API_KEY=xxx bash cover.sh \"标题\" \"prompt\" ...\nOpenAI兼容：IMG_API_TYPE=openai IMG_API_KEY=xxx IMG_API_BASE=https://api.openai.com/v1 IMG_MODEL=dall-e-3 bash cover.sh \"标题\" \"prompt\" ...\n腾讯云混元生图（AIART）：IMG_API_TYPE=hunyuan HUNYUAN_SECRET_ID=AKID... HUNYUAN_SECRET_KEY=... HUNYUAN_REGION=ap-guangzhou bash cover.sh \"标题\" \"prompt\" ...\n其他方式：用户提供图片路径，走 __USER_IMAGE__ 模式\n\n若用户之前已提供过 API Key（本次会话中），后续生图直接复用，无需重复询问。\n\n直接调用 cover.sh 的命令格式（仅当需要脚本内置 API 生图时）：\n\nbash {baseDir}/scripts/cover.sh \"标题文字\" \"英文prompt\" [输出路径] [底色hex] [字色hex]\n\n1.3.2B 用户选择「上传图片」\n\n用户提供图片路径后，同样搭配底色和字色，执行：\n\nbash {baseDir}/scripts/cover.sh \"标题文字\" \"__USER_IMAGE__:/path/to/image.jpg\" [输出路径] [底色hex] [字色hex]\n\n__USER_IMAGE__: 前缀会跳过 AI 生成，直接用用户图片裁剪拼接。\n\n封面图前置要求\n\nImageMagick（convert 或 magick）、中文字体（fonts-noto-cjk）\n生图 API Key（仅脚本内置 API 生图时需要，当前模型直接生图则不需要）"
      },
      {
        "title": "1.4 文案完成后",
        "body": "询问用户是否要直接发布到小红书。如果要发布，自动进入下方「平台操作」的发布流程。"
      },
      {
        "title": "二、平台操作",
        "body": "当用户要求发帖、搜索、评论等小红书操作时使用。所有命令在云服务器本地执行，MCP 服务运行在 http://localhost:18060/mcp。"
      },
      {
        "title": "2.1 前置检查",
        "body": "每次操作前必须先执行：\n\nbash {baseDir}/check_env.sh\n\n返回码：0 = 正常已登录 → 调用工具；1 = 未安装 → 安装 MCP 服务；2 = 未登录 → 扫码登录流程。"
      },
      {
        "title": "2.2 调用工具",
        "body": "⚠️ 极其重要：小红书 MCP 使用 Streamable HTTP 模式。每次调用都必须：初始化 → 获取 Session ID → 带 Session ID 调用工具。三步在同一个 exec 中执行。\n\nMCP_URL=\"${XHS_MCP_URL:-http://localhost:18060/mcp}\"\n\n# 初始化并获取 Session ID\nSESSION_ID=$(curl -s -D /tmp/xhs_headers -X POST \"$MCP_URL\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{},\"clientInfo\":{\"name\":\"openclaw\",\"version\":\"1.0\"}},\"id\":1}' > /dev/null && grep -i 'Mcp-Session-Id' /tmp/xhs_headers | tr -d '\\r' | awk '{print $2}')\n\n# 确认初始化\ncurl -s -X POST \"$MCP_URL\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Mcp-Session-Id: $SESSION_ID\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"method\":\"notifications/initialized\",\"params\":{}}' > /dev/null\n\n# 调用工具（替换 <工具名> 和 <参数>）\ncurl -s -X POST \"$MCP_URL\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Mcp-Session-Id: $SESSION_ID\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"method\":\"tools/call\",\"params\":{\"name\":\"<工具名>\",\"arguments\":{<参数>}},\"id\":2}'\n\n注意：每次调用都必须重新初始化获取新 Session ID，三步必须在同一个 exec 中顺序执行。"
      },
      {
        "title": "2.3 可用工具",
        "body": "1. check_login_status — 检查登录状态\n\n触发词: \"检查登录\"、\"登录状态\"\n参数: 无\n\n2. get_login_qrcode — 获取登录二维码\n\n触发词: \"获取二维码\"、\"扫码登录\"\n参数: 无\n返回: Base64 图片和超时时间\n\n3. delete_cookies — 重置登录状态\n\n触发词: \"退出登录\"、\"重新登录\"、\"清除登录\"\n参数: 无\n注意: 删除后需要重新扫码登录\n\n4. publish_content — 发布图文内容\n\n触发词: \"发小红书\"、\"发布笔记\"、\"发图文\"\n参数:\n\ntitle: 标题，≤20字（必填）\ncontent: 正文，≤1000字（必填）\nimages: 图片本地绝对路径数组（必填），如 [\"/tmp/food1.jpg\"]\n\n5. publish_with_video — 发布视频内容\n\n触发词: \"发视频\"、\"发布视频笔记\"\n参数:\n\ntitle: 标题（必填）\ncontent: 描述（必填）\nvideo: 视频文件本地绝对路径（必填）\n\n6. search_feeds — 搜索内容\n\n触发词: \"搜索小红书\"、\"找笔记\"、\"搜一下\"\n参数:\n\nkeyword: 搜索关键词（必填）\n\n7. list_feeds — 获取推荐列表\n\n触发词: \"推荐内容\"、\"首页推荐\"\n参数: 无\n\n8. get_feed_detail — 获取帖子详情\n\n触发词: \"看看这个帖子\"、\"帖子详情\"\n参数:\n\nfeed_id: 帖子ID（从搜索/推荐结果获取，必填）\nxsec_token: 安全token（从搜索/推荐结果获取，必填）\nload_all_comments: 是否加载全部评论，默认 false 仅返回前 10 条（可选）\nclick_more_replies: 是否展开二级回复，仅 load_all_comments=true 时生效（可选）\nlimit: 限制加载的一级评论数量，默认 20（可选）\nreply_limit: 跳过回复数过多的评论，默认 10（可选）\nscroll_speed: 滚动速度 slow/normal/fast（可选）\n\n9. like_feed — 点赞/取消点赞\n\n触发词: \"点赞\"、\"取消点赞\"、\"喜欢这个\"\n参数:\n\nfeed_id: 帖子ID（必填）\nxsec_token: 安全token（必填）\nunlike: 是否取消点赞，true=取消，默认 false=点赞（可选）\n\n10. favorite_feed — 收藏/取消收藏\n\n触发词: \"收藏\"、\"取消收藏\"、\"收藏这个\"\n参数:\n\nfeed_id: 帖子ID（必填）\nxsec_token: 安全token（必填）\nunfavorite: 是否取消收藏，true=取消，默认 false=收藏（可选）\n\n11. post_comment_to_feed — 发表评论\n\n触发词: \"评论这个\"、\"发表评论\"\n参数:\n\nfeed_id: 帖子ID（必填）\nxsec_token: 安全token（必填）\ncontent: 评论内容（必填）\n\n12. reply_comment_in_feed — 回复评论\n\n触发词: \"回复评论\"、\"回复这条\"\n参数:\n\nfeed_id: 帖子ID（必填）\nxsec_token: 安全token（必填）\ncontent: 回复内容（必填）\ncomment_id: 目标评论ID，从评论列表获取（可选）\nuser_id: 目标评论用户ID，从评论列表获取（可选）\n\n13. user_profile — 获取用户主页\n\n触发词: \"看看这个博主\"、\"用户主页\"\n参数:\n\nuser_id: 用户ID（必填）\nxsec_token: 安全token（必填）"
      },
      {
        "title": "2.4 使用示例",
        "body": "搜索：\n\nMCP_URL=\"http://localhost:18060/mcp\"\nSESSION_ID=$(curl -s -D /tmp/xhs_headers -X POST \"$MCP_URL\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{},\"clientInfo\":{\"name\":\"openclaw\",\"version\":\"1.0\"}},\"id\":1}' > /dev/null && grep -i 'Mcp-Session-Id' /tmp/xhs_headers | tr -d '\\r' | awk '{print $2}')\ncurl -s -X POST \"$MCP_URL\" -H \"Content-Type: application/json\" -H \"Mcp-Session-Id: $SESSION_ID\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"method\":\"notifications/initialized\",\"params\":{}}' > /dev/null\ncurl -s -X POST \"$MCP_URL\" -H \"Content-Type: application/json\" -H \"Mcp-Session-Id: $SESSION_ID\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"method\":\"tools/call\",\"params\":{\"name\":\"search_feeds\",\"arguments\":{\"keyword\":\"美食探店\"}},\"id\":2}'"
      },
      {
        "title": "三、登录流程",
        "body": "当前置检查返回 2（未登录）时，询问用户选择登录方式：\n\n需要登录小红书，请选择登录方式：\n\n快捷扫码 — 直接获取二维码图片（推荐同城/常用设备）\n截图扫码 — 通过登录工具截屏获取（推荐异地登录，支持短信验证码）\n手动Cookie — 直接粘贴浏览器Cookie字符串（推荐已在浏览器登录的用户）"
      },
      {
        "title": "方式一：快捷扫码（get_login_qrcode）",
        "body": "通过 MCP 工具直接获取二维码 Base64 图片，流程简洁，但不支持输入验证码。异地登录可能触发短信验证，此时需切换为方式二。\n\n步骤 1: 调用 get_login_qrcode 获取二维码\n\nMCP_URL=\"${XHS_MCP_URL:-http://localhost:18060/mcp}\"\nSESSION_ID=$(curl -s -D /tmp/xhs_headers -X POST \"$MCP_URL\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{},\"clientInfo\":{\"name\":\"openclaw\",\"version\":\"1.0\"}},\"id\":1}' > /dev/null && grep -i 'Mcp-Session-Id' /tmp/xhs_headers | tr -d '\\r' | awk '{print $2}')\ncurl -s -X POST \"$MCP_URL\" -H \"Content-Type: application/json\" -H \"Mcp-Session-Id: $SESSION_ID\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"method\":\"notifications/initialized\",\"params\":{}}' > /dev/null\ncurl -s -X POST \"$MCP_URL\" -H \"Content-Type: application/json\" -H \"Mcp-Session-Id: $SESSION_ID\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"method\":\"tools/call\",\"params\":{\"name\":\"get_login_qrcode\",\"arguments\":{}},\"id\":2}'\n\n步骤 2: 将 Base64 转为图片文件\n\n从返回结果中提取 Base64 字符串（去掉 data:image/png;base64, 前缀），保存为图片：\n\n# 假设 BASE64_STR 为提取到的 Base64 内容（不含 data:image/png;base64, 前缀）\necho \"$BASE64_STR\" | base64 -d > /tmp/xhs_qr.png\n\n步骤 3: 发送二维码给用户\n\n步骤 4: 等待扫码并验证\n\n告知用户扫码，扫码后用 check_login_status 工具验证是否登录成功。二维码过期则重新执行步骤 1-3。"
      },
      {
        "title": "方式二：截图扫码（登录工具 + Xvfb 截屏）",
        "body": "通过 GUI 登录工具获取二维码，支持异地登录时输入短信验证码。\n\n步骤 1: 启动登录工具\n\n所有命令必须用 nohup 后台运行，否则会因超时被中断。\n\npkill -f xiaohongshu-login 2>/dev/null\nsleep 1\ncd ~/xiaohongshu-mcp && DISPLAY=:99 nohup ./xiaohongshu-login-linux-amd64 > login.log 2>&1 &\nsleep 5\n\n步骤 2: 截取二维码\n\nDISPLAY=:99 import -window root /tmp/xhs_qr.png\n\n步骤 2.1: 检测截图内是否有二维码\n\nzbarimg -q /tmp/xhs_qr.png\n\n无输出：二维码未加载，等待 5 秒后重新截图\n有输出：二维码已生成，继续发送\n\n步骤 3: 发送二维码给用户\n\n步骤 4: 等待扫码\n\n告知用户\"已发送二维码，请用小红书APP扫码登录\"，等待用户确认。\n\n步骤 4.1: 如提示输入验证码（异地登录常见）\n\nexport DISPLAY=:99\nWIN_ID=$(xdotool search --onlyvisible --name '小红书|xiaohongshu|Xiaohongshu' | head -n1)\nxdotool type --window \"$WIN_ID\" --delay 50 '<CODE>'\nxdotool key --window \"$WIN_ID\" Return\n\n步骤 5: 验证登录并启动 MCP\n\ncat ~/xiaohongshu-mcp/login.log | tail -5\n# 如果显示 \"Login successful\"：\npkill -f xiaohongshu 2>/dev/null\ncd ~/xiaohongshu-mcp && DISPLAY=:99 nohup ./xiaohongshu-mcp-linux-amd64 > mcp.log 2>&1 &\n\n二维码过期\n\n如用户反馈扫码失败，重复步骤 1-3 获取新二维码。"
      },
      {
        "title": "方式三：手动Cookie登录",
        "body": "当用户提供浏览器复制的 Cookie 字符串时，将其转换为 JSON 数组格式并保存到 ~/xiaohongshu-mcp/cookies.json。\n\n步骤 1: 接收用户的 Cookie 字符串\n\n用户会提供类似这样的字符串（从浏览器开发者工具复制）：\n\na1=19c464ed2df...; webId=807ede65b...; web_session=040069b4...; xsecappid=xhs-pc-web\n\n步骤 2: 转换并保存\n\n将用户提供的 Cookie 字符串按 ; 分割每个键值对，转换为如下 JSON 数组格式，保存到 ~/xiaohongshu-mcp/cookies.json：\n\npython3 -c \"\nimport json, sys\n\ncookie_str = sys.argv[1].strip()\ncookies = []\nfor pair in cookie_str.split(';'):\n    pair = pair.strip()\n    if '=' not in pair:\n        continue\n    name, value = pair.split('=', 1)\n    cookies.append({\n        'name': name.strip(),\n        'value': value.strip(),\n        'domain': '.xiaohongshu.com',\n        'path': '/',\n        'expires': -1,\n        'httpOnly': name.strip() in ('web_session', 'id_token', 'acw_tc'),\n        'secure': name.strip() in ('web_session', 'id_token'),\n        'session': False,\n        'priority': 'Medium',\n        'sameParty': False,\n        'sourceScheme': 'Secure',\n        'sourcePort': 443\n    })\n\nwith open('$HOME/xiaohongshu-mcp/cookies.json', 'w') as f:\n    json.dump(cookies, f, ensure_ascii=False)\nprint(f'✅ 已保存 {len(cookies)} 个 Cookie 到 cookies.json')\n\" \"用户提供的cookie字符串\"\n\n步骤 3: 重启 MCP 服务使 Cookie 生效\n\npkill -f xiaohongshu-mcp-linux 2>/dev/null\nsleep 1\ncd ~/xiaohongshu-mcp && DISPLAY=:99 nohup ./xiaohongshu-mcp-linux-amd64 > mcp.log 2>&1 &\nsleep 3\n\n步骤 4: 验证登录状态\n\n用 check_login_status 工具验证是否登录成功。如果失败，提示用户 Cookie 可能已过期，建议重新从浏览器获取或改用扫码登录。\n\n注意事项：\n\nCookie 中最关键的字段是 web_session 和 a1，缺少这两个会导致登录失败\n浏览器登录状态和 MCP 登录状态会互相覆盖，导入后建议不要在浏览器再登录同一账号"
      },
      {
        "title": "四、安装 MCP 服务（仅首次）",
        "body": "当前置检查返回 1 时执行。"
      },
      {
        "title": "确认系统环境",
        "body": "hostnamectl\n\n根据 Operating System 确定包管理器（apt/yum/dnf），根据 Architecture 确定二进制版本（x86_64=amd64, aarch64=arm64）。"
      },
      {
        "title": "安装依赖",
        "body": "# Ubuntu/Debian\nsudo apt update && sudo apt install -y xvfb imagemagick zbar-tools xdotool fonts-noto-cjk\n\n# CentOS/RHEL\nsudo yum install -y xorg-x11-server-Xvfb ImageMagick zbar xdotool"
      },
      {
        "title": "启动虚拟显示",
        "body": "# 快速启动\nXvfb :99 -screen 0 1920x1080x24 &\n\n# 或 systemd 服务（推荐，开机自启）\ncat > /etc/systemd/system/xvfb.service << 'EOF'\n[Unit]\nDescription=X Virtual Frame Buffer\nAfter=network.target\n\n[Service]\nExecStart=/usr/bin/Xvfb :99 -screen 0 1920x1080x24\nRestart=always\n\n[Install]\nWantedBy=multi-user.target\nEOF\n\nsudo systemctl enable xvfb && sudo systemctl start xvfb"
      },
      {
        "title": "下载 MCP 服务",
        "body": "项目地址：https://github.com/xpzouying/xiaohongshu-mcp/releases\n\nmkdir -p ~/xiaohongshu-mcp && cd ~/xiaohongshu-mcp\n\n# 根据架构选择（云服务器通常是 x86_64 = amd64）\nARCH=\"amd64\"  # 如果是 ARM 服务器改为 arm64\nwget https://github.com/xpzouying/xiaohongshu-mcp/releases/latest/download/xiaohongshu-mcp-linux-${ARCH}.tar.gz\ntar xzf xiaohongshu-mcp-linux-${ARCH}.tar.gz\nchmod +x xiaohongshu-*"
      },
      {
        "title": "启动 MCP 服务",
        "body": "推荐使用 systemd 守护（崩溃自动重启 + 开机自启）：\n\ncat > /etc/systemd/system/xhs-mcp.service << 'EOF'\n[Unit]\nDescription=Xiaohongshu MCP Service\nAfter=network.target xvfb.service\nRequires=xvfb.service\n\n[Service]\nEnvironment=DISPLAY=:99\nWorkingDirectory=/root/xiaohongshu-mcp\nExecStart=/root/xiaohongshu-mcp/xiaohongshu-mcp-linux-amd64\nRestart=always\nRestartSec=5\n\n[Install]\nWantedBy=multi-user.target\nEOF\n\nsudo systemctl daemon-reload\nsudo systemctl enable xhs-mcp && sudo systemctl start xhs-mcp\nsystemctl status xhs-mcp\n\n或手动启动（不推荐，进程退出不会自动恢复）：\n\ncd ~/xiaohongshu-mcp\nDISPLAY=:99 nohup ./xiaohongshu-mcp-linux-amd64 > mcp.log 2>&1 &\nsleep 3\npgrep -f xiaohongshu-mcp && echo \"✅ 启动成功\" || echo \"❌ 启动失败，查看 mcp.log\"\n\n安装完成后，回到登录流程完成首次登录。"
      },
      {
        "title": "五、响应处理",
        "body": "成功：解析 result.content[0].text 获取数据。\n错误：\n\nNot logged in: 未登录，走扫码流程\nSession expired: 会话过期，重新登录\nRate limited: 频率限制，稍后重试"
      },
      {
        "title": "六、注意事项",
        "body": "标题不超过 20 字，正文不超过 1000 字\n图片/视频必须使用服务器上的本地绝对路径\n小红书不支持多设备同时登录，登录后不要在浏览器再登录\n评论间隔建议 > 30 秒，避免频率限制\n所有带 GUI 的进程（login、mcp）必须用 nohup 后台运行，否则会被 exec 超时中断"
      },
      {
        "title": "七、故障排查",
        "body": "# MCP 服务是否运行\npgrep -f xiaohongshu-mcp-linux\n\n# Xvfb 是否运行\npgrep -x Xvfb\n\n# 查看 MCP 日志\ntail -20 ~/xiaohongshu-mcp/mcp.log\n\n# 查看登录日志\ntail -20 ~/xiaohongshu-mcp/login.log\n\n# 检查端口\nlsof -i :18060"
      }
    ],
    "body": "📕 小红书全能助手\n\n两大核心能力：文案创作（标题+正文+封面图）和 平台操作（发布+搜索+互动）。\n\n文案创作默认使用当前对话的主模型，无需额外配置。\n\n零、查看可用模型（仅当用户询问时）\n\n当用户询问\"有哪些模型\"、\"当前模型\"、\"可用模型\"、\"能用什么模型\"时，读取配置文件展示：\n\n# 查看当前主模型\ncat ~/.openclaw/openclaw.json | jq -r '.agents.defaults.model.primary // .agents.defaults.model // \"未设置\"' 2>/dev/null\n\n# 查看所有可用模型（提供商/模型ID - 名称）\ncat ~/.openclaw/openclaw.json | jq -r '.models.providers | to_entries[] | .key as $p | .value.models[]? | \"\\($p)/\\(.id) - \\(.name)\"' 2>/dev/null\n\n一、文案创作流程\n\n当用户要求写笔记、生成文案、创作小红书内容时，按 标题 → 正文 → 封面图 三步执行，每步需用户确认后再继续。\n\n1.1 生成标题\n\n优先使用当前对话模型直接生成，参考 references/title-guide.md 中的规范生成5个不同风格的标题。\n\n核心要求：每个标题使用不同风格，20字以内，含1-2个emoji，禁用平台禁忌词。\n\n备用方案：如果用户明确配置了 XHS_AI_API_KEY 环境变量并要求使用指定 API，可调用脚本：\n\nbash {baseDir}/scripts/generate.sh title \"内容摘要\"\n\n\n输出后询问用户：选择哪个标题？可修改或自定义。默认选第一个。\n\n1.2 生成正文\n\n优先使用当前对话模型直接生成，参考 references/content-guide.md 中的规范，根据选定标题生成正文。\n\n核心要求：600-800字，像朋友聊天的语气，禁用列表/编号，用自然段落呈现，文末5-10个#标签。\n\n备用方案：如果用户明确配置了 XHS_AI_API_KEY 环境变量并要求使用指定 API，可调用脚本：\n\nbash {baseDir}/scripts/generate.sh content \"完整内容\" \"选定标题\"\n\n\n输出后询问用户：是否满意？可要求修改。确认后进入封面图步骤。\n\n1.3 生成封面图\n\n封面图结构：1080x1440（3:4），上半部分为主题图片（1080x720），下半部分为纯色底+标题文字（1080x720）。\n\n1.3.1 询问用户选择封面图片来源\n\n必须先询问用户：\n\n封面图的主题图片，你想怎么来？\n\nAI 自动生成 — 根据文案主题自动生成匹配的图片\n上传自己的图片 — 提供图片路径，我来帮你拼接封面\n1.3.2A 用户选择「AI生成」\n\n继续询问 prompt 方式：\n\nAI图片的提示词，你想怎么来？\n\n预设推荐 — 我根据你的文案主题自动生成最佳英文prompt\n自定义提示词 — 你提供想要的画面描述，我来翻译成英文prompt\n\n预设推荐：Agent 参考 references/cover-guide.md 自动生成英文 prompt，展示给用户确认后执行。\n\n自定义提示词：用户描述画面，Agent 翻译/优化为英文 prompt，展示确认后执行。\n\n确认 prompt 后，根据主题从 references/cover-guide.md 配色库选择底色和字色（必须主动搭配，禁止白底黑字）。\n\n生图模型选择策略\n\n优先尝试当前对话使用的模型直接生图（如果当前模型支持图片生成）。Agent 在自己的对话环境中直接调用生图能力：\n\n生成 3:2 比例的主题图片，保存到临时文件（如 /tmp/xhs_ai_img.png）\n然后调用 cover.sh 时传入 __USER_IMAGE__:/tmp/xhs_ai_img.png，跳过脚本内置的 API 调用\n\n如果当前模型不支持生图（生成失败或明确不具备图片生成能力），询问用户：\n\n当前模型不支持图片生成，请选择生图方式：\n\nGoogle Gemini — 需要提供 GEMINI_API_KEY（获取地址）\nOpenAI / OpenAI兼容API — 需要提供 API Key 和 Base URL\n其他方式 — 你来提供图片，我帮你拼接封面\n\n用户选择后，设置对应的环境变量再调用 cover.sh：\n\nGemini：GEMINI_API_KEY=xxx bash cover.sh \"标题\" \"prompt\" ...\nOpenAI兼容：IMG_API_TYPE=openai IMG_API_KEY=xxx IMG_API_BASE=https://api.openai.com/v1 IMG_MODEL=dall-e-3 bash cover.sh \"标题\" \"prompt\" ...\n腾讯云混元生图（AIART）：IMG_API_TYPE=hunyuan HUNYUAN_SECRET_ID=AKID... HUNYUAN_SECRET_KEY=... HUNYUAN_REGION=ap-guangzhou bash cover.sh \"标题\" \"prompt\" ...\n其他方式：用户提供图片路径，走 __USER_IMAGE__ 模式\n\n若用户之前已提供过 API Key（本次会话中），后续生图直接复用，无需重复询问。\n\n直接调用 cover.sh 的命令格式（仅当需要脚本内置 API 生图时）：\n\nbash {baseDir}/scripts/cover.sh \"标题文字\" \"英文prompt\" [输出路径] [底色hex] [字色hex]\n\n1.3.2B 用户选择「上传图片」\n\n用户提供图片路径后，同样搭配底色和字色，执行：\n\nbash {baseDir}/scripts/cover.sh \"标题文字\" \"__USER_IMAGE__:/path/to/image.jpg\" [输出路径] [底色hex] [字色hex]\n\n\n__USER_IMAGE__: 前缀会跳过 AI 生成，直接用用户图片裁剪拼接。\n\n封面图前置要求\nImageMagick（convert 或 magick）、中文字体（fonts-noto-cjk）\n生图 API Key（仅脚本内置 API 生图时需要，当前模型直接生图则不需要）\n1.4 文案完成后\n\n询问用户是否要直接发布到小红书。如果要发布，自动进入下方「平台操作」的发布流程。\n\n二、平台操作\n\n当用户要求发帖、搜索、评论等小红书操作时使用。所有命令在云服务器本地执行，MCP 服务运行在 http://localhost:18060/mcp。\n\n2.1 前置检查\n\n每次操作前必须先执行：\n\nbash {baseDir}/check_env.sh\n\n\n返回码：0 = 正常已登录 → 调用工具；1 = 未安装 → 安装 MCP 服务；2 = 未登录 → 扫码登录流程。\n\n2.2 调用工具\n\n⚠️ 极其重要：小红书 MCP 使用 Streamable HTTP 模式。每次调用都必须：初始化 → 获取 Session ID → 带 Session ID 调用工具。三步在同一个 exec 中执行。\n\nMCP_URL=\"${XHS_MCP_URL:-http://localhost:18060/mcp}\"\n\n# 初始化并获取 Session ID\nSESSION_ID=$(curl -s -D /tmp/xhs_headers -X POST \"$MCP_URL\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{},\"clientInfo\":{\"name\":\"openclaw\",\"version\":\"1.0\"}},\"id\":1}' > /dev/null && grep -i 'Mcp-Session-Id' /tmp/xhs_headers | tr -d '\\r' | awk '{print $2}')\n\n# 确认初始化\ncurl -s -X POST \"$MCP_URL\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Mcp-Session-Id: $SESSION_ID\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"method\":\"notifications/initialized\",\"params\":{}}' > /dev/null\n\n# 调用工具（替换 <工具名> 和 <参数>）\ncurl -s -X POST \"$MCP_URL\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Mcp-Session-Id: $SESSION_ID\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"method\":\"tools/call\",\"params\":{\"name\":\"<工具名>\",\"arguments\":{<参数>}},\"id\":2}'\n\n\n注意：每次调用都必须重新初始化获取新 Session ID，三步必须在同一个 exec 中顺序执行。\n\n2.3 可用工具\n1. check_login_status — 检查登录状态\n触发词: \"检查登录\"、\"登录状态\"\n参数: 无\n2. get_login_qrcode — 获取登录二维码\n触发词: \"获取二维码\"、\"扫码登录\"\n参数: 无\n返回: Base64 图片和超时时间\n3. delete_cookies — 重置登录状态\n触发词: \"退出登录\"、\"重新登录\"、\"清除登录\"\n参数: 无\n注意: 删除后需要重新扫码登录\n4. publish_content — 发布图文内容\n触发词: \"发小红书\"、\"发布笔记\"、\"发图文\"\n参数:\ntitle: 标题，≤20字（必填）\ncontent: 正文，≤1000字（必填）\nimages: 图片本地绝对路径数组（必填），如 [\"/tmp/food1.jpg\"]\n5. publish_with_video — 发布视频内容\n触发词: \"发视频\"、\"发布视频笔记\"\n参数:\ntitle: 标题（必填）\ncontent: 描述（必填）\nvideo: 视频文件本地绝对路径（必填）\n6. search_feeds — 搜索内容\n触发词: \"搜索小红书\"、\"找笔记\"、\"搜一下\"\n参数:\nkeyword: 搜索关键词（必填）\n7. list_feeds — 获取推荐列表\n触发词: \"推荐内容\"、\"首页推荐\"\n参数: 无\n8. get_feed_detail — 获取帖子详情\n触发词: \"看看这个帖子\"、\"帖子详情\"\n参数:\nfeed_id: 帖子ID（从搜索/推荐结果获取，必填）\nxsec_token: 安全token（从搜索/推荐结果获取，必填）\nload_all_comments: 是否加载全部评论，默认 false 仅返回前 10 条（可选）\nclick_more_replies: 是否展开二级回复，仅 load_all_comments=true 时生效（可选）\nlimit: 限制加载的一级评论数量，默认 20（可选）\nreply_limit: 跳过回复数过多的评论，默认 10（可选）\nscroll_speed: 滚动速度 slow/normal/fast（可选）\n9. like_feed — 点赞/取消点赞\n触发词: \"点赞\"、\"取消点赞\"、\"喜欢这个\"\n参数:\nfeed_id: 帖子ID（必填）\nxsec_token: 安全token（必填）\nunlike: 是否取消点赞，true=取消，默认 false=点赞（可选）\n10. favorite_feed — 收藏/取消收藏\n触发词: \"收藏\"、\"取消收藏\"、\"收藏这个\"\n参数:\nfeed_id: 帖子ID（必填）\nxsec_token: 安全token（必填）\nunfavorite: 是否取消收藏，true=取消，默认 false=收藏（可选）\n11. post_comment_to_feed — 发表评论\n触发词: \"评论这个\"、\"发表评论\"\n参数:\nfeed_id: 帖子ID（必填）\nxsec_token: 安全token（必填）\ncontent: 评论内容（必填）\n12. reply_comment_in_feed — 回复评论\n触发词: \"回复评论\"、\"回复这条\"\n参数:\nfeed_id: 帖子ID（必填）\nxsec_token: 安全token（必填）\ncontent: 回复内容（必填）\ncomment_id: 目标评论ID，从评论列表获取（可选）\nuser_id: 目标评论用户ID，从评论列表获取（可选）\n13. user_profile — 获取用户主页\n触发词: \"看看这个博主\"、\"用户主页\"\n参数:\nuser_id: 用户ID（必填）\nxsec_token: 安全token（必填）\n2.4 使用示例\n\n搜索：\n\nMCP_URL=\"http://localhost:18060/mcp\"\nSESSION_ID=$(curl -s -D /tmp/xhs_headers -X POST \"$MCP_URL\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{},\"clientInfo\":{\"name\":\"openclaw\",\"version\":\"1.0\"}},\"id\":1}' > /dev/null && grep -i 'Mcp-Session-Id' /tmp/xhs_headers | tr -d '\\r' | awk '{print $2}')\ncurl -s -X POST \"$MCP_URL\" -H \"Content-Type: application/json\" -H \"Mcp-Session-Id: $SESSION_ID\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"method\":\"notifications/initialized\",\"params\":{}}' > /dev/null\ncurl -s -X POST \"$MCP_URL\" -H \"Content-Type: application/json\" -H \"Mcp-Session-Id: $SESSION_ID\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"method\":\"tools/call\",\"params\":{\"name\":\"search_feeds\",\"arguments\":{\"keyword\":\"美食探店\"}},\"id\":2}'\n\n三、登录流程\n\n当前置检查返回 2（未登录）时，询问用户选择登录方式：\n\n需要登录小红书，请选择登录方式：\n\n快捷扫码 — 直接获取二维码图片（推荐同城/常用设备）\n截图扫码 — 通过登录工具截屏获取（推荐异地登录，支持短信验证码）\n手动Cookie — 直接粘贴浏览器Cookie字符串（推荐已在浏览器登录的用户）\n方式一：快捷扫码（get_login_qrcode）\n\n通过 MCP 工具直接获取二维码 Base64 图片，流程简洁，但不支持输入验证码。异地登录可能触发短信验证，此时需切换为方式二。\n\n步骤 1: 调用 get_login_qrcode 获取二维码\nMCP_URL=\"${XHS_MCP_URL:-http://localhost:18060/mcp}\"\nSESSION_ID=$(curl -s -D /tmp/xhs_headers -X POST \"$MCP_URL\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{},\"clientInfo\":{\"name\":\"openclaw\",\"version\":\"1.0\"}},\"id\":1}' > /dev/null && grep -i 'Mcp-Session-Id' /tmp/xhs_headers | tr -d '\\r' | awk '{print $2}')\ncurl -s -X POST \"$MCP_URL\" -H \"Content-Type: application/json\" -H \"Mcp-Session-Id: $SESSION_ID\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"method\":\"notifications/initialized\",\"params\":{}}' > /dev/null\ncurl -s -X POST \"$MCP_URL\" -H \"Content-Type: application/json\" -H \"Mcp-Session-Id: $SESSION_ID\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"method\":\"tools/call\",\"params\":{\"name\":\"get_login_qrcode\",\"arguments\":{}},\"id\":2}'\n\n步骤 2: 将 Base64 转为图片文件\n\n从返回结果中提取 Base64 字符串（去掉 data:image/png;base64, 前缀），保存为图片：\n\n# 假设 BASE64_STR 为提取到的 Base64 内容（不含 data:image/png;base64, 前缀）\necho \"$BASE64_STR\" | base64 -d > /tmp/xhs_qr.png\n\n步骤 3: 发送二维码给用户\n步骤 4: 等待扫码并验证\n\n告知用户扫码，扫码后用 check_login_status 工具验证是否登录成功。二维码过期则重新执行步骤 1-3。\n\n方式二：截图扫码（登录工具 + Xvfb 截屏）\n\n通过 GUI 登录工具获取二维码，支持异地登录时输入短信验证码。\n\n步骤 1: 启动登录工具\n\n所有命令必须用 nohup 后台运行，否则会因超时被中断。\n\npkill -f xiaohongshu-login 2>/dev/null\nsleep 1\ncd ~/xiaohongshu-mcp && DISPLAY=:99 nohup ./xiaohongshu-login-linux-amd64 > login.log 2>&1 &\nsleep 5\n\n步骤 2: 截取二维码\nDISPLAY=:99 import -window root /tmp/xhs_qr.png\n\n步骤 2.1: 检测截图内是否有二维码\nzbarimg -q /tmp/xhs_qr.png\n\n无输出：二维码未加载，等待 5 秒后重新截图\n有输出：二维码已生成，继续发送\n步骤 3: 发送二维码给用户\n步骤 4: 等待扫码\n\n告知用户\"已发送二维码，请用小红书APP扫码登录\"，等待用户确认。\n\n步骤 4.1: 如提示输入验证码（异地登录常见）\nexport DISPLAY=:99\nWIN_ID=$(xdotool search --onlyvisible --name '小红书|xiaohongshu|Xiaohongshu' | head -n1)\nxdotool type --window \"$WIN_ID\" --delay 50 '<CODE>'\nxdotool key --window \"$WIN_ID\" Return\n\n步骤 5: 验证登录并启动 MCP\ncat ~/xiaohongshu-mcp/login.log | tail -5\n# 如果显示 \"Login successful\"：\npkill -f xiaohongshu 2>/dev/null\ncd ~/xiaohongshu-mcp && DISPLAY=:99 nohup ./xiaohongshu-mcp-linux-amd64 > mcp.log 2>&1 &\n\n二维码过期\n\n如用户反馈扫码失败，重复步骤 1-3 获取新二维码。\n\n方式三：手动Cookie登录\n\n当用户提供浏览器复制的 Cookie 字符串时，将其转换为 JSON 数组格式并保存到 ~/xiaohongshu-mcp/cookies.json。\n\n步骤 1: 接收用户的 Cookie 字符串\n\n用户会提供类似这样的字符串（从浏览器开发者工具复制）：\n\na1=19c464ed2df...; webId=807ede65b...; web_session=040069b4...; xsecappid=xhs-pc-web\n\n步骤 2: 转换并保存\n\n将用户提供的 Cookie 字符串按 ; 分割每个键值对，转换为如下 JSON 数组格式，保存到 ~/xiaohongshu-mcp/cookies.json：\n\npython3 -c \"\nimport json, sys\n\ncookie_str = sys.argv[1].strip()\ncookies = []\nfor pair in cookie_str.split(';'):\n    pair = pair.strip()\n    if '=' not in pair:\n        continue\n    name, value = pair.split('=', 1)\n    cookies.append({\n        'name': name.strip(),\n        'value': value.strip(),\n        'domain': '.xiaohongshu.com',\n        'path': '/',\n        'expires': -1,\n        'httpOnly': name.strip() in ('web_session', 'id_token', 'acw_tc'),\n        'secure': name.strip() in ('web_session', 'id_token'),\n        'session': False,\n        'priority': 'Medium',\n        'sameParty': False,\n        'sourceScheme': 'Secure',\n        'sourcePort': 443\n    })\n\nwith open('$HOME/xiaohongshu-mcp/cookies.json', 'w') as f:\n    json.dump(cookies, f, ensure_ascii=False)\nprint(f'✅ 已保存 {len(cookies)} 个 Cookie 到 cookies.json')\n\" \"用户提供的cookie字符串\"\n\n步骤 3: 重启 MCP 服务使 Cookie 生效\npkill -f xiaohongshu-mcp-linux 2>/dev/null\nsleep 1\ncd ~/xiaohongshu-mcp && DISPLAY=:99 nohup ./xiaohongshu-mcp-linux-amd64 > mcp.log 2>&1 &\nsleep 3\n\n步骤 4: 验证登录状态\n\n用 check_login_status 工具验证是否登录成功。如果失败，提示用户 Cookie 可能已过期，建议重新从浏览器获取或改用扫码登录。\n\n注意事项：\n\nCookie 中最关键的字段是 web_session 和 a1，缺少这两个会导致登录失败\n浏览器登录状态和 MCP 登录状态会互相覆盖，导入后建议不要在浏览器再登录同一账号\n四、安装 MCP 服务（仅首次）\n\n当前置检查返回 1 时执行。\n\n确认系统环境\nhostnamectl\n\n\n根据 Operating System 确定包管理器（apt/yum/dnf），根据 Architecture 确定二进制版本（x86_64=amd64, aarch64=arm64）。\n\n安装依赖\n# Ubuntu/Debian\nsudo apt update && sudo apt install -y xvfb imagemagick zbar-tools xdotool fonts-noto-cjk\n\n# CentOS/RHEL\nsudo yum install -y xorg-x11-server-Xvfb ImageMagick zbar xdotool\n\n启动虚拟显示\n# 快速启动\nXvfb :99 -screen 0 1920x1080x24 &\n\n# 或 systemd 服务（推荐，开机自启）\ncat > /etc/systemd/system/xvfb.service << 'EOF'\n[Unit]\nDescription=X Virtual Frame Buffer\nAfter=network.target\n\n[Service]\nExecStart=/usr/bin/Xvfb :99 -screen 0 1920x1080x24\nRestart=always\n\n[Install]\nWantedBy=multi-user.target\nEOF\n\nsudo systemctl enable xvfb && sudo systemctl start xvfb\n\n下载 MCP 服务\n\n项目地址：https://github.com/xpzouying/xiaohongshu-mcp/releases\n\nmkdir -p ~/xiaohongshu-mcp && cd ~/xiaohongshu-mcp\n\n# 根据架构选择（云服务器通常是 x86_64 = amd64）\nARCH=\"amd64\"  # 如果是 ARM 服务器改为 arm64\nwget https://github.com/xpzouying/xiaohongshu-mcp/releases/latest/download/xiaohongshu-mcp-linux-${ARCH}.tar.gz\ntar xzf xiaohongshu-mcp-linux-${ARCH}.tar.gz\nchmod +x xiaohongshu-*\n\n启动 MCP 服务\n\n推荐使用 systemd 守护（崩溃自动重启 + 开机自启）：\n\ncat > /etc/systemd/system/xhs-mcp.service << 'EOF'\n[Unit]\nDescription=Xiaohongshu MCP Service\nAfter=network.target xvfb.service\nRequires=xvfb.service\n\n[Service]\nEnvironment=DISPLAY=:99\nWorkingDirectory=/root/xiaohongshu-mcp\nExecStart=/root/xiaohongshu-mcp/xiaohongshu-mcp-linux-amd64\nRestart=always\nRestartSec=5\n\n[Install]\nWantedBy=multi-user.target\nEOF\n\nsudo systemctl daemon-reload\nsudo systemctl enable xhs-mcp && sudo systemctl start xhs-mcp\nsystemctl status xhs-mcp\n\n\n或手动启动（不推荐，进程退出不会自动恢复）：\n\ncd ~/xiaohongshu-mcp\nDISPLAY=:99 nohup ./xiaohongshu-mcp-linux-amd64 > mcp.log 2>&1 &\nsleep 3\npgrep -f xiaohongshu-mcp && echo \"✅ 启动成功\" || echo \"❌ 启动失败，查看 mcp.log\"\n\n\n安装完成后，回到登录流程完成首次登录。\n\n五、响应处理\n\n成功：解析 result.content[0].text 获取数据。 错误：\n\nNot logged in: 未登录，走扫码流程\nSession expired: 会话过期，重新登录\nRate limited: 频率限制，稍后重试\n六、注意事项\n标题不超过 20 字，正文不超过 1000 字\n图片/视频必须使用服务器上的本地绝对路径\n小红书不支持多设备同时登录，登录后不要在浏览器再登录\n评论间隔建议 > 30 秒，避免频率限制\n所有带 GUI 的进程（login、mcp）必须用 nohup 后台运行，否则会被 exec 超时中断\n七、故障排查\n# MCP 服务是否运行\npgrep -f xiaohongshu-mcp-linux\n\n# Xvfb 是否运行\npgrep -x Xvfb\n\n# 查看 MCP 日志\ntail -20 ~/xiaohongshu-mcp/mcp.log\n\n# 查看登录日志\ntail -20 ~/xiaohongshu-mcp/login.log\n\n# 检查端口\nlsof -i :18060"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/hi-yu/rednote",
    "publisherUrl": "https://clawhub.ai/hi-yu/rednote",
    "owner": "hi-yu",
    "version": "1.2.4",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/rednote",
    "downloadUrl": "https://openagent3.xyz/downloads/rednote",
    "agentUrl": "https://openagent3.xyz/skills/rednote/agent",
    "manifestUrl": "https://openagent3.xyz/skills/rednote/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/rednote/agent.md"
  }
}