crafted by Mize ↗
Open Repository Intelligence Open Repository Intelligence
CodeLens ACTIVE
CodeLens Engine
StatusOnline
Versionv0.4
ModelClaude Sonnet
Latency—
0
FAIR
いくつかの問題があります
susumuiwamoto1717-stack/vibe-55-haneda-flight-board
「個人利用の範囲で」と免責しながら非公開APIをブラウザ偽装で叩き、テストゼロで本番デプロイまで走り切る、スポッター魂とエンジニアリング規律の壮絶なトレードオフ。
⭐ 0 Stars
·
🍴 0 Forks
·
📝 27 Commits
·
💬 0 Issues
·
🔵 HTML
🔍 重要ファイル 4 件を精査 全 11 ファイル中 AI が優先度順に選択
0
✦ 品質
0
🛡 セキュリティ
0
⚙ 保守性
📋 概要

羽田空港の公式(非公開)APIからフライトダイヤを取得し、FIDS風UIで表示するPython製ローカルWebアプリ。fetch_haneda.py・fetch_aircraft.py・server.pyの3スクリプト構成で、GitHub Actionsによる自動更新とVercelデプロイを組み合わせている。

🎯 今すぐ直すべき3点
  1. server.py do_GET内の /api/update エンドポイントにレート制限を追加する。現状は無制限にrun_update()(subprocess起動)を呼べるため、ローカルとはいえ連打やスクリプトからの悪用でCPU/ネットワークを枯渇させられる。time.time()ベースの最終実行時刻チェック(例: 60秒以内は429を返す)を実装すること。
    ↗
  2. server.py run_update()内のsubprocess.run([sys.executable, 'fetch_haneda.py'])はcheck=Trueだが、fetch_aircraft.pyはcheck=Trueなしで失敗を無視している。失敗時のエラーをログ出力し、/api/updateのレスポンスに部分失敗を明示するよう修正すること。
    ↗
  3. fetch_aircraft.py aerodatabox_key.txtをopen()で読み込む際に例外処理がなく、ファイルが壊れていると未処理例外でクラッシュする。また、keyファイルをgit管理対象から除外する.gitignoreエントリ(aerodatabox_key.txt, key.txt)が存在するか確認し、なければ追加すること。
    ↗
🔍 検出された問題 (6件)
🟥 Critical
テストが一切存在しない
Repository Factsでtests=none(探索済みで不在)が確認されている。fetch_haneda.pyのconvert()関数やfetch_aircraft.pyのnorm_fl()など、フライトデータの変換・正規化ロジックに対するユニットテストが皆無。非公開APIの仕様変更でデータ構造が変わった際に、サイレントに壊れたデータが flights_data.js に書き出されても検知できない。
🟥 Critical 📄 server.py
/api/update エンドポイントにレート制限なし
server.pyのdo_GET()は/api/updateへのリクエストを無制限に受け付け、毎回subprocess.run()で外部スクリプトを起動する。ローカル用途とはいえ、スクリプトや連打で羽田公式APIへの過剰リクエストが発生し、IPブロックや公式サービスへの負荷増大を招く。README自体が「1時間1回に抑えた構成」と明記しているにもかかわらず、ローカルサーバーにはその制約が実装されていない。
🟧 Warning 📄 server.py
fetch_aircraft.pyのサブプロセス呼び出しでエラーが握り潰される
server.pyのrun_update()でfetch_aircraft.pyをsubprocess.run()するときcheck=Trueが指定されておらず、fetch_aircraft.pyが失敗(APIキー不正・ネットワークエラー等)しても例外が発生しない。結果として/api/updateは{ok:true}を返しながら機材情報が更新されない状態になり、ユーザーが問題に気づけない。
🟧 Warning 📄 fetch_haneda.py
非公開APIエンドポイントへの依存
fetch_haneda.pyはtokyo-haneda.comの内部API(/app/api/v2/flight/search)をブラウザ偽装ヘッダーで叩いている。公式に公開されたAPIではないため、仕様変更・ヘッダーチェック強化・エンドポイント廃止で予告なく動作停止する。README自体も「仕様変更で動かなくなる可能性あり」と認めており、フォールバック処理や変更検知の仕組みがない。
🟧 Warning 📄 fetch_haneda.py
fetch_haneda.pyのconvert()関数が肥大化している(truncatedのため全量未確認)
読めた範囲だけでconvert()はすでに30行超のインライン処理(ゲート番号・ステータス・コードシェア・ターミナル抽出)を1関数に詰め込んでいる。ファイルがtruncatedのため全量は不明だが、責務分離が不十分な場合、APIレスポンス構造の変更時に修正箇所の特定が困難になる。
🟨 Suggestion 📄 fetch_aircraft.py
aerodatabox_key.txtのgit管理除外が明示されていない
fetch_aircraft.pyはaerodatabox_key.txtまたはkey.txtからAPIキーを読み込む設計だが、これらのファイルが.gitignoreで除外されているかREADMEおよびコードから確認できない。誤ってコミットするとAPIキーが公開リポジトリに漏洩する。
✅ 良い点
  • server.pyがTCPServerのバインドアドレスを127.0.0.1に限定しており、ローカルサーバーが意図せずLAN全体に公開されるリスクを防いでいる。
  • fetch_aircraft.pyのget_key()が環境変数→ファイルの優先順位でAPIキーを取得する設計になっており、ハードコードを避けつつ複数の運用形態(CI/ローカル)に対応できている。
  • README.mdが起動方法・ファイル構成・滑走路運用ルール・APIエンドポイント仕様・今後の構想まで網羅的に記述されており、初見の開発者がゼロから動かすのに必要な情報が揃っている。

作り切ることが第一歩。改善を続けることがエンジニアリング。

🔧 リファクタ提案
  • fetch_haneda.pyのconvert()関数を、ステータス抽出(_extract_status)・ゲート抽出(_extract_gate)・コードシェア抽出(_extract_codeshare)などの小関数に分割し、単一責務を持たせる。
  • server.pyのrun_update()にlast_run_timeをモジュールレベルで保持するシンプルなレート制限(例: 前回実行から60秒未満ならHTTP 429を返す)を追加し、README記載の「低頻度アクセス」方針をコードで強制する。
  • fetch_haneda.pyとfetch_aircraft.pyのHTTPリクエスト処理をurllib.request直書きからrequestsライブラリ(またはhttpx)に移行し、タイムアウト・リトライ・エラーハンドリングを統一的に記述できるようにする。
🔒 セキュリティ注意点
  • server.pyの/api/updateはGETリクエストで副作用(外部スクリプト実行・外部APIへのリクエスト)を起こすREST原則違反の設計。ローカル限定用途でも、POSTに変更することでブラウザのプリフェッチや<img>タグ等による意図しない起動を防げる。
  • aerodatabox_key.txtおよびkey.txtが.gitignoreに含まれているか必ず確認し、含まれていない場合は即座に追加すること。APIキーが公開リポジトリにコミットされた場合、RapidAPIの無料枠を第三者に消費される。
📤 PRコメント出力

このレビューをGitHub PRコメントとして貼り付けられるMarkdown形式で出力します。