8 points par baeba 2024-08-28 | 16 commentaires | Partager sur WhatsApp

Il s’agit d’une application Android qui permet de rechercher des vols intérieurs
et d’effectuer la réservation sur le site de la compagnie aérienne.

Comme je voyage souvent à Jeju à titre personnel,
j’ai eu l’idée de la créer en cherchant un moyen simple et rapide
de trouver des billets d’avion à bas prix.

[ Fonctionnalités principales ]

  • Comparaison et recherche de billets d’avion
  • Réservation possible directement sur le site de la compagnie aérienne

[ Points pris en compte ]

  • L’application a été conçue pour rester légère afin de pouvoir fonctionner sur des smartphones peu puissants.
  • Si l’application existante de la compagnie aérienne est installée, il est possible d’ouvrir celle-ci.

[ Différences avec les autres applications ]

  • Aucun frais de service.
  • L’utilisateur peut réserver directement ses billets via l’application.
  • Aucune donnée personnelle demandée. Aucune connexion requise.

[ Technologies utilisées ]

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

Si vous avez des questions sur le développement, je vous répondrai également.
Comme je l’ai créée comme projet de loisir, il y a beaucoup de points perfectibles.
Je vous serais reconnaissant pour tout retour à ce sujet.

16 commentaires

 
sonhy02 2024-09-04

Comment avez-vous analysé l’API du site de la compagnie aérienne ?

 
baeba 2024-09-05

Je l’ai fait à la dure. -_-

Korean Air, Asiana, Jin Air, Jeju Air, T’way, Air Seoul, Air Busan, Eastar
Google Flights, Naver Flights, Webtour, Interpark Flights, etc.
Je suis allé sur les sites web des compagnies aériennes présentées en Corée,
et j’ai ouvert un débogueur ainsi qu’une capture des paquets réseau pour chacune, une par une,
afin d’analyser comment elles échangeaient entre elles.

À force d’analyser, on finit par voir la voie à suivre.

 
sonhy02 2024-09-05

J’aimerais bien l’analyser moi aussi, mais en regardant, il y a quelque chose que je n’arrive pas très bien à voir T_T Vous pourriez me donner au moins quelques conseils..?

 
baeba 2024-09-05

Et puis...
Comme les systèmes de paiement diffèrent énormément d’une compagnie aérienne à l’autre,
si on essaie de lancer le paiement dans une webview,
toutes sortes d’erreurs se produisent.
Pour l’expliquer simplement,
comme lorsqu’on installe un programme de sécurité pour faire des opérations bancaires sur PC,
il y a aussi des cas où il faut installer un programme de sécurité pour Android
pour que le paiement fonctionne.

S’il y a 5 modules de paiement pour 1 compagnie aérienne,
alors avec 8 compagnies, il faut faire environ 40 tests.
C’est difficile pour une seule personne de faire ça.

J’ai posé brièvement la question sur la façon de réserver des billets d’avion dans une autre communauté...
et apparemment, les gens cherchent seulement les prix
sur Naver, Interpark, Google Flights ou ce genre de services.
Et pour la réservation proprement dite, ils passent par l’application de la compagnie aérienne.

L’intention initiale de l’application que j’ai créée était similaire.
Rechercher... puis, sans ouvrir l’application de la compagnie aérienne,
aller directement à la page de résultats de recherche du site de la compagnie pour payer tout de suite...

 
baeba 2024-09-05

Si je peux vous donner un conseil...
il existe le navigateur pour développeurs de Firefox.
Les outils de développement de Chrome sont pas mal aussi.
Mais il y a quelques différences.

En général, l'API est appelée puis il y a une redirection vers la page suivante...
il n'est donc pas facile de déterminer comment l'API réelle est appelée.
On peut soit arrêter brutalement la page web avant que la redirection ne se fasse...

Sinon...
en lançant un programme de capture de paquets réseau
et en surveillant le trafic, vous pouvez trouver l'API finale.

Même si vous trouvez l'API...
si la clé d'authentification, les informations de cookie et les informations de session associées ne correspondent pas,
même en appelant cette API, une erreur se produira.

Comme chaque compagnie aérienne a ses propres particularités,
il faut vraiment des astuces -_-.

Le plus difficile, c'est Korean Air !! Ils utilisent Angular,
ce qui rend le reverse engineering très difficile.

J'ai failli tout laisser tomber...
J'ai galéré pendant environ deux ans, haha. Comme je ne suis pas très futé... ce sont mes mains et mes pieds qui ont souffert...

 
sonhy02 2024-09-08

Je commence par Jin Air, et je me demandais si je pouvais vous demander comment vous aviez géré les valeurs de x-csrf-token et des cookies...? Pour les autres compagnies aériennes, je n’ai pas encore trouvé la bonne approche, mais pour Jin Air, j’ai réussi à comprendre comment envoyer la requête ; le problème, ce sont ces deux valeurs T_T

 
baeba 2024-09-09

Si vous appuyez sur F12 dans Chrome, Firefox ou Edge,
les outils de développement s’ouvrent.
Sélectionnez l’onglet Débogueur, puis vérifiez le panneau Sources à gauche.
Ensuite, si vous sélectionnez l’onglet Stockage, vous verrez à gauche des éléments comme le stockage local, le stockage de session, le stockage en cache, IndexedDB et les cookies.
Vérifiez tout cela...

Sélectionnez ensuite l’onglet Réseau, puis observez comment les paquets circulent lorsque vous cliquez sur la page web.
Une fois que vous avez compris globalement,

placez des points d’arrêt dans l’onglet Débogueur,
et, dans cet état,
vous devez vérifier un par un comment la page web échange avec le serveur.

Chez Jin Air, c’est plutôt simple^^;;; même si l’interface a récemment été refondue de façon plus jolie.
La logique interne, elle, n’a presque pas changé par rapport à avant (à il y a deux ans).

Quand le token généré par le serveur est transmis au client, vérifiez où il est stocké
dans les espaces de stockage internes du navigateur web.

Dans mon cas, je me contente simplement des informations utilisateur et des informations de date
pour me déplacer jusqu’à l’écran correspondant,
puis faire défiler l’écran jusqu’à l’emplacement de l’horaire concerné, et c’est tout.

À partir de là, on peut aussi cliquer sur le prix et déclencher la connexion,
mais cette partie dépend trop des cas...

Je l’ai donc laissée à l’utilisateur pour qu’il puisse agir librement.

Pour l’expliquer plus simplement,
l’utilisateur n’ouvre pas l’application de la compagnie aérienne,
mais utilise simplement le navigateur web qu’il emploie le plus sur son smartphone (Chrome, Samsung Internet, etc.)
pour accéder au site de la compagnie aérienne, faire une recherche,
se connecter et payer.

Mais si on fait ça avec une WebView,
il y a énormément de limitations, donc ça ne peut pas être implémenté correctement.
Chaque compagnie aérienne a été développée avec toutes sortes de logiques étranges qui lui sont propres...
Rien que pour Jin Air, il doit déjà y avoir plusieurs systèmes de paiement.
Et il faut tous les tester en intégration...

 
sonhy02 2024-09-05

En voyant aussi ce post, je vais essayer de me concentrer sur les compagnies de la ligne que je prends souvent, mais je sens que je vais aussi pas mal galérer lol
Merci

 
kdhyo98 2024-08-30

Quel super projet !! Je n’ai pas d’Android T_T, donc j’attends avec impatience une version iOS ou une page web !!

 
baeba 2024-09-02

C’était une web app… j’aurais donc aussi pu en faire une simple page web… ^^
Comme la gestion d’un serveur me gênait un peu -_-
j’ai simplement mis directement sur le téléphone tous les fichiers destinés à la page web.
Du point de vue de l’utilisateur, comme il n’y a pas de connexion à un serveur…
la réactivité est aussi plus rapide…

Du coup…
il y avait beaucoup de contraintes de sécurité et de conflits liés à ça,
et j’en ai un peu bavé pendant le développement.
En particulier, pour les modules de paiement,
chaque compagnie aérienne avait son propre système, tous très différents les uns des autres, avec toutes sortes de solutions de paiement branchées dessus ;
je m’en suis rendu compte juste avant la sortie,
et ça a été éprouvant de tout tester.

 
kandk 2024-08-30

Moi aussi, il m’arrivait parfois de créer un crawler au moment d’acheter pour chercher le prix le plus bas, donc ça a l’air utile haha.
J’ai une question : il y avait souvent beaucoup d’offres qui n’apparaissaient pas sur Skyscanner ?

 
baeba 2024-08-30

Les sites étrangers de recherche de vols comme Skyscanner prennent en charge des recherches à l’échelle mondiale.
Autrement dit, comme ils visent à proposer le prix le plus bas pour les déplacements entre pays... ce n’était pas vraiment adapté aux vols intérieurs.

Pour les vols domestiques, l’idée de départ était simplement de permettre de voir facilement en une seule fois la compagnie aérienne, la date et l’heure souhaitées.

Au début, je voulais effectuer une recherche automatique (?) afin d’aligner, pour une date précise, la compagnie, l’horaire et le prix,
et envoyer une alerte... mais j’ai mis cette fonctionnalité de côté pour l’instant...
À la place, comme dans les applications de billets d’avion existantes, j’ai fait en sorte qu’on puisse rechercher, filtrer facilement, puis aller directement sur le site de la compagnie aérienne
pour effectuer la réservation.

 
bncgood 2024-08-28

Vous avez créé un service formidable.

  1. Les informations tarifaires des billets d’avion intérieurs sont-elles obtenues par screen scraping ?
  2. Comme des problèmes de vitesse doivent inévitablement survenir, utilisez-vous un cache ?
 
baeba 2024-08-28

Je n’ai pas utilisé de screen scraping.
Je n’utilise pas de cache.
J’ai analysé manuellement en interne, une par une (-_-) les informations transmises par les compagnies aériennes aux pages web des utilisateurs pour n’en extraire que celles dont j’avais besoin,
et construire ainsi les informations de prix...

J’avais envisagé de le faire côté serveur...
mais à cause du coût du serveur...
j’ai finalement tout traité directement dans la webview.

 
bncgood 2024-08-29

Waouh, c’est impressionnant. Vous n’avez pas prévu de version iOS ?

 
baeba 2024-08-30

J’ai acheté un Mac mini pour la développer pour iOS. ^^