Files
xiaohongshu-mcp/main.go
T
zy a7d1f2f7f4 feat: 内置浏览器自动下载 + 交互拟人化 + 写操作诚实校验 (#737)
内置浏览器:首次运行自动从自建 CDN 下载并校验 SHA256,免手动装 Chrome;
Docker 构建时烤入镜像;支持 Windows 运行画像;每账号可固定 XHS_FP_SEED。

交互拟人化:评论/回复、点赞/收藏、发布图文与视频、feed 浏览、搜索筛选的
点击/输入/停顿改为更接近真人的时序与轨迹(log-normal 延迟、逐字输入、
贝塞尔鼠标),统一走 humanize 包,预留 Provider 注入点。

诚实校验:写操作提交后回读真实结果(评论是否渲染、点赞状态是否翻转、
发布是否跳转发布成功页),消除“点了没报错就算成功”的假成功;
check_login_status 加超时保护;原创声明失败不再静默照发。

分发:内置浏览器走自建 CDN(cdn.one-world.ai)。

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 15:01:23 +08:00

51 lines
1.3 KiB
Go

package main
import (
"flag"
"os"
"github.com/sirupsen/logrus"
"github.com/xpzouying/xiaohongshu-mcp/browser"
"github.com/xpzouying/xiaohongshu-mcp/configs"
)
func main() {
var (
headless bool
binPath string // 浏览器二进制文件路径
port string
)
flag.BoolVar(&headless, "headless", true, "是否无头模式")
flag.StringVar(&binPath, "bin", "", "浏览器二进制文件路径")
flag.StringVar(&port, "port", ":18060", "端口")
flag.Parse()
if len(binPath) == 0 {
binPath = os.Getenv("ROD_BROWSER_BIN")
}
// 未显式指定浏览器:自动准备内置浏览器,失败即退出。
if binPath == "" {
bin, err := browser.EnsureBrowser()
if err != nil {
logrus.Fatalf("%v", err)
}
binPath = bin
}
logrus.Infof("using browser binary: %s", binPath)
configs.InitHeadless(headless)
configs.SetBinPath(binPath)
// 入口层读 env、解析成固定指纹 seed 和代理,经 configs 透传给浏览器工厂。
configs.SetFingerprintSeed(configs.FingerprintSeedFromEnv())
configs.SetProxy(configs.ProxyFromEnv())
// 初始化服务
xiaohongshuService := NewXiaohongshuService()
// 创建并启动应用服务器
appServer := NewAppServer(xiaohongshuService)
if err := appServer.Start(port); err != nil {
logrus.Fatalf("failed to run server: %v", err)
}
}