FlatRadar — 使用指南

跨平台监控 Holland2Stay、OurDomain、OurCampus、Xior、Magis 房源,实时通知,Holland2Stay 支持自动预订。

快速开始

1 Docker(推荐,适合 VPS)

cp .env.example .env && mkdir -p data logs logs/caddy
# 编辑 Caddyfile,将 your.domain.com 替换为实际域名
# 编辑 .env,设置 WEB_PASSWORD
docker compose up -d

在浏览器中访问 https://your.domain.com,登录后于仪表盘点击启动监控。登录用户名默认为 admin。

若暂无域名,可先在本机试运行:docker compose -f docker-compose.yml -f docker-compose.local.yml up -d h2s,随后访问 http://127.0.0.1:8088。该方式不启用 HTTPS 与登录鉴权,仅限本机使用。

2 macOS

自 Releases 下载最新的 .dmg,拖入 Applications 目录后双击启动。

3 Windows

自 Releases 下载最新的 .zip,解压后双击 flatradar.exe 运行。

4 iOS / Android App

iOS:在 App Store 下载,为原生 SwiftUI 客户端。

Android:下载 Android App(.apk),为 Kotlin + Compose 客户端,采用 FCM 推送。

5 从源码运行

pip install -r requirements.txt
cp .env.example .env
python web.py      # 面板
python monitor.py  # 抓取循环,需另开终端

在浏览器中访问 http://127.0.0.1:8088。web.py 与 monitor.py 是两个互相独立的进程,仅运行前者将得到一个不会更新数据的面板。

支持平台

FlatRadar 监控四个房源平台。每条房源上的平台标签(H2S / OD / OC / XR)标识其来源。

平台覆盖范围数据粒度自动预订
Holland2Stay (H2S)26 个荷兰城市单元级(具体房号、租金、面积)✅ 完整 GraphQL 流程
OurDomain (OD)Amsterdam(Diemen 与 South-East)单元级(#6045、面积、楼层、朝向)❌ 仅通知
OurCampus (OC)Amsterdam Diemen(1 栋)单元级(同 OurDomain)❌ 仅通知
Xior (XR)荷兰 30 栋楼,分布于 14 个城市单元级(M1.30.53、面积、租金、押金)❌ 仅通知
Magis (MG)5 个城市共 17 栋楼,Eindhoven 占 9 栋单元级(租金、面积、楼层、能耗标签)❌ 仅通知
提示:在设置 → 平台中启用或禁用平台,在设置 → 城市中选择需监控的城市或楼盘。

Web 面板概览

Web 面板是系统的控制中心,全部功能均可自左侧栏进入。

仪表盘

提供总览信息:数据库中的房源总数、当日新增、当日变更与最近一次抓取时间,并列出最新房源及近 48 小时内的状态变更。每条房源均带有平台标签(H2S / OD / OC / XR)。

点击启动监控即开始抓取,运行期间状态圆点显示为绿色。

房源列表

用于浏览数据库中的全部房源,支持按状态、城市、平台、户型、最高租金、最小面积、合同类型、能耗等级等条件筛选。点击房源名称即跳转至源平台的详情页。

状态旁有时会显示一枚「推测」标记,表示该状态由系统推断得出,并非平台上报。各平台均不会公告房源已下架,只是不再将其列出,因此房源从列表中消失 30 分钟后会被推定为 Reserved,消失 2 小时后判定为 Occupied(2 小时对齐 Holland2Stay 官方的付款限时)。房源重新出现时该标记会自动清除。做出决定前请以平台页面为准:带「推测」的状态仅代表本系统的判断。

地图

把房源标注于交互式地图上。绿色表示可预订,橙色表示抽签中,灰色表示已入住;标记同时显示平台来源。该页面需配置 GOOGLE_MAPS_API_KEY 方可使用。

地图只显示近期还被抓到过的房源,默认十四天,可在「设置」页的 「地图显示范围」里改,填 0 显示全部。已入住是状态收敛的终态,那些记录会长期留在 数据库里;不加这道限制,几个月前就从平台上撤下的单元仍然会钉在图上。

坐标由监控进程自动解析并缓存,无需手动操作;新抓到的房源通常在半小时内出现在图上。 管理员也可以在地图页手动触发一次,用于排查。

日历

按月份显示入住日期,可按城市与平台筛选。

统计

可在 7 / 30 / 90 天之间切换,展示新增趋势、变更趋势,以及城市、状态、平台分布、租金分布与上线时段分布。

通知推送

进入用户管理,点击目标用户,选择通知渠道。

Telegram 跨平台

  1. 在 @BotFather 处创建 bot,复制其 token
  2. 向该 bot 发送一条任意消息
  3. 访问 https://api.telegram.org/bot<TOKEN>/getUpdates 以获取 Chat ID
  4. 将 Bot Token 与 Chat ID 填入面板

Email 跨平台

有两种方式,默认是第一种。

一、由服务代发(默认)。只填收件邮箱即可,不需要 SMTP 服务器。 填好后会收到一封确认邮件,点击其中的链接完成验证之后才会开始投递—— 这道确认用于防止把别人的邮箱填进来。验证状态在用户配置页可以看到,也可以重发确认邮件。

二、自建 SMTP。把邮件模式改为自定义,再填服务器信息。常见服务商如下:

服务商SMTP 地址端口加密
Gmailsmtp.gmail.com587STARTTLS
Outlooksmtp.office365.com587STARTTLS

账号已开启两步验证时,须使用应用专用密码。自建 SMTP 不需要邮箱验证, 投递结果由你自己的服务器负责。

iMessage 仅 macOS

填入收件人手机号(如 +31612345678)或 Apple ID 邮箱。该渠道仅在 macOS 上、且 Messages.app 已登录时可用。

WhatsApp Twilio 付费

需具备 Twilio 账号,并填入 Account SID、Auth Token 及 whatsapp:+... 格式的号码。

iOS 推送通知

使用 FlatRadar iOS App 时,APNs 推送自动发送,并按设备语言在中英文之间自动选择。

Android 推送通知

使用 FlatRadar Android App 时,FCM 推送自动发送,同样支持中英双语。

设备推送与「通知开关」的关系

用户配置里那个通知开关管住全部渠道,设备推送也在内。关掉它, 手机就不再收到推送。

在 App 里授权推送权限并登录,会自动打开这个开关——在手机上同意接收,就是同意接收, 不必再去面板点一次。此后你在面板上关掉它,才是真的关掉。

提示:点击发送测试通知可对各渠道逐一验证,设备推送也在测试范围内。 面板首页会在「你当前收不到任何通知」时给出一张清单,指明缺的是哪一步。

自动预订(仅 Holland2Stay)

进入用户管理,点击目标用户,选择自动预订。

工作流程

当 Holland2Stay 房源转为可预订且满足所设条件时,系统依次执行:

  1. 登录 Holland2Stay 账号
  2. 创建新购物车
  3. 加入房源(addNewBooking)
  4. 提交订单(placeOrder)
  5. 生成直达付款的 URL(idealCheckOut)
  6. 即时发送付款链接

系统不会自动完成付款,收到链接后须自行支付。

OurDomain、OurCampus、Xior 与 Magis 目前仅通知、不预订,原因分两种。OurDomain 与 Xior 的预订链路代码已实现、验证码亦已对接,只是尚未完成端到端验证;OurCampus 与 Magis 的预订流程则从未侦察过。

配置项

注意:请在试运行模式下确认流程无误后再将其关闭,以免误提交订单。

通知过滤条件

进入用户管理,点击目标用户,选择过滤条件。

条件示例适用平台说明
最高租金€1200全部仅推送不高于 €1200/月的房源。各平台价格口径不同,见下方
最小面积25 m²全部仅推送不小于 25 m² 的房源
最低楼层1全部排除底层(0 层)
城市Eindhoven, Amsterdam全部可多选,满足任一项即匹配
平台H2S, OD全部可多选,仅推送所选平台的房源
租客要求student onlyMagis 除外可多选,满足任一项即匹配
户型Studio, 1Xior 除外可多选,满足任一项即匹配
入住人数SingleXior、Magis 除外可多选,满足任一项即匹配
装修类型FurnishedOurCampus 除外可多选,满足任一项即匹配
合同类型Indefinite仅 Holland2Stay仅推送长租房源,排除短租
最低能耗B仅 Holland2Stay、Magis仅推送不低于该等级的房源
街区Strijp, Centrum仅 Holland2Stay可多选,选项随所选城市变化
供应形式Rent仅 Holland2Stay可多选,用于区分出租与其他挂牌形式

各项条件须同时满足才会推送;留空表示该项不作限制。

「适用平台」一列很重要:某个平台不提供该字段时,这个条件对它整体跳过, 而不是把它的房源全部排除。也就是说,勾了「最低能耗 B」并不意味着推来的都是 B 级—— Xior、OurDomain、OurCampus 的房源根本没参与这一关。面板的筛选项旁也标着同样的范围。

租金的口径

五个平台报的不是同一个数,设置「最高租金」之前请先看清楚:

平台面板与通知里显示的价格
Holland2Stay到手价:含服务费与水电预付
Xior到手价:基础租金加上该楼盘登记的月度预付费用
OurDomain基础租金,服务费另计
OurCampus基础租金,服务费另计
Magis到手价:基础租金加上每条房源自己印着的服务费

OurDomain 与 OurCampus 的服务费按户型变化,而上游不提供单元与户型的对应关系,因此无法合成到手价。 面板上这类房源的价格右上角带一个星号,悬停可看到该楼盘服务费的区间;通知里的租金行 也会附上同样的说明。

这对筛选意味着什么:同一个租金上限,在 Holland2Stay 与 Xior 上过滤的是 你实际要付的钱,在 OurDomain 与 OurCampus 上过滤的是不含服务费的部分。给后两者留出余量, 或用平台条件把它们分开处理。

全局设置

进入设置页面(仅管理员可见)。

轮询参数

参数默认值说明
常规间隔300s(5 分钟)非高峰时段的轮询间隔
高峰上限60s高峰时段的起始间隔(荷兰时间 08:30–10:00)
高峰下限15s自适应收紧后的最小间隔
高峰时段08:30–10:00、13:30–15:00荷兰时间,仅工作日生效
抖动比例0.20每轮间隔在 ±20% 范围内随机浮动
心跳间隔60 分钟向管理员发送存活通知的间隔;设 0 关闭
地图显示范围14 天地图只显示这么多天内还被抓到过的房源;设 0 显示全部

平台与城市

Holland2Stay、OurDomain、OurCampus 与 Xior 可分别启用或禁用,每个平台均可单独选择需监控的城市或楼盘;Xior 的楼盘按城市分组显示。

修改后点击保存并生效即可热重载,无需重启进程。

常见问题

监控显示为「已停止」

在仪表盘点击启动监控。若仍无法启动,请查阅日志查看器或执行 docker compose logs h2s。

没有房源出现

收不到通知

先看面板首页。「你现在收不到通知」的时候那里会出现一张清单,直接指明缺的是哪一步; 清单消失就说明这条链路是通的。手动排查按下面的顺序:

面板上的通知列表不能用来判断这件事。那是全站流水,不分用户、不按你的过滤条件 筛选;里面有内容不代表你配好了。只有上面这条链路通了,才会按你的条件推给你。

被 Cloudflare 返回 403

  1. 在 .env 中通过 HTTPS_PROXY 配置住宅代理
  2. 重启监控以更换 TLS 指纹
  3. 暂停数小时以待冷却

房源状态与平台页面不一致

先检查状态旁是否带有「推测」标记。带该标记的状态由系统依据房源从列表中消失的时长推断得出,并非平台上报,因此可能与平台页面存在出入。做出决定前请以平台页面为准。

实用提示:日志查看器(管理员 → 侧栏终端图标)支持在 Monitor Log 与 Errors Log 之间切换,并提供关键词搜索、行号显示与级别着色,是排查问题的首选入口。