1. 07 Mar, 2026 17 commits
    • Angiin authored
    • Angiin authored
    • Angiin authored
    • - account_manager: 每个命名账号自动分配独立端口(9223+),新增
        get_account_port()、公开 get_profile_dir()、update_account_description()
      - cli: 新增 _resolve_account(),connect 函数按账号切换端口和 Chrome Profile;
        tab 文件按端口隔离(session_tab_<port>.txt / login_tab_<port>.txt);
        新增 add-account / list-accounts / remove-account / set-default-account 4 个子命令;
        登录成功后自动读取平台昵称写入账号描述
      - xhs/login: 新增 get_current_user_nickname(),从首页导航栏读取昵称
      - 5 个 SKILL.md: 统一添加账号选择前置步骤(0/1 账号免选,多账号必选)
      - CLAUDE.md: CLI 子命令表追加 4 个账号管理命令
      Angiin authored
    • Angiin authored
    • - 选择器从 .qrcode.force-light 改为 img.qrcode-img(实际二维码元素)
      - 不再使用 CDP 截图,直接读取 img.src 的 base64 数据,避免渲染时机问题
      - 在浏览器端用 Canvas 添加 16px 白边,零依赖
      - screenshot_element 改用 DOM.getBoxModel 获取坐标,修复 position:fixed
        遮罩层内元素用 getBoundingClientRect + pageOffset 截到背景的问题
      Angiin authored
    • - 从 153 行精简到 72 行
      - 删除逐文件项目结构树(Claude 可自行读取)
      - 删除标准 Python 命名约定和 PEP 8(默认已知)
      - 删除技术栈列表(可从 pyproject.toml 推断)
      - 删除已移除的 PROMPT.md 引用
      - 新增 Git 工作流规范(禁止直接推送 main)
      
      Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
      zy authored
    • P0 增强任务已全部完成,该文件不再需要。
      
      Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
      zy authored
    • 添加 workflow_dispatch 触发器,支持在 GitHub Actions 页面手动触发发版。
      
      Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
      zy authored
    • push 到 main 时自动创建 Release,附带源码 tar.gz/zip 产物。
      排除文档/配置类文件变更触发,防止无意义发版。
      
      Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
      zy authored
    • 添加 version、metadata.openclaw(requires.bins、emoji、os)等字段,
      满足 ClawHub 技能注册表的发布要求。
      
      Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
      zy authored
    • add GitHub Star Trend in readme.md
      Angiin authored
    • - cli.py: 引入 _SESSION_TAB_FILE 机制,_connect() 优先复用上次命令
        留下的 tab,彻底解决多命令流程中 tab 不断堆积的问题
      - cli.py: cmd_check_login 不再关闭页面,tab 保持存活供下次复用
      - cli.py: delete-cookies 退出登录时清除会话 tab 记录
      - cdp.py: 新增 get_or_create_page()(复用空白 tab)、
        _setup_page() 辅助方法、get_page_by_target_id()、get_existing_page()
      - title_utils.py: 新增 truncate_title() 工具函数
      - 所有 SKILL.md: 添加技能边界约束,防止 AI 记忆中的其他项目
        (如 xiaohongshu-mcp)干扰执行
      - xhs-publish/SKILL.md: 新增图片 URL 直传规则(禁止手动下载)、
        save-draft 取消流程、标题长度计算说明与重新生成要求
      Angiin authored
    • 之前验证码登录偶尔失败,是因为发送验证码和提交验证码时
      连接的可能不是同一个标签页,导致小红书认为验证码无效。
      
      现在发送验证码后会记录当前标签页的 ID,提交验证码时直接
      连回这个标签页,不再靠猜。扫二维码等待登录也做了同样处理。
      Angiin authored
    • - 登录时不再只给文件路径,二维码图片会直接显示在对话里,扫一下就能登录
      - 服务器无界面环境下同样支持扫码登录,扫对话里的图片即可
      - 无界面服务器也可选择手机验证码登录,两种方式都支持
      - 有桌面的设备会同时弹出浏览器窗口,浏览器和对话里的二维码都能扫
      - 扫码后自动等待登录完成,不再需要反复查询登录状态
      - 二维码图片自带白色边框,更容易被手机识别
      Angiin authored
    • - 新增 get-qrcode 子命令:非阻塞获取二维码,立即返回路径
      - save_qrcode_to_file 支持 data URL 和网络 URL 两种格式
      - 输出 qrcode_data_url 供 Skill 直接内嵌 Markdown 图片
      - 新增 _add_png_border:纯 stdlib 给 PNG 添加 16px 白色边框
        支持 Grayscale/RGB/Grayscale+Alpha/RGBA,全 filter 类型解码
      - check-login 非 GUI 环境返回 login_method: both,支持二维码或手机验证码二选一
      - xhs-auth SKILL.md:GUI 走 login(阻塞),无界面走 get-qrcode + data_url 内嵌显示
      Angiin authored
    • 更正 readme.md 里的项目 clone 地址
      Angiin authored
  2. 06 Mar, 2026 1 commit
    • 在无桌面 Linux 服务器上使用手机验证码登录时,多处 Chrome 启动/重启
      调用默认使用有头模式(headless=False),导致 Chrome 在无 DISPLAY 环境
      中无法启动。chrome_launcher.py 已有 has_display() 检测函数,但调用处
      未使用。
      
      修复点:
      - _connect() / _connect_existing():ensure_chrome 改为传递
        headless=not has_display(),所有子命令统一受益
      - cmd_send_code RateLimitError 重启:restart_chrome 改为传递
        headless=not has_display(),避免重启时切换为有头模式
      - _headless_fallback():加入 has_display() 判断,无桌面时不再
        尝试重启 Chrome,改为返回明确错误提示引导用户使用 send-code
      
      新增 scripts/test_headless_login.py,包含 7 个单元测试,通过 mock
      has_display() 在 Windows 环境中模拟 Linux 无桌面场景,覆盖三处修复
      的正反两个方向,确保桌面用户行为不受影响。
      
      同步更新 skills/xhs-auth/SKILL.md,在手机登录两步流程前加入强制交互
      说明,要求 Claude 必须先向用户询问手机号/验证码再执行命令,避免占位
      符被误当参数传入。
      Angiin authored
  3. 05 Mar, 2026 5 commits
    • - check-login 未登录时返回 login_method(qrcode/phone)和 hint,
        Claude 可根据当前环境自动选择登录方式
      - 新增 has_display() 环境检测:Windows/macOS 返回 true,
        Linux 检查 DISPLAY/WAYLAND_DISPLAY 环境变量
      - 新增 send-code / verify-code 分步手机登录命令,适用于无界面服务器
      - send-code 在频率限制时自动重启 Chrome 并重试一次(RateLimitError)
      - delete-cookies 改为通过页面 UI 点击「更多→退出登录」后再删文件,
        修复原先只删 cookies.json 但 Chrome Session 仍保留导致登录状态残留的问题
      - 新增 logout() / send_phone_code() / submit_phone_code() 到 login.py
      - 新增 LOGOUT_MORE_BUTTON / LOGOUT_MENU_ITEM 选择器
      - 新增 RateLimitError 异常类
      - 更新 skills/xhs-auth/SKILL.md:加入登录方式决策树和分步手机登录流程
      Angiin authored
    • 新增 MAX_TITLE_LENGTH 常量,补充 UTF-16 码元计数规则:
      ZWJ 序列(💇‍♀️)= 5 贡献值,旗帜(🇨🇳)= 4,SMP emoji = 2。
      对应 Go CalcTitleLength 算法,澄清各类 emoji 的计算逻辑。
      Angiin authored
    • - 新增 ZIP 下载安装方式(推荐),适配 OpenClaw 及所有 SKILL.md 兼容平台
      - 新增自然语言使用示例,展示连贯操作能力
      - 补全 CLI 命令参考(20 个子命令)
      - 更新项目结构和技术架构说明
      Angiin authored
    • - 完善登录信息返回,登录后显示登录名与小红薯号
      - 新增 selectors.py 集中管理 CSS 选择器,便于改版维护
      - 屏蔽位置等权限弹窗,减少发布流程干扰
      - 优化 Tags 点击逻辑,降低标签无法选中的概率
      - 强化浏览器伪装(JS 伪装、CDP 真实交互、随机延迟),触发验证时自动重试一次
      - 修复发布流程 4 个 bug(页面关闭、标签错位、换行丢失、标签重复)
      - Chrome 启动器增强、运行锁修复、长文发布与类型优化
      - 新增保存草稿(暂存离开)功能
      Angiin authored
    • feat: 增强反检测能力 — JS 伪装、CDP 真实交互、随机延迟
      Angiin authored
  4. 04 Mar, 2026 5 commits
    • - cdp.py: new_page 中通过 Browser.setPermission 自动拒绝位置、通知、摄像头等权限弹窗
      - publish.py: 新增 save_as_draft() 离开发布页触发自动保存
      - cli.py: 新增 save-draft 子命令,用户取消发布时保存草稿
      Angiin authored
    • Angiin authored
    • - cli.py: 分步发布命令(fill-publish/fill-publish-video/long-article/select-template/next-step)不再关闭页面,新增 _connect_existing 复用已有 tab
      - cdp.py: input_content_editable 遇到 \n 时按 Enter 键,正确产生段落换行
      - publish.py: _input_tags 先 focus 正文编辑器再输入标签;新增 _extract_hashtags_from_content 从正文末尾提取 hashtag 合并到 tags 去重;标签输入增加重试等待联想下拉
      Angiin authored
    • - stealth.py: 新增 5 项 JS 覆盖(hardwareConcurrency/deviceMemory/connection/chrome.csi+loadTimes/outerWidth+Height)、REALISTIC_UA 常量、--disable-extensions/--disable-sync 启动参数
      - cdp.py: click_element 改用 CDP Input 事件(isTrusted=true)、input_content_editable 改用逐字 CDP 键入、new_page 注入 UA 覆盖和随机 viewport
      - human.py: 新增 navigation_delay() 函数
      - comment.py: 所有 time.sleep 替换为 sleep_random,评论输入改用 CDP 逐字输入
      - search.py/feed_detail.py/login.py: 固定延迟替换为随机区间延迟
      Angiin authored
    • - 新增写长文发布模式(publish_long_article.py):支持长文编辑、一键排版、模板选择
      - 新增 Headless 自动降级:未登录时自动切换到有窗口模式
      - 新增分步发布命令:fill-publish / fill-publish-video / click-publish
      - 拆分 publish 为 fill_publish_form + click_publish_button
      - chrome_launcher 新增 restart_chrome / kill_chrome
      - 新增 6 个 CLI 子命令,总计 19 个
      - 更新 SKILL.md 含长文模式和分步发布工作流
      
      Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
      zy authored
  5. 03 Mar, 2026 2 commits
    • ## 主要变更
      
      ### 核心模块重写
      - 创建 scripts/xhs/ 包,包含 18 个专业模块(3728 行代码)
      - 基于 xiaohongshu-mcp Go 源码完整实现
      - CDP WebSocket 直接通信,替代第三方库依赖
      
      ### 模块清单
      - cdp.py: Browser/Page/Element 类,完整 CDP 协议实现
      - stealth.py: 反检测 JS 注入 + Chrome 启动参数
      - login.py: 登录检查与二维码登录(QR 码保存到临时文件供 Agent 显示)
      - publish.py: 图文发布完整流程
      - publish_video.py: 视频发布完整流程
      - search.py: 搜索与内容筛选
      - feed_detail.py: 笔记详情与评论加载
      - comment.py: 评论与回复
      - like_favorite.py: 点赞与收藏
      - user_profile.py: 用户主页
      - cookies.py: Cookie 持久化
      - types.py: 完整的 dataclass 数据类型系统
      - errors.py: 自定义异常体系
      - human.py: 人类行为模拟(延迟、滚动)
      - selectors.py: CSS 选择器常量
      - urls.py: URL 构建函数
      
      ### CLI 统一接口
      - scripts/cli.py: 13 个子命令,完全兼容 xiaohongshu-mcp MCP 工具
      - check-login: 检查登录状态
      - login: 获取登录二维码
      - switch-account/delete-cookies: 账号切换
      - publish-content: 图文发布
      - publish-with-video: 视频发布
      - list-feeds: Feed 列表
      - search-feeds: Feed 搜索
      - get-feed-detail: 笔记详情
      - user-profile: 用户主页
      - post-comment: 发送评论
      - like-feed: 点赞笔记
      - favorite-feed: 收藏笔记
      
      ### 支持脚本重写
      - chrome_launcher.py: Chrome 进程管理(跨平台)
      - account_manager.py: 多账号 Profile 隔离
      - image_downloader.py: 图片/视频下载(SHA256 缓存)
      - title_utils.py: UTF-16 标题长度计算
      - run_lock.py: 单实例锁机制
      - publish_pipeline.py: 发布流程编排 CLI
      
      ### 文档与配置
      - SKILL.md: 统一技能入口(路由到 5 个子技能)
      - skills/xhs-auth/SKILL.md: 认证管理技能
      - skills/xhs-publish/SKILL.md: 内容发布技能(图文+视频)
      - skills/xhs-explore/SKILL.md: 内容发现与分析技能
      - skills/xhs-interact/SKILL.md: 社交互动技能(评论/点赞/收藏)
      - skills/xhs-content-ops/SKILL.md: 复合内容运营工作流技能
      - CLAUDE.md: 项目开发指南
      - PROMPT.md: Ralph Loop 驱动文件
      - pyproject.toml: uv 项目配置(uv.lock)
      - README.md: 完整项目文档
      
      ### 技术栈
      - Python 3.11+ with uv 包管理
      - requests + websockets: CDP WebSocket 通信
      - 代码规范: ruff lint + format
      
      ## 对应关系
      所有 13 个子命令与 xiaohongshu-mcp MCP 工具完全对应
      支持 OpenClaw agent 框架直接调用
      
      ## 前置工作
      - 创建 scripts/xhs/ 包架构
      - 实现 CDP WebSocket 协议
      - 完整的类型系统和错误处理
      - CLI 子命令系统
      
      Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
      zy authored
    • zy authored