一个轻量级的自动化监控工具,用于追踪RoboMaster论坛上新发布的开源项目,并通过飞书(Lark)发送实时通知。
本项目旨在帮助RoboMaster参赛者们及时获取社区分享的最新技术,而无需每天手动访问论坛进行查看。
- 全自动模拟登录: 完整模拟了包含多步骤的用户登录流程,可长期保持有效会话。
- 智能化内容抓取: 使用chromedp驱动一个真实的无头浏览器,能够渲染动态加载的JavaScript内容。
- 置顶内容识别: 能够智能识别并跳过论坛的置顶或官方公告,确保只抓取按时间排序的最新文章。
- 持久化存储: 使用SQLite数据库存储所有检测到的文章,防止重复通知和处理删帖场景。
- 实时飞书通知: 在发现新文章时,会通过飞书机器人发送格式精美的交互式卡片消息进行实时提醒。
RoboMaster论坛采用了一套复杂且有效的多层防爬虫机制。本监控脚本在开发过程中,针对以下挑战逐一进行了破解:
-
动态内容加载(JavaScript Rendering)
- 机制: 网站为单页应用(SPA),初始HTML仅为骨架,所有文章列表均由JavaScript动态渲染。
- 影响: 传统的HTTP请求抓取方式无法获取任何有效内容。
- 解决方案: 通过 chromedp 驱动一个完整的Chrome浏览器实例,模拟真实用户的浏览行为,待JS渲染完成后再进行解析。
-
复杂的登录流程
- 机制: 登录流程包含多个步骤,旨在阻碍简单的自动化脚本。例如:
- 登录表单默认显示二维码/短信登录,需要程序额外点击才能切换到"密码登录"选项卡。
- 登录成功后,页面上的关键元素(如用户头像)被"懒加载"(Lazy-loading),需要用户交互(如调整窗口大小)后才显示。
- 解决方案: 脚本通过chromedp精确模拟了用户的操作序列:点击选项卡、输入凭证、点击提交,并通过EmulateViewport模拟窗口调整动作,以触发所有懒加载元素的显示。
- 机制: 登录流程包含多个步骤,旨在阻碍简单的自动化脚本。例如:
-
IP信誉检测与动态屏蔽
- 机制: 这是最核心的防爬机制。服务器会检测访问请求的IP地址信誉。
- 影响:
- 来自普通家庭网络(住宅IP)的访问被认为是可信的。
- 来自数据中心(如GitHub Actions)的IP地址会被识别为机器人,其访问请求会被忽略或无限期延迟,导致连接超时。
- 该机制具有自适应性:在服务器上,脚本初次运行可能会成功几次,但其行为模式(如规律的访问间隔)被服务器"学习"后,该IP就会被加入临时黑名单。
- 解决方案: 最可靠的长期方案是使用代理服务器(Proxy Server),通过高信誉的住宅IP转发请求。对于个人项目,更直接的方法是将此脚本部署在拥有良好IP信誉的个人服务器或电脑上。
-
内容结构逻辑
- 机制: 论坛会将官方公告或重要活动"置顶",使其始终显示在列表顶部,干扰按时间顺序的判断。
- 解决方案: 脚本通过分析HTML结构,找到了置顶内容独有的特征(标题区域包含特定的SVG图标),从而可以准确地识别并跳过所有置顶内容。
-
行为模式检测(滑块验证)
- 机制: 检测自动化工具特征,如:过于规律的操作时间、缺少鼠标移动、输入速度过快等。
- 影响: 频繁访问(如1分钟/次)会触发滑块验证,阻止后续访问。
- 解决方案(本次更新):
- ✅ 随机延迟: 所有操作之间增加随机时长的延迟(300ms - 2s),避免机械式的固定时间间隔
- ✅ 模拟人类打字: 逐字符输入用户名和密码,每个字符间隔50-150ms
- ✅ 页面浏览行为: 登录前后增加平滑滚动、页面停留等行为,模拟真实用户浏览
- ✅ 视口设置优化: 提前设置1920x1080分辨率,避免页面元素因窗口过小而不可见
- ✅ 反自动化检测: 禁用
AutomationControlled标志,隐藏自动化工具特征 - ✅ 更新 User-Agent: 使用最新的 Chrome 131 版本 UA,避免被识别为过时浏览器
思路极其简单:模拟用户登陆网站去抓每个文章的信息并且与数据库中保存的历史记录进行对比,如果发现新文章,就执行通知功能,否则跳过进入下一次监测。
考虑到无法时时刻刻的去登陆论坛看看有没有新的开源发布,故而用自动化来实现论坛最新开源的抓取、监测,并且调用飞书机器人实现实时通知。
目前已发现的防爬:
- 登陆验证
- IP地址信誉阻止
- 动态/自适应屏蔽:表现为成功抓取十次(约10min,未测试是时间还是次数限制)后被重定向
- 滑块验证(频率为1min/次会触发)
最新优化(v2.0):通过模拟人类行为(随机延迟、逐字符输入、页面滚动等),大幅降低触发滑块验证的概率。建议使用 5 分钟检查间隔。
robomaster-monitor/
├── main.go # 程序主入口,负责编排流水线
├── internal/
│ ├── crawler/
│ │ └── fetch.go # 负责浏览器自动化、登录及抓取逻辑
│ ├── notifier/
│ │ └── feishu.go # 负责飞书消息的格式化与发送
│ └── storage/
│ └── db.go # 负责SQLite数据库操作和历史记录管理
├── config/ # 配置文件目录
│ ├── param.example.toml # 示例配置文件
│ └── param.toml # 实际配置文件(gitignore)
├── data/ # 数据文件目录
│ └── articles.db # SQLite数据库文件(自动生成)
├── go.mod
└── README.md- Go (推荐版本 1.21+)
- 一个可以正常运行的Google Chrome 或Chromium 浏览器
- SQLite 3
-
克隆本项目:
git clone https://github.com/Xlqmu/robomaster-monitor.git cd robomaster-monitor -
配置参数
在参数文件里配置相关参数(将param.example.toml改为param.toml,具体参数自行替换)
-
安装依赖:
go mod tidy
-
编译为二进制程序:
go build -o monitor main.go # 如因系统架构问题导致无法运行可以考虑交叉编译 -
运行
./monitor
问题描述:在云服务器上运行时,登录过程触发滑块验证码,导致登录超时失败。
原因:云服务器 IP 被网站识别为可疑来源,自动触发了滑块验证,而程序无法自动完成验证。
解决方案:从本地电脑登录后保存 Cookies,然后上传到服务器使用。
# 1. 在本地运行程序登录(确保 config/param.toml 中 headless = false)
cd ~/robomaster-monitor && go run main.go
# 登录成功后 Ctrl+C 停止
# 2. 上传 cookies 到服务器
scp ~/robomaster-monitor/config/cookies.json ubuntu@your-server-ip:~/robomaster-monitor/config/cookies.json
# 3. 确保服务器配置中 headless = true,然后重启服务
ssh ubuntu@your-server-ip "sudo systemctl restart rm-monitor"注意:Cookies 有有效期,过期后需要重复上述步骤。
鉴于目标网站的IP风控机制,将此监控脚本部署在个人云服务器(VPS)或长期在线的个人电脑上是目前最稳定可靠的方案。
要在Linux服务器上使其在后台持续运行,您可以使用 nohup 或 systemd。
使用nohup的例子:
nohup ./monitor > output.log 2>&1 &- 引入数据库(如 SQLite)来存储历史文章,以应对论坛删帖可能导致的逻辑误判
- 将应用容器化(Dockerfile),以简化部署流程。
- 增加对更多通知渠道的支持