このツールについて
海外旅行の価格を、同じ条件で並べて比べる個人用のツールです。旅行会社のツアーで買った場合の総額と、航空券とホテルを別々に手配した場合の合計を並べて、どちらが安いかを見ます。今は自分だけで使っていて、公開はしていません。
前回の記事(2026-10-16公開)はこちら → https://qiita.com/rightcross-ae86/items/86cb4e3571e241eb85fe
このツールを最初にご紹介した記事(2026-10-11公開)はこちら → https://qiita.com/rightcross-ae86/items/62ab81f505124b0a6613
この記事について
この記事は、ツールの概要の説明です。何ができるか、どう使うか、画面に何が出るか、どんな部品でできているか、まだ分からないことは何かを書きます。
金額を比べた結果の報告ではありません。結果を載せていない理由は、「分からないこと」に書きました。
この記事では、次のように呼びます。
- 「ツアー」: 旅行会社が売る、航空券とホテルのセット
- 「個別手配」: 航空券とホテルを別々に探して、自分で手配すること
- 「拡張機能」: ブラウザに追加する小さなプログラム
- 「サーバー」: データを預かって集計する、自分で管理しているコンピューター
- 「ダッシュボード」: このツールを操作する、自分用のWebの画面。その中の「旅行比較」のタブを使います
- 「サイトの画面」: ブラウザに表示されている、旅行サイトのページ
- 「検索」: 出発地・行き先・出発日・泊数・人数をそろえて、各サイトを同じ条件で探すこと。このツールの1回分の単位です
- 「比較表」: 1回の検索の結果を、サイトごとに並べた表
先に要点
- 作っているのは、同じ旅行内容で「ツアーの総額」と「個別手配の合計」を並べるツールです
- 使い方は、条件を選ぶ → 各サイトの検索結果を開く → 拡張機能がサイトの画面の価格だけを読んで送る → 比較表を見る、の流れです
- 結果は、ツアー最安・個別手配の合計・差額の3つの数字と、サイトごとの内訳の表で見ます
- この機能のサーバーは、旅行サイトへ自動でアクセスしません。価格を読むのは、自分のブラウザの拡張機能です
- 範囲は、行き先7都市(東南アジア)・サイト10種です。主な出発地は、東京・大阪・名古屋・福岡・札幌です
- 条件が違う金額は並べません。分からないことは、「分からない」と表示します
- 金額を比べた結果は載せていません。確認できていない条件が残っているためです
何ができるのか
- 同じ条件で並べる: 出発地・行き先・出発日・泊数・人数をそろえて、10種のサイトを同じ条件で探します
-
3つの数字を出す
- ツアー最安: ツアーを探す6つのサイトの最安のうち、いちばん安いもの
- 個別手配の合計: 航空券の最安と、ホテルの最安と、現地の交通費(手入力)の合計
- 差額: ツアー最安 − 個別手配の合計。プラスなら、個別手配のほうが安いことを表します
- サイトごとの内訳を出す: 比較表に、サイトごとの最安の値段・読み取りの精度・比較の条件・最安のプランやホテルの名前などが並びます
- 比べられない金額を除く: 人数や出発日が検索と違う金額は、集計に使いません。除いた理由は、表の備考に出ます
- 分からない理由を出す: 金額が出ないときは、0件・対象外・拒否・読めず・未確認のどれかを表示します
- 行き先を足せる: ダッシュボードから都市を追加できます
使い方の流れ
- ダッシュボードの「旅行比較」のタブで、旅行の検索条件を選び、「全サイトで検索を開く」を押します
- サーバーが、条件から各サイトの検索結果のURLを組み立て、自分のブラウザで開きます。URLに入れる行き先や出発地の番号は、サイトごとに別です
- 拡張機能が、開いたサイトの画面に表示されている価格だけを読んで、サーバーに送ります。サーバーから旅行サイトへは、何も送りません
- サーバーが、送られた価格のうち、検索の条件と合っているものだけを集計します
- ダッシュボードで、ツアー最安・個別手配の合計・差額と、サイトごとの内訳を見ます
出発地と行き先を複数選んで、検索を順に自動で行う「まとめて確認」もあります。こちらは、確認のために使います(「確認のしかた」に書きました)。
検索で指定できる条件
検索条件の入力欄は、5つの枠に分かれています。
| 枠 | 指定する項目 |
|---|---|
| ① 行き先 | 出発地・行き先 |
| ② 日程 | 出発日・泊数(1〜30泊) |
| ③ 人数・部屋 | 大人の人数(1〜9人)・部屋数(1〜5室) |
| ④ ホテルの条件 | 宿の種類(すべて/ホテルのみ=ホステル・ドミトリーを除く)・ホテルの星(指定なし/3つ星以上/4つ星以上)・宿の口コミ点数(指定なし/高評価の宿だけ) |
| ⑤ 航空券の条件 | 座席クラス(エコノミー・プレミアムエコノミー・ビジネス・ファースト) |
④のホテルの条件は、ホテルを探す2つのサイトに使います。口コミ点数の「高評価」は、サイトによって基準が違います(6点以上と7点以上)。現地の交通費は、検索のあとに、結果の画面で手入力します。
比較表で見えるもの
結果の上には、次の見出しが並びます。
| 見出し | 意味 |
|---|---|
| ツアー最安 | ツアーを探すサイトの最安のうち、いちばん安いもの(サイト名つき) |
| 航空券最安・ホテル最安 | 航空券を探すサイト、ホテルを探すサイトそれぞれの最安。ホテル最安は、料金の低い順に並べた画面の先頭です(見えている範囲の最安で、全件ではありません) |
| 現地の交通費 | 手入力(円) |
| 個別手配の合計 | 航空券最安 + ホテル最安 + 現地の交通費 |
| 差額(ツアー − 個別) | プラスなら「個別が安い」、マイナスなら「ツアーが安い」と表示します |
その下の比較表には、サイトごとに次の列が並びます。
| 列 | 意味 |
|---|---|
| サイト | サイト名 |
| 種別 | ツアー・航空券・ホテルの別 |
| 値段 | そのサイトの画面で見えた最安の金額 |
| 精度 | 「専用読み取り」=そのサイト専用の読み取りができた。「参考(推定)」=画面の円の金額を推定で拾っただけ。「検索結果0件」。「未対応」。集計に使うのは、専用読み取りだけです。理由が必要なときは、下に小さく注記が付きます(対象外・拒否された・読めず・条件が違うので除外、など) |
| 比較の条件 | 日程の数え方と、金額に含まれるもの(燃油・空港諸税など)。人数や日数、出発日が検索と違うときは、注意と警告が出ます |
| 読み取り元の文言(参考) | 最安のプランやホテルの名前など、読み取った元の文言 |
| 更新 | 価格を読んだ日時 |
| タブ | 「開く(数字)」のボタン。そのサイトの画面を開きます。数字は、そのサイトから受け取ったタブの数です |
画面の上には、「サイトごとに、日数の数え方・出発日・燃油・空港諸税の扱いが違います。金額を比べる前に、下の表の『比較の条件』を確認してください」という注意書きも出ます。
仕組み
部品は3つです。
- 拡張機能: ブラウザに追加します。サイトごとの専用の読み取りがあり、専用がないページは、画面の円の金額を推定する読み取りで拾います(推定は参考表示だけで、集計には使いません)。ポップアップからは、手動で価格を送ったり、読めなかったページのHTMLを送ったりもできます。送るときは、合言葉(トークン)が要ります
- サーバー: 検索の作成、検索URLの組み立て、価格の受信、集計、条件の自動照合を受け持ちます。検索の条件と、サイトごとの最新の価格候補は、データベースに保存します
- ダッシュボード: 「旅行比較」のタブです。検索条件の入力、結果の表示、都市の追加を行います
サーバーが扱う「検索」と、拡張機能が送る「受信内容」は、次のように定義されています。
class SearchIn(BaseModel):
origin: str = "TYO"
dest_code: str = "BKK"
depart_date: str
nights: int = 4
adults: int = 2
cabin: str = "economy"
rooms: int = 1
lodging: str = "all"
rating: str = "all"
stars: str = "all"
...
class OfferIn(BaseModel):
search_id: int
site: str
tab_key: str
url: Optional[str] = None
page_title: Optional[str] = None
candidates: list = []
method: str = "generic"
zero: Optional[str] = None # 検索結果0件の画面の文言(拡張機能v0.1.13〜。価格の候補が無いときだけ使う)
refused: Optional[str] = None # サイトに拒否された画面の文言(403・Access Denied・確認画面など。拡張機能v0.1.15〜。価格の候補が無いときだけ使う)
-
SearchInが検索1回分の条件です。出発地(origin、初期値は東京)・行き先(dest_code、初期値はバンコク。どちらも航空業界で使う3文字のコード)・出発日・泊数・大人の人数・座席クラス・部屋数・宿の種類・口コミ・星です -
OfferInが、拡張機能が1回送る内容です。どの検索の結果か(search_id)、どのサイトのどのタブか(site・tab_key)、開いていたURLとページのタイトル、価格の候補(candidates)、読み取りの方式(method。専用か、推定のgenericか)です。価格が読めなかったときのために、検索結果0件の文言(zero)と、サイトに拒否された画面の文言(refused)を送る欄もあります - 抜粋は実物のままです。離れた箇所を
...でつなぎました
行き先とサイトの番号
サイトの検索結果のURLに入れる行き先や出発地の番号は、サイトごとに別で、計算では出せません。そこで、次の順に使います。
- 確認済みの値
- 実際の検索で覚えた値: 各サイトで手動で検索して「価格を送る」と、サーバーが、送られたURLとページのタイトルから都市の番号を読んで覚えます。タイトルに都市名があるときだけ覚えます
- 一覧データから引いた候補
確認済みの値は、候補で上書きしません。行き先を足すときは、ダッシュボードの「都市の追加」に名前を入れると、候補が出て、英語名・国・番号が自動で入ります。
対応範囲
| 項目 | 内容 |
|---|---|
| 行き先 | 7都市: バンコク・ジャカルタ・ホーチミン・ハノイ・クアラルンプール・バリ島・プーケット |
| 主な出発地 | 東京・大阪・名古屋・福岡・札幌 |
| サイト | 10種: ツアーを探す6・航空券を探す2・ホテルを探す2 |
| 人数 | 大人1〜9名(1名でも使えます) |
確認のしかた
金額が正しいかは、4つの方法で確かめています。詳しい中身は、2026-10-11の記事に書きました。
- サイトの画面との突き合わせ: 条件をそろえて検索し、サイトの画面のタイトルやURLが、検索の条件と合っているかを1件ずつ見ます
- 自動の照合: 開いたURLと、サイトの画面が最後に開いていたURLを比べ、出発地・日付・人数・行き先が書き換えられていないかを見ます
- まとめて確認(自動): 出発地と行き先を複数選んで、検索を順に自動で行います。開始は、ボタンを押したときだけです。1回の実行は最大20件、検索と検索の間は60秒あけます。サイトに拒否されたら、そのサイトは、その実行の間は以降送りません
- 実行の依頼: サーバーに「この条件で確認して」という依頼をコマンドで出すと、ダッシュボードのタブが受けて、まとめて確認を自動で行います。依頼を受け付ける設定は、初期値が「受け付けない」で、タブごとに切り替えます。1回の上限(20件)と間隔(60秒)は、依頼では変えられません
分からないこと
- 金額を比べた結果を載せていない理由: 確認できた条件が一部で、1つの日付の結果から言えることが限られるためです。ツアーと個別手配のどちらが安いかは、この記事では書いていません
- 燃油・空港諸税の込み/別: サイトによって違います。確認できていないサイトは、比較表の「比較の条件」に「未確認」と出ます
- 個別手配の合計は「見えている範囲の最安」: 航空券の最安は乗り継ぎ便のことがあります。ホテルの最安は、「ホテルのみ」や「4つ星以上」にしても、格安の宿になることがあります
- 現地の交通費: 自動では取れません。手入力です
- 人数をURLで指定できないサイト: ツアーを探す6つのサイトのうち2つは、確認した範囲では、人数をURLで指定できません。サイトの画面で人数を直してから価格を送ります。人数が2名以外の検索では、比較表の「比較の条件」に注意が出ます
- 日数・出発日の数え方: サイトによって違います。比較表の「比較の条件」で確認が要ります
- 確認していない組み合わせ: 7つの行き先と全部の出発地の組み合わせは、確認していません。比べたい組み合わせが決まってから確かめる方針です
- サイトの画面の変更: 画面の作りが変わると、読めなくなることがあります。その場合は「読めず」と表示されます
- 公開: 今は個人用で、公開していません。他の人が使う形にするときは、各サイトの規約を確認し直す必要があります
まとめ
- 海外旅行の「ツアーの総額」と「個別手配の合計」を、同じ条件で並べて比べる個人用のツールです
- 使い方は、条件を選ぶ → 各サイトの検索結果を開く → 拡張機能が画面の価格だけを読んで送る → 比較表を見る、の流れです
- この機能のサーバーは旅行サイトへ自動でアクセスせず、条件が違う金額は並べません。分からないことは、「分からない」と表示します
- 行き先7都市・サイト10種が対象です
- 燃油・空港諸税の込み/別が確認できていないサイトがあるなど、分からないことが残っています。金額を比べた結果は、この記事には載せていません
気になる点・ご質問があればコメントでお知らせください。