mirror of
https://github.com/xpzouying/xiaohongshu-mcp.git
synced 2026-08-28 17:45:51 +08:00
a7d1f2f7f4
内置浏览器:首次运行自动从自建 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>
51 lines
1.3 KiB
Go
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)
|
|
}
|
|
}
|