8 ポイント 投稿者 baeba 2024-08-28 | 16件のコメント | WhatsAppで共有

国内航空券を検索して、航空会社のホームページで
予約できるAndroidアプリです。

個人的に済州島へ旅行することが多いため、
手軽に素早く安い価格の航空券を探しているうちに
アイデアが浮かんで作りました。

[ 主な機能 ]

  • 航空券の比較検索
  • 航空会社のホームページで直接航空券を予約可能

[ 考慮した点 ]

  • 低スペックのスマートフォンでも動くように軽量に作成。
  • 既存の航空会社アプリがあれば、そのアプリで開けます。

[ 他のアプリとの違い ]

  • 手数料なし。
  • ユーザーがこのアプリを通じて直接航空券を予約可能。
  • 個人情報は要求しません。ログイン不要。

[ 使用技術 ]

  • Android : WebView, java
  • Frontend : Vanilna JS, CSS, Webpack, Swagger API

開発に関する内容も、聞いていただければお答えします。
趣味で作ったため、至らない点も多くありました。
関連してフィードバックをいただけるとありがたいです。

16件のコメント

 
sonhy02 2024-09-04

航空会社サイトのAPIはどのように解析しましたか?

 
baeba 2024-09-05

力技でやりました。 -_-

大韓航空、アシアナ、ジンエアー、チェジュ航空、ティーウェイ、エアソウル、エアプサン、イースター
Google Flights、Naver航空、Webtour、インターパーク航空 など
国内で紹介されている航空会社のホームページに入り、
全部一つひとつデバッガ画面とネットワークのパケットキャプチャを開いておき、
どうやってやり取りしているのか分析しました。

分析していると、道筋(?)が見えてきます。

 
sonhy02 2024-09-05

私も分析してみたいのですが、見ているうちに何だかよく分からなくなってしまって……。少しでもコツを教えていただけますか..?

 
baeba 2024-09-05

そして…
各航空会社ごとに決済システムが千差万別なので、
WebView上で決済を試みると、
ありとあらゆるエラーが発生します。
わかりやすく言うと、
PCでネットバンキングをするときにセキュリティプログラムをインストールするように、
Android向けのセキュリティプログラムをインストールしないと決済できないところも
あるためです。

航空会社1社に決済モジュールが5つあるとして、
航空会社が8社ならおおよそ40通りのテストが必要になります。
これを個人でやるのは大変です。

他のコミュニティで航空券予約をどうしているのか簡単に
質問してみたところ…
NaverやInterpark、Google Flightsなどで
価格だけ検索して、
実際の予約は航空会社のアプリを通じてしているようでした。

私が作ったアプリも、最初の意図はこれと似ていました。
検索して… 航空会社のアプリを立ち上げずに、そのまま航空会社のホームページの
検索結果画面へ移動して、すぐに決済すること…

 
baeba 2024-09-05

アドバイスすると…
Firefox には開発者向けブラウザーがあります。
Chrome の開発ツールも悪くありませんが。
少し違いがあります。

通常は API が呼び出されたあと次のページにリダイレクトされるため..
実際に API がどう呼び出されているのかを突き止めるのは簡単ではありません。
力技でリダイレクトされる前に Web を停止させるとか..

あるいは..
ネットワークパケットキャプチャーのプログラムを立ち上げておいて
モニタリングすれば最終的な API を見つけられます。

API を見つけたとしても..
認証キー、Cookie 情報、関連するセッション情報が合っていなければ
その API を呼び出してもエラーが発生します。

それぞれの航空会社ごとに特徴があるので。
本当に -_- トリックが必要です。

いちばん大変なのは大韓航空です!! Angular を使っていて
リバースするのが非常に難しいです。

やめてしまおうかと思いながらも...
2年くらい試行錯誤しました。haha 頭が悪いせいで.. 手足が苦労しました...

 
sonhy02 2024-09-08

まずジンエアーから試しているのですが、x-csrf-token と cookie の値の処理をどのようにされていたのか、お伺いしてもよろしいでしょうか……? 他の航空会社はまだ要領がつかめていないのですが、ジンエアーはどうリクエストを送ればよいかまでは見つけたものの、この2つの値が問題ですね T_T

 
baeba 2024-09-09

Chrome または Firefox または Edge で F12 を押すと
開発ツールが表示されます。
そこで Debugger タブを選択して、左側のソース画面を確認し、
Storage タブを選ぶと左側に Local Storage、Session Storage、Cache Storage、Indexed DB、Cookie の項目が
あります。これを確認してください...

Network タブを選択して、Web ページを開いたときにパケットがどのように行き来しているのか確認して、
だいたい把握できたら

Debugger タブでブレークポイントを設定して、
この状態で Web ページがサーバーとどのようにやり取りしているのかを
一つひとつ確認しないといけません。

Jin Air は簡単なほうですが^^;;; 最近、画面がきれいにリニューアルされました。
内部ロジックは以前のままで(2年前とほとんど変わっていません)

サーバーで生成された token がクライアントに渡ってきたら、Web ブラウザ内部のストレージの
どこに保存されるのか確認してみてください。

私の場合は単純にユーザー情報と日付情報だけを持って
その画面まで移動するだけにして、
その時間の位置まで画面をスクロールして終わりです。

ここで価格を押してログインさせることもできますが、
この部分はケースバイケースすぎるので...

ユーザーが自由にできるように残してあります。

もっと簡単に説明すると、
ユーザーが航空会社のアプリを起動せずに、
そのままスマートフォンにある、よく使う Web ブラウザ(Chrome、Samsung Internet など)で
航空会社のホームページにアクセスして検索し、
ログインして決済するわけです。

ところが、これを WebView でやると
制約が非常に多くて、まともに実装できません。
航空会社ごとに本当にさまざまな奇妙なロジックで実装されているので...
Jin Air だけでも決済システムがいくつもあるはずです。
これらの連携テストを全部やらないといけないので...

 
sonhy02 2024-09-05

私もこの記事を見て、自分がよく乗る路線の航空会社を中心にやってみようと思っているんですが、私もかなり試行錯誤することになりそうですね(笑)
ありがとうございます

 
kdhyo98 2024-08-30

素晴らしいプロジェクトですね!! Android がないので T_T iOS あるいは Webページを期待しています!!

 
baeba 2024-09-02

Webアプリなので……Webページとして作ることもできましたが…^^
サーバーを管理するのが面倒で -_-
そのままスマホにWebページ用のファイルを全部入れてしまいました。
ユーザーの立場ではサーバーに接続しないので……
反応速度も速いですし……

そういうわけで……
関連するセキュリティ上の制約や衝突が多くて
開発時にはかなり苦労しました。
特に決済モジュールは
航空会社ごとに本当にバラバラで、いろいろな決済システムが組み合わさっていることを
リリース直前に知って
テストするのが大変でした。

 
kandk 2024-08-30

私もたまに買うときにクローラーを作って最安値を検索していたんですが、役に立ちそうですね(笑)
気になる点があります。Skyscanner には出てこないものが多かったのでしょうか?

 
baeba 2024-08-30

Skyscannerのような海外の航空券検索サイトは、グローバルな検索をサポートしています。
つまり、国をまたぐ移動を最安値で探すことに重点があるため…国内向けとしてはあまり向いていませんでした。

国内向けは、ただ自分が希望する航空会社、日付、時間を一度に簡単に見られるようにしよう
というのが最初の開発方針でした…

当初は自動(?)で検索して特定の日付の航空会社、時間、価格を一覧できるようにして
アラームを送ろうとしていたのですが…この機能はいったん保留にして…
既存の航空券アプリのように検索して簡単にフィルタリングし、そのまま航空会社のホームページへ
移動して予約できるようにしました。

 
bncgood 2024-08-28

すばらしいサービスを作られましたね。

  1. 国内航空券の価格情報はスクリーンスクレイピングで処理されているのでしょうか?
  2. 速度の問題が必然的に発生すると思いますが、キャッシュは使われていますか?
 
baeba 2024-08-28

スクリーンスクレイピングは使っていません。
キャッシュは使用していません。
航空会社からユーザー向けWebページに渡される情報を
一つひとつ( -_-) 手作業で内部的にパースして必要な情報だけを取り出し、
価格情報を作りました...

サーバー側でやろうとしましたが..
サーバー費用のために...
そのままWebViewですべて処理しました。

 
bncgood 2024-08-29

わあ、素晴らしいですね。iOS版の予定はありませんか?

 
baeba 2024-08-30

iOS版を作ろうと思って、Mac miniを買いました。^^