跨平台监控 Holland2Stay、OurDomain、OurCampus、Xior、Magis 房源,实时通知,Holland2Stay 支持自动预订。
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 与登录鉴权,仅限本机使用。
自 Releases 下载最新的 .dmg,拖入 Applications 目录后双击启动。
自 Releases 下载最新的 .zip,解压后双击 flatradar.exe 运行。
iOS:在 App Store 下载,为原生 SwiftUI 客户端。
Android:下载 Android App(.apk),为 Kotlin + Compose 客户端,采用 FCM 推送。
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 面板是系统的控制中心,全部功能均可自左侧栏进入。
提供总览信息:数据库中的房源总数、当日新增、当日变更与最近一次抓取时间,并列出最新房源及近 48 小时内的状态变更。每条房源均带有平台标签(H2S / OD / OC / XR)。
点击启动监控即开始抓取,运行期间状态圆点显示为绿色。
用于浏览数据库中的全部房源,支持按状态、城市、平台、户型、最高租金、最小面积、合同类型、能耗等级等条件筛选。点击房源名称即跳转至源平台的详情页。
状态旁有时会显示一枚「推测」标记,表示该状态由系统推断得出,并非平台上报。各平台均不会公告房源已下架,只是不再将其列出,因此房源从列表中消失 30 分钟后会被推定为 Reserved,消失 2 小时后判定为 Occupied(2 小时对齐 Holland2Stay 官方的付款限时)。房源重新出现时该标记会自动清除。做出决定前请以平台页面为准:带「推测」的状态仅代表本系统的判断。
把房源标注于交互式地图上。绿色表示可预订,橙色表示抽签中,灰色表示已入住;标记同时显示平台来源。该页面需配置 GOOGLE_MAPS_API_KEY 方可使用。
地图只显示近期还被抓到过的房源,默认十四天,可在「设置」页的 「地图显示范围」里改,填 0 显示全部。已入住是状态收敛的终态,那些记录会长期留在 数据库里;不加这道限制,几个月前就从平台上撤下的单元仍然会钉在图上。
坐标由监控进程自动解析并缓存,无需手动操作;新抓到的房源通常在半小时内出现在图上。 管理员也可以在地图页手动触发一次,用于排查。
按月份显示入住日期,可按城市与平台筛选。
可在 7 / 30 / 90 天之间切换,展示新增趋势、变更趋势,以及城市、状态、平台分布、租金分布与上线时段分布。
进入用户管理,点击目标用户,选择通知渠道。
https://api.telegram.org/bot<TOKEN>/getUpdates 以获取 Chat ID有两种方式,默认是第一种。
一、由服务代发(默认)。只填收件邮箱即可,不需要 SMTP 服务器。 填好后会收到一封确认邮件,点击其中的链接完成验证之后才会开始投递—— 这道确认用于防止把别人的邮箱填进来。验证状态在用户配置页可以看到,也可以重发确认邮件。
二、自建 SMTP。把邮件模式改为自定义,再填服务器信息。常见服务商如下:
| 服务商 | SMTP 地址 | 端口 | 加密 |
|---|---|---|---|
| Gmail | smtp.gmail.com | 587 | STARTTLS |
| Outlook | smtp.office365.com | 587 | STARTTLS |
账号已开启两步验证时,须使用应用专用密码。自建 SMTP 不需要邮箱验证, 投递结果由你自己的服务器负责。
填入收件人手机号(如 +31612345678)或 Apple ID 邮箱。该渠道仅在 macOS 上、且 Messages.app 已登录时可用。
需具备 Twilio 账号,并填入 Account SID、Auth Token 及 whatsapp:+... 格式的号码。
使用 FlatRadar iOS App 时,APNs 推送自动发送,并按设备语言在中英文之间自动选择。
使用 FlatRadar Android App 时,FCM 推送自动发送,同样支持中英双语。
用户配置里那个通知开关管住全部渠道,设备推送也在内。关掉它, 手机就不再收到推送。
在 App 里授权推送权限并登录,会自动打开这个开关——在手机上同意接收,就是同意接收, 不必再去面板点一次。此后你在面板上关掉它,才是真的关掉。
进入用户管理,点击目标用户,选择自动预订。
当 Holland2Stay 房源转为可预订且满足所设条件时,系统依次执行:
addNewBooking)placeOrder)idealCheckOut)系统不会自动完成付款,收到链接后须自行支付。
OurDomain、OurCampus、Xior 与 Magis 目前仅通知、不预订,原因分两种。OurDomain 与 Xior 的预订链路代码已实现、验证码亦已对接,只是尚未完成端到端验证;OurCampus 与 Magis 的预订流程则从未侦察过。
进入用户管理,点击目标用户,选择过滤条件。
| 条件 | 示例 | 适用平台 | 说明 |
|---|---|---|---|
| 最高租金 | €1200 | 全部 | 仅推送不高于 €1200/月的房源。各平台价格口径不同,见下方 |
| 最小面积 | 25 m² | 全部 | 仅推送不小于 25 m² 的房源 |
| 最低楼层 | 1 | 全部 | 排除底层(0 层) |
| 城市 | Eindhoven, Amsterdam | 全部 | 可多选,满足任一项即匹配 |
| 平台 | H2S, OD | 全部 | 可多选,仅推送所选平台的房源 |
| 租客要求 | student only | Magis 除外 | 可多选,满足任一项即匹配 |
| 户型 | Studio, 1 | Xior 除外 | 可多选,满足任一项即匹配 |
| 入住人数 | Single | Xior、Magis 除外 | 可多选,满足任一项即匹配 |
| 装修类型 | Furnished | OurCampus 除外 | 可多选,满足任一项即匹配 |
| 合同类型 | Indefinite | 仅 Holland2Stay | 仅推送长租房源,排除短租 |
| 最低能耗 | B | 仅 Holland2Stay、Magis | 仅推送不低于该等级的房源 |
| 街区 | Strijp, Centrum | 仅 Holland2Stay | 可多选,选项随所选城市变化 |
| 供应形式 | Rent | 仅 Holland2Stay | 可多选,用于区分出租与其他挂牌形式 |
各项条件须同时满足才会推送;留空表示该项不作限制。
「适用平台」一列很重要:某个平台不提供该字段时,这个条件对它整体跳过, 而不是把它的房源全部排除。也就是说,勾了「最低能耗 B」并不意味着推来的都是 B 级—— Xior、OurDomain、OurCampus 的房源根本没参与这一关。面板的筛选项旁也标着同样的范围。
五个平台报的不是同一个数,设置「最高租金」之前请先看清楚:
| 平台 | 面板与通知里显示的价格 |
|---|---|
| Holland2Stay | 到手价:含服务费与水电预付 |
| Xior | 到手价:基础租金加上该楼盘登记的月度预付费用 |
| OurDomain | 基础租金,服务费另计 |
| OurCampus | 基础租金,服务费另计 |
| Magis | 到手价:基础租金加上每条房源自己印着的服务费 |
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。
先看面板首页。「你现在收不到通知」的时候那里会出现一张清单,直接指明缺的是哪一步; 清单消失就说明这条链路是通的。手动排查按下面的顺序:
.env 中通过 HTTPS_PROXY 配置住宅代理先检查状态旁是否带有「推测」标记。带该标记的状态由系统依据房源从列表中消失的时长推断得出,并非平台上报,因此可能与平台页面存在出入。做出决定前请以平台页面为准。