青岛房产销售查询 Skill
查询青岛市在售楼盘的销售情况,支持三个层级的数据查询:
- 楼栋级:各预售证下的可售/已售套数、面积及销售率(
query_sales.js) - 单元级:每个楼栋下各单元的可售/已售/预定套数(
query_units.js) - 楼层/房间级:每层每套房的销售状态、抵押/限制标记(
query_floors.js)
数据来源:青岛市房地产交易中心
特色功能:每次查询自动保存快照到本地历史记录,支持查看历史数据、与指定日期的数据做对比。
重要:时间处理规则
AI 对当前日期没有准确感知。在涉及任何与日期相关的操作之前(包括"今天"、"昨天"、"上周"等表述),必须先执行 get_date.js 获取准确的北京时间:
node get_date.js # 获取今天的日期
node get_date.js --offset -1 # 获取昨天的日期
node get_date.js --offset -7 # 获取7天前的日期
如何使用
本项目由纯标准化 Node.js 环境执行,文件均采用 CommonJS (require) 规范。
无任何外部依赖包(0依赖),也不需要 package.json,即可直接通过 node 命令快速执行脚本。
⚠️ 重要约束:
- 禁止直接读取
data/projects.json——该文件包含数千条记录,会严重占用上下文空间。按名称查找项目时,使用search_project.js或各脚本的--name参数,脚本内部会自动完成本地搜索 → 远程搜索的完整流程。- 所有 HTML 抓取与解析均在脚本内部完成——AI 只需执行脚本并读取 JSON 输出,无需手动访问网页或解析 HTML。
- 若按名称搜索无结果(本地 + 远程均未命中),应询问用户是否需要执行
node refresh_data.js更新本地数据库后重试。
1. 搜索楼盘
node search_project.js <关键词>
按名称搜索楼盘。优先查本地数据库(精确 + 模糊匹配),未命中时自动从 qdfd.com.cn 远程搜索。
示例:
node search_project.js 九水花园
node search_project.js 映月公馆
2. 查询楼盘销售详情
node query_sales.js --name <项目名称>
node query_sales.js --id <projectId>
查询指定楼盘所有楼座的销售明细(已售/可售/总量/面积/销售率)。
查询结果会自动保存到 data/history/<projectId>/<YYYY-MM-DD>.json,供后续历史对比使用。
--name:按名称查询,自动本地搜索 → 远程搜索 → 获取详情。若匹配多个项目则返回候选列表。--id:已知 projectId 时直接查询,跳过搜索步骤。
示例:
node query_sales.js --name 九水花园
node query_sales.js --id 5238
3. 列出在售楼盘
node list_projects.js [区域名称]
列出数据库中的所有在售项目,可选按区域筛选。
示例:
node list_projects.js # 全部
node list_projects.js 崂山区 # 按区域筛选
4. 刷新本地数据库
node refresh_data.js
从 qdfd.com.cn 重新爬取青岛全部 12 个区域的在售项目,更新本地 data/projects.json。
此操作耗时较长(约8-10分钟),非必要不执行。
5. 获取当前日期(时间工具)
node get_date.js # 今天
node get_date.js --offset -1 # 昨天
node get_date.js --offset 1 # 明天
node get_date.js --offset -7 # 7天前
输出北京时间的日期、时间、星期。AI 在处理任何涉及日期的用户请求时必须首先调用此脚本确认准确日期。
输出示例:
{
"date": "2026-04-28",
"time": "2026-04-28 16:30:00",
"weekDay": "星期二",
"timezone": "Asia/Shanghai (UTC+8)"
}
6. 查询历史数据
node query_history.js --id <projectId> --list
node query_history.js --id <projectId> [--date <YYYY-MM-DD>]
node query_history.js --name <项目名称> [--date <YYYY-MM-DD>]
查询某楼盘过去保存的销售快照。
--list:列出该项目所有可用的历史记录日期--date:查看指定日期的快照(默认今天)- 也可用
--name按名称定位项目
示例:
node query_history.js --id 5238 --list
node query_history.js --id 5238 --date 2026-04-27
node query_history.js --name 九水花园
7. 查询楼栋单元列表
node query_units.js --name <项目名称> [--building <楼栋关键词>]
node query_units.js --id <projectId> [--building <楼栋关键词>]
查询项目下各楼栋的单元列表,输出每个单元的可售/已售/预定套数及对应的楼层销售状态页面链接。
查询结果会自动保存到 data/history/<projectId>/<YYYY-MM-DD>_units.json,供后续查看历史单元数据。
- 不指定
--building时,返回全部楼栋下的所有单元 - 指定
--building时,只返回匹配的楼栋(支持模糊匹配,如3号楼、4) - 一个楼栋条目可能包含多栋楼(如“4号楼、6号楼”),此时会展开为各自的单元
示例:
node query_units.js --name 海信君澜二期 # 查全部楼栋的单元
node query_units.js --name 海信君澜二期 --building 1号楼 # 只看1号楼
node query_units.js --id 5716 --building 1号楼 # 匹配含"1号楼"的楼栋
输出示例:
{
"projectId": "5716",
"projectName": "海信君澜二期",
"buildings": [
{
"building": "崂山区香港东路108号",
"license": "青房注字(崂)2020第034号",
"unitCount": 2,
"units": [
{
"name": "崂山区海口路77号1号楼1单元",
"buildingID": "3502857321",
"available": 1,
"total": 45,
"sold": 44,
"url": "https://www.qdfd.com.cn/qdweb/realweb/fh/FhHouseStatus.jsp?buildingID=3502857321&startID=9983&projectID=5716"
}
]
}
]
}
8. 查询楼层/房间销售状态
node query_floors.js --name <项目名称> --building <楼栋关键词> [--unit <单元关键词>]
node query_floors.js --id <projectId> --building <楼栋关键词> [--unit <单元关键词>]
查询指定楼栋/单元的各楼层房间销售状态。自动完成 项目定位 → 楼栋匹配 → 单元遍历 → 逐个获取楼层状态 的完整流程。
--building必填,用于定位楼栋,匹配预售证地址或楼栋名称(如香港东路108号、3号楼、海口路)。若未匹配,脚本会返回可用楼栋列表,据此调整关键词重试--unit可选,进一步筛选单元(如1单元、2);不指定时返回该楼栋下所有单元的楼层数据
每套房输出以下信息:
- 销售状态:可售、已签约、已登记、已付定金、未纳入网上销售
- 抵押标记 (
isMortgaged) - 限制标记 (
isRestricted)
示例:
node query_floors.js --name 海信君澜二期 --building 崂山区香港东路108号 --unit 1号楼1单元
node query_floors.js --name 海信君澜二期 --building 海口路
node query_floors.js --id 5716 --building 崂山区香港东路108号
输出示例:
{
"projectId": "5716",
"projectName": "海信君澜二期",
"units": [
{
"name": "崂山区海口路77号1号楼1单元",
"buildingID": "3502857321",
"summary": { "total": 45, "available": 1, "sold": 41, "signed": 3, "deposit": 0, "other": 0, "soldRate": "97.8%" },
"floors": [
{
"floor": 19,
"rooms": [
{ "roomNumber": "1901", "saleStatus": "可售", "isMortgaged": false, "isRestricted": false },
{ "roomNumber": "1902", "saleStatus": "已登记", "isMortgaged": true, "isRestricted": false }
]
}
]
}
]
}
summary 各字段含义:
sold— 已登记(完成产权登记)signed— 已签约(签订购房合同)deposit— 已付定金other— 未纳入网上销售等其他状态soldRate— 销售率,计算公式:(sold + signed + deposit) / total
9. 历史数据对比
node query_history.js --id <projectId> [--date <YYYY-MM-DD>] --diff <YYYY-MM-DD>
node query_history.js --name <项目名称> [--date <YYYY-MM-DD>] --diff <YYYY-MM-DD>
将今天(或 --date 指定的日期)的数据与 --diff 指定日期的数据做对比,输出各指标的变化量。
示例:
node query_history.js --id 5238 --diff 2026-04-26
node query_history.js --name 九水花园 --date 2026-04-28 --diff 2026-04-25
输出示例:
{
"olderDate": "2026-04-26 10:00:00",
"newerDate": "2026-04-28 16:30:00",
"projectId": "5238",
"projectName": "九水花园",
"changes": {
"soldUnits": { "from": 560, "to": 562, "delta": 2 },
"soldArea": { "from": 49300, "to": 49510, "delta": 210 },
"availableUnits": { "from": 68, "to": 66, "delta": -2 },
"soldRate": { "from": "89.2%", "to": "89.5%" }
}
}
输出格式
所有脚本均返回统一的 JSON 格式。
search_project.js 输出
{
"source": "local",
"matchType": "exact",
"total": 1,
"results": [
{ "id": "5238", "name": "九水花园", "addr": "李沧区九水路60号", "units": "628", "area": "54837.57", "dev": "青岛中海华业房地产有限公司", "dist": "李沧区", "status": "在售" }
]
}
query_sales.js 输出
{
"projectId": "5238",
"projectName": "九水花园",
"buildingCount": 1,
"summary": {
"totalUnits": 628,
"totalArea": 54837.57,
"availableUnits": 66,
"availableArea": 5327.57,
"soldUnits": 562,
"soldArea": 49510,
"soldRate": "89.5%"
},
"buildings": [ ... ]
}
summary.totalUnits— 批准预售总套数summary.availableUnits— 可售套数summary.soldUnits— 已售套数summary.soldRate— 销售率
list_projects.js 输出
{
"dataTime": "2026-03-24 09:18:19",
"filter": "李沧区",
"total": 108,
"projects": [ ... ]
}
数据存储结构
data/
projects.json # 在售项目数据库(refresh_data.js 维护)
history/
<projectId>/
2026-04-26.json # 楼座级销售快照(query_sales.js 生成)
2026-04-26_units.json # 单元级详细快照(query_units.js 生成)
2026-04-27.json
2026-04-27_units.json
...
- 每次执行
query_sales.js自动保存<YYYY-MM-DD>.json(楼座级汇总) - 每次执行
query_units.js自动保存<YYYY-MM-DD>_units.json(单元级详情)
适用场景
作为 AI 助手,在回答以下类型用户提问时可以调用此 Skill:
- "九水花园卖得怎么样?" →
node query_sales.js --name 九水花园 - "李沧区有哪些在售楼盘?" →
node list_projects.js 李沧区 - "帮我查一下青岛奥克斯广场的销售情况" →
node query_sales.js --name 青岛奥克斯广场 - "projectId 5716 是什么楼盘?卖了多少?" →
node query_sales.js --id 5716 - "九水花园和昨天比卖了多少?" → 先
node get_date.js --offset -1获取昨天日期,再node query_sales.js --name 九水花园,再node query_history.js --id 5238 --diff <昨天日期> - "九水花园上周的数据是什么?" → 先
node get_date.js --offset -7获取日期,再node query_history.js --id 5238 --date <该日期> - "九水花园有哪些历史记录?" →
node query_history.js --id 5238 --list - "今天几号?" →
node get_date.js - "海信君澜二期1号楼有几个单元?" →
node query_units.js --name 海信君澜二期 --building 1号楼 - "查一下5716项目各楼栋的单元销售链接" →
node query_units.js --id 5716 - "海信君澜二期1号楼1单元每层的房间销售情况" →
node query_floors.js --name 海信君澜二期 --building 1号楼 --unit 1单元(若未匹配楼栋,脚本会返回可用列表,据此调整--building关键词重试) - "某楼盘某单元还有哪些可售房源?有没有抵押?" →
node query_floors.js --name <楼盘名> --building <楼栋> --unit <单元>
历史对比典型工作流
当用户问"和昨天/上周对比"时,按以下步骤执行:
- 先获取日期:
node get_date.js和node get_date.js --offset -1(或对应偏移量) - 查当前数据:
node query_sales.js --name <名称>(同时自动保存今天的快照) - 执行对比:
node query_history.js --id <projectId> --diff <对比日期> - 若对比日期没有数据,
query_history.js会返回可用日期列表,选最近的日期重新对比
Scan to join WeChat group