Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
奈良県、奈良市、橿原市、生駒市の入札情報を一元管理
Translation pending
BusinessTypeScript · HTMLGitHub @jonsonpanson114OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗奈良県建築・入札情報収集・分析アプリ
naramaniaは、奈良県内22自治体の入札公告・落札結果を自動収集・分析するWebアプリケーションです。
naramania/
├── src/
│ ├── app/ # Next.jsページとAPIルート
│ ├── components/ # Reactコンポーネント
│ ├── scrapers/ # 入札情報スクレイパー(22自治体対応)
│ ├── services/ # 外部サービス連携(ニュース、AI)
│ └── types/ # TypeScript型定義
├── scripts/ # 一時スクリプト・デバッグファイル
├── public/ # 静的リソース
└── scraper_result.json # スクレイピング結果データ
| 自治体 | スクレイパー |
|---|---|
| 奈良県 | nara_pref.ts(self-hosted runner 必須) |
| 奈良市 | nara_city.ts |
| 橿原市 | kashihara_city.ts |
| 生駒市 | ikoma_city.ts |
| 大和高田市 | yamato_takada_city.ts |
| 大和郡山市 | yamatokoriyama_city.ts |
| 葛城市 | katsuragi_city.ts |
| 五條市 | gojo_city.ts |
| 御所市 | gose_city.ts |
| 天理市 | tenri_city.ts |
| 桜井市 | sakurai_city.ts |
| 宇陀市 | uda_city.ts |
| 田原本町 | tawaramoto_town.ts |
| 広陵町 | koryo_town.ts |
| 香芝市 | kashiba_city.ts |
| 川西町 | kawanishi_city.ts |
| 三宅町 | miyake_city.ts |
| 山添村 | yamazohiragawa_city.ts(YamazomuraScraper) |
| 平群町 | yamazohiragawa_city.ts(HiragawaScraper) |
| 安堵町 | ando_city.ts |
| 高取町 | takatori_ikaruga.ts(TakatoriTownScraper) |
| 斑鳩町 | takatori_ikaruga.ts(IkarugaTownScraper) |
| 三郷町 | sango_town.ts |
| 王寺町 | oji_town.ts |
| 大淀町 | oyodo_town.ts |
年度が替わってもページを追従できるよう、年度依存のURL・日付は
src/scrapers/common/fiscal_year.ts のヘルパーで動的に解決します。
.env.localファイルを作成し、以下の環境変数を設定します:
GOOGLE_GENERATIVE_AI_API_KEY=your_api_key_here
GOOGLE_GENERATIVE_AI_CHAT_MODEL=gemini-3.1-flash-lite
NODE_OPTIONS=--no-deprecation
Vercel では Project Settings > Environment Variables に同じ値を設定してください。
npm install
npm run dev
ブラウザで http://localhost:3000 にアクセスします。
すべての自治体の入札情報を収集する場合:
# PowerShellの場合
powershell -ExecutionPolicy Bypass -Command "cd naramania; npx tsx src/scrapers/index.ts"
# Bash/Command Promptの場合
npx tsx src/scrapers/index.ts
実行時間: 約7〜8分
scraper_result.jsonスクレイパーは以下のロジックで重複を除外します:
各自治体について、入札公告(入札情報) と 開札結果(入札結果) の両方を必ず見る。 どちらか片方だけを見ていると、次のどちらかが起こる。
年度替わりやページ追加でURLが変わっても追従できるよう、 個別ページのIDをハードコードせず、一覧・カテゴリ・indexページから 配下のページを都度解決する方針とする。
収集元の一覧は src/lib/municipality_sources.ts(サイト内の「収集元サイト」ページ)に
実際にスクレイパーが見ているURLを揃えてある。スクレイパーの定数を変えたら必ず両方直す。
片肺運転(公告だけ/結果だけ)の検知は自動化してある。
config/municipality_source_coverage.json の minAnnouncements / minResultsnpm run validate:quality … 保存済みデータに対して警告npm run audit:live-sources … 公開サイトへ実アクセスして自治体ごとに
公告N件 / 結果N件 を出力し、片側0件なら警告npm run report:coverage … 上記の結果を自治体ごとの表にして出力
(GitHub Actions 上では実行結果画面の Summary に表示される)スクレイパーを直したとき、実サイトに対して効いているかを確認する手順。
GitHub の Actions → Verify Source Coverage → Run workflow で
ブランチを選んで実行すると、実サイトへアクセスして自治体ごとの
公告N件 / 結果N件 が実行結果画面に表で出る。ブラウザだけで完結する。
このワークフローは permissions: contents: read で commit も push もしないため、
ブランチ上(PRレビュー中)で実行しても main に影響しない。
対して daily_scrape と live_source_audit は結果を main に commit & push する。
こちらは main 以外での実行時に commit/push をスキップするガードを入れてある
(ガードが無かった頃は、ブランチ上で手動実行するとそのブランチの中身が
main へ push されてしまう状態だった)。
なお workflow_dispatch はワークフローファイルが default ブランチ(main)に
存在しないと実行ボタンが出ない(GitHubの仕様)。新しい検証ワークフローを
追加した直後は、先にそれを main へ入れてから対象ブランチを選んで実行する。
建築・建物系ではない一般業務や古い案件を除外するため、共通フィルタを使用しています。
config/data_filters.json既存データへフィルタを再適用する場合:
npx tsx scripts/reapply_filter.ts
EPI 系自治体の巡回は src/scrapers/common/epi_cloud.ts に共通化してある。
「発注情報の検索」(公告)と「入札・契約結果情報」(結果)の両メニューを、
業務区分(工事・コンサル)× 対象年度ぶん巡回する。
スクレイピング結果を取得します。
スクレイピングを実行します(現在は既存データを返すのみ)。
建設関連ニュースを取得します(15分キャッシュ)。
AIによる案件解析を実行します。
入札チャットに質問を送ります。サイト内データを優先し、必要な場合は Gemini の Google Search grounding を使って Web 補足を返します。
npm run build
npm run build
npm start
または Vercel Platform から直接デプロイします。
新しいコンポーネントは src/components/ に追加します。
新しい自治体のスクレイパーは以下の手順で追加します:
src/scrapers/[municipality]_city.ts を作成Scraper インターフェースを実装src/scrapers/index.ts にインポートして登録Tailwind CSSを使用しています。クラス命名規則に従ってください。
MIT
プルリクエストを歓迎します。
問題やご要望は GitHub Issues までご連絡ください。