尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證https://nhadatradar.com/
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Sàn bất động sản bán & cho thuê chạy thật — tự động cào tin đa nguồn mỗi ngày, dùng AI Gemini chuẩn hoá & chấm điểm, hiển thị theo tin + bản đồ. Kết hợp mô hình aggregator (gom tin từ nhiều nguồn) với marketplace (người bán tự đăng tin, quản lý lead, nhắn tin). 🌐 Web live: https://nhadatradar.com 📊 ~450 tin thật từ 5 nguồn (Chợ Tốt · Batdongsan · Mogi · nhadat · Facebook) · 30 dự án thật · crawl tự động 2 lần/ngày qua GitHub Actions.檢視完整 README ↗
Sàn bất động sản bán & cho thuê chạy thật — tự động cào tin đa nguồn mỗi ngày, dùng AI Gemini chuẩn hoá & chấm điểm, hiển thị theo tin + bản đồ. Kết hợp mô hình aggregator (gom tin từ nhiều nguồn) với marketplace (người bán tự đăng tin, quản lý lead, nhắn tin).
🌐 Web live: https://nhadatradar.com 📊 ~450 tin thật từ 5 nguồn (Chợ Tốt · Batdongsan · Mogi · nhadat · Facebook) · 30 dự án thật · crawl tự động 2 lần/ngày qua GitHub Actions.
/search) — lọc tỉnh/quận/phường, giá, diện tích, phòng ngủ, sắp xếp, bật/tắt bản đồ kết quả; hỗ trợ semantic search bằng pgvector khi lọc từ khoá thường không đủ./dinh-gia) — ước lượng giá từ dữ liệu tin đang có./thong-ke) — bản đồ giá + xếp hạng giá theo quận + biểu đồ xu hướng./thue-hay-mua) — so sánh yield thuê/mua theo quận./tinh-lai-vay) — trả góp annuity + biểu đồ dư nợ./tin-nhan)./account) — hiển thị trên trang danh bạ môi giới /agents./ban để kéo người đăng tin./api/zalo)./admin) quản trị nội dung; chống spam bằng Cloudflare Turnstile./nha-dat-ban, /nha-dat-cho-thue).| Lớp | Công nghệ |
|---|---|
| Frontend / Backend | Next.js 15 (App Router, TypeScript, Server Actions) + Tailwind CSS |
| Database + Auth | Supabase — Postgres + PostGIS (toạ độ) + pgvector (semantic search) + RLS + Storage |
| Đăng nhập | Email/password + Google OAuth (@supabase/ssr, session refresh qua middleware) |
| Bản đồ | Leaflet + OpenStreetMap (miễn phí; tự chuyển Mapbox nếu có token) |
| AI | Google Gemini (gemini-flash-lite-latest) — chuẩn hoá tin, chatbot, định giá, embedding |
| Crawler | Node.js (fetch/parse HTML) + Playwright cho nguồn chặn bot |
| Deploy | Vercel (web) + GitHub Actions (cron crawl 2 lần/ngày) |
| Khác | Resend (email alert), Zalo OA API, Cloudflare Turnstile, Microsoft Clarity |
src/
middleware.ts # Refresh session Supabase mỗi request
app/
page.tsx # Trang chủ
search/ # Tìm kiếm + lọc + bản đồ kết quả
listings/[id]/ # Chi tiết tin
projects/[id]/ # Chi tiết dự án
thong-ke/ dinh-gia/ thue-hay-mua/ tinh-lai-vay/ # Công cụ & thống kê
auth/ account/ dashboard/ tin-nhan/ admin/ # Auth, hồ sơ, đăng tin, chat, quản trị
api/chat/ # Chatbot AI
api/valuation/ # API định giá
api/zalo/webhook/ # Bot Zalo OA
components/ # ListingCard, ListingMap, PriceMap, ChatWidget, Gallery, ...
lib/ # supabase clients, gemini, geo, format, types, ...
crawler/
chotot.mjs mogi.mjs batdongsan.mjs facebook.mjs # Crawler từng nguồn
merge.mjs geocode-all.mjs quality-gate.mjs embed.mjs
daily.mjs # Orchestrator: crawl → merge → geocode → seed Supabase
alerts.mjs # Email báo tin mới khớp tìm kiếm đã lưu
supabase/
schema.sql # Bảng + RLS + trigger
migrations/ # Vá bảo mật + pgvector (BẮT BUỘC chạy sau schema)
seed.mjs # Nạp tin mẫu (service_role)
.github/workflows/daily-crawl.yml # Cron crawl 09:00 & 15:00 giờ VN
Chợ Tốt (API) ─┐
Mogi (HTML) ─┤
Batdongsan ─┼─► chuẩn hoá ─► AI Gemini (lọc rác, trích field, cò/cá nhân, cảnh báo giá)
nhadat (HTTP) ─┤
Facebook (PW) ─┘
└─► merge (dedupe) ─► geocode bù toạ độ ─► seed Supabase
│
Next.js trên Vercel đọc trực tiếp ◄┘
Seed chỉ xoá–chèn tin source = 'crawl'; tin người dùng tự đăng (agent, zalo_oa) luôn được giữ nguyên.
1. Tạo project Supabase → lấy Project URL, anon key, service_role key (Project Settings → API).
2. Chạy SQL — Supabase SQL Editor: chạy supabase/schema.sql, sau đó toàn bộ file trong supabase/migrations/ theo thứ tự (migration 001 vá bảo mật, bắt buộc).
3. Cấu hình env
cp .env.local.example .env.local
# Điền: NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY,
# SUPABASE_SERVICE_ROLE_KEY, GEMINI_API_KEY, NEXT_PUBLIC_SITE_URL
4. Cài & nạp dữ liệu mẫu
npm install
node --env-file=.env.local supabase/seed.mjs # nạp tin mẫu
# hoặc cào dữ liệu mới toàn bộ nguồn:
node --env-file=.env.local crawler/daily.mjs
5. Chạy
npm run dev # http://localhost:3000
GitHub Actions (daily-crawl.yml) chạy 09:00 & 15:00 giờ VN, hoặc bấm Run workflow chạy tay.
Secrets cần thiết (GitHub → Settings → Secrets → Actions): NEXT_PUBLIC_SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY, GEMINI_API_KEY (thêm GEMINI_API_KEY2..5 từ các Google account khác nhau để tăng quota). Riêng Facebook phải cào ở máy nhà (crawl-local.bat) vì IP GitHub Actions bị FB chặn.
PROJECT.md — tài liệu handoff chi tiết: trạng thái, secrets, gotcha, kế hoạch.crawler/CHAY-TREN-MAY.md, crawler/CHAY-24-7.md — hướng dẫn cào ở máy cá nhân.crawler/ZALO-BOT.md — thiết lập bot Zalo OA.SUPABASE_SERVICE_ROLE_KEY chỉ dùng ở server/CI — không bao giờ đưa lên client hay commit.crawler/fb-cookies.json là credential sống, đã gitignore — không commit; dùng account Facebook phụ.supabase/migrations/001_security_fixes.sql để vá lỗ hổng tự phong admin.