尚未收集儲存庫資訊。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
Агрегатор аренды жилья на Ко Пхангане — Telegram + фильтры
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Нейтральный агрегатор-поисковик жилья на острове Ко Пханган. Собирает объявления об аренде/продаже из Facebook (главный источник) и Telegram, приводит к единому формату и отдаёт через витрину с фильтром + картой и бота с подпиской на фильтр.
Зачем: в Facebook Marketplace почти нет фильтрации, в Telegram объявления тяжело искать. Ценность продукта = нормальный фильтр (район / цена / спальни / даты / бассейн) поверх всего этого хаоса. Каждое объявление ведёт ссылкой на первоисточник.
Один конвейер от сырого поста до карточки в витрине. Большинство звеньев уже сделано и работает бесплатно на демо-данных; платные звенья (FB-сбор, VPS, API-ключ) включаются по мере бюджета и не меняют остальную трубу.
Facebook (главный источник, по объёму) Telegram (постоянный мониторинг)
│ │
└────────────────────┬───────────────────────────┘
▼
ingest/ — сбор сырых постов → raw_post
• t.me/s превью без аккаунта ........ 🟢 готово, проверено на живых данных
• Telethon userbot 24/7 ............. 🟡 заготовка · ждёт VPS ~$5/мес + аккаунт
• Apify + тайский резидентный прокси 🔴 чек-лист · ~$60–110/мес (FB)
▼
parser/ — сырьё → фильтруемые поля
• parse.py — разбор через Claude ..... 🟡 заготовка · ждёт ANTHROPIC_API_KEY
• normalize_district — район→канон ... 🟢 готово (11/11, exact+fuzzy)
• dedup — склейка одного дома FB+TG .. 🟢 готово (тест TG+FB → 1 карточка)
• freshness — active/rented/expired .. 🟢 готово (авто-expire 45 дн)
• benchmark — цена к рынку (Airbnb) .. 🟢 готово (пока сид-медианы)
▼
db/schema.sql — Postgres / Neon ........ 🟢 free tier (PDPA-safe: факты+ссылка)
▼
┌────────────────┴─────────────────┐
▼ ▼
web/ витрина bot/ подписка на фильтр
фильтр + карта + бенчмарк пуш «новый дом под твой фильтр»
🟢 готово (самодостаточный html) 🟢 движок готов · ждёт токен + поток
Легенда: 🟢 бесплатно и сделано · 🟡 дёшево, ждёт ключ/аккаунт · 🔴 основная статья расходов (FB).
| Часть | Модуль | Статус | Деньги |
|---|---|---|---|
| Газеттир районов | data/districts.json | ✅ 21 район + алиасы | бесплатно |
| Модель данных | db/schema.sql | ✅ есть | бесплатно |
Telegram через t.me/s | ingest/telegram_preview.py | ✅ 22 поста собрано | бесплатно |
| Нормализация района | parser/normalize_district.py | ✅ тест 11/11 | бесплатно |
| Фильтр (ядро) | parser/filter_match.py | ✅ общий с витриной/ботом | бесплатно |
| Дедуп FB+TG | parser/dedup.py | ✅ тест пройден | бесплатно |
| Свежесть/expire | parser/freshness.py | ✅ тест пройден | бесплатно |
| Бенчмарк к рынку | parser/benchmark.py | ✅ на сид-медианах | бесплатно |
| Витрина | web/build.py → index.html | ✅ фильтр+карта+бренд | бесплатно (Vercel hobby) |
| Бот подписки | bot/subscribe_bot.py | ✅ движок+демо | бесплатно (токен у @BotFather) |
| Claude-разбор | parser/parse.py | ⏳ заготовка | ключ API <$5/мес |
| Telegram 24/7 | ingest/telegram_telethon.py | ⏳ заготовка | VPS ~$5/мес |
| Facebook-сбор | ingest/fb-setup-checklist.md | ⏳ чек-лист | ~$60–110/мес |
| Реальные медианы рынка | ingest/market_airbnb_booking.py | ⏳ скелет | платно (как FB) |
Полный план и порядок включения платных звеньев — в docs/roadmap.md.
Агрегатор умирает не от падения, а от тишины: витрина продолжает выглядеть рабочей, пока данные под ней протухают. Три команды, которые держат это под контролем:
python3 scripts/data_health.py # свежесть, полнота разбора, дубли, источники
python3 scripts/reparse.py # что изменится, если перечитать базу текущим парсером
python3 scripts/reparse.py --apply # применить (делает .bak)
data_health.py возвращает ненулевой код, если есть проблемы, и умеет --alert
(тревога в Telegram) и --json — его можно повесить на таймер рядом со сборщиком.
reparse.py нужен после каждой правки парсера: backfill_parse.py только дополняет
пустые поля и не исправляет то, что разобрано неверно.
Свежесть объявлений считается в браузере от текущего времени, а не при сборке —
иначе страница, пролежавшая неделю, продолжала бы показывать «сегодня» (см. assessFresh
в web/build.py, зеркало parser/freshness.py).
| Переменная | Зачем | Если не задана |
|---|---|---|
SABAI_SITE_URL | абсолютные ссылки в OG-мете, canonical, sitemap | адрес на Vercel |
SABAI_CONTACT_TG | контакт на витрине и на странице приватности | блок контактов скрыт |
SABAI_CONTACT_EMAIL | почта там же | не показывается |
SABAI_BOT_USERNAME | кнопка «следить за поиском» → бот с готовым фильтром | кнопка не рисуется |
Продукт отдельный и не брендирован как RW — это сознательно (нейтральный
агрегатор всех, без конфликта интересов). Код-ядро скопировано из наработок RW
(витрина /listings, газеттир районов, парсер на Claude, коллекторы рынка), но
живой связи нет: отдельный репозиторий, отдельная база, отдельный домен.
Приватные данные RW сюда не попадают.
docs/ — архитектура, дорожная карта, нейминг, юридика (PDPA), дизайн-система
data/ — газеттир районов (канон+алиасы+коорд), демо-выборки, сид-медианы рынка
db/ — схема базы (объявление, подписки, дедуп, бенчмарк)
ingest/ — сборщики источников (TG-превью 🟢, Telethon 🟡, FB-чек-лист 🔴)
parser/ — разбор и обогащение: parse · normalize · filter_match · dedup · freshness · benchmark
web/ — генератор витрины (build.py → самодостаточный index.html) + лого brand.svg
bot/ — Telegram-бот «подписка на фильтр»
Запустить локально (всё бесплатно, без ключей и сети):
python3 web/build.py # пересобрать витрину → web/index.html (открыть двойным кликом)
python3 bot/subscribe_bot.py --demo # офлайн-демо разбора запроса и подбора
python3 parser/dedup.py # самотесты движков (dedup / freshness / filter_match / benchmark)
Подробности для ассистента — в CLAUDE.md.