App para Android com busca e comparação em tempo real de passagens aéreas domésticas
(play.google.com)Este é um app para Android que permite pesquisar passagens aéreas domésticas e fazer a reserva no site da companhia aérea.
Como pessoalmente viajo com frequência para a Ilha de Jeju, tive a ideia de criá-lo enquanto procurava uma forma prática e rápida de encontrar passagens com preços mais baratos.
[ Principais recursos ]
- Busca e comparação de passagens aéreas
- Possibilidade de reservar a passagem diretamente no site da companhia aérea
[ Pontos considerados ]
- Foi desenvolvido para ser leve, de modo a funcionar em smartphones com especificações mais modestas.
- Se já houver um app da companhia aérea instalado, ele pode ser aberto por meio dele.
[ Diferenças em relação a outros apps ]
- Sem taxa.
- O usuário pode reservar a passagem diretamente por meio deste app.
- Não solicita informações pessoais. Não é necessário fazer login.
[ Tecnologias utilizadas ]
- Android : WebView, java
- Frontend : Vanilna JS, CSS, Webpack, Swagger API
Se quiserem, também posso responder perguntas relacionadas ao desenvolvimento.
Como foi feito como hobby, ainda há muitos pontos a melhorar.
Agradeço qualquer feedback a respeito.
16 comentários
Como vocês analisaram a API do site da companhia aérea?
Fiz isso na base da força bruta. -_-
Korean Air, Asiana, Jin Air, Jeju Air, T'way, Air Seoul, Air Busan, Eastar
Google Flights, Naver Flights, Webtour, Interpark Flights etc.
Entrei nos sites das companhias aéreas apresentadas no país
e deixei abertos, um por um, a janela do depurador e a captura de pacotes de rede
para analisar como eles trocavam informações entre si.
Enquanto você analisa, começa a enxergar o caminho (?).
Eu também queria analisar, mas olhando assim tem alguma coisa que não estou conseguindo ver direito T_T Será que você poderia dar pelo menos alguma dica..?
E mais...
como o sistema de pagamento varia demais entre cada companhia aérea,
se você tentar fazer o pagamento dentro de uma webview,
vão acontecer erros de todo tipo.
Explicando de forma simples,
do mesmo jeito que no PC às vezes é preciso instalar programas de segurança para usar internet banking,
em alguns lugares o pagamento só funciona
se você instalar um aplicativo de segurança para Android.
Se uma companhia aérea tiver 5 módulos de pagamento,
então, com 8 companhias, é preciso fazer cerca de 40 testes.
É difícil uma pessoa sozinha dar conta disso.
Perguntei rapidamente em outra comunidade como as pessoas fazem para reservar passagens aéreas...
elas pesquisam só o preço em lugares como Naver, Interpark ou Google Flights.
E a reserva de fato
é feita pelo app da companhia aérea.
O app que eu criei também tinha uma proposta parecida no começo.
Pesquisar... e, sem abrir o app da companhia aérea, ir direto para a
página de resultados de busca do site da companhia e pagar ali mesmo..
Se eu puder dar um conselho...
existe o navegador para desenvolvedores do Firefox.
As ferramentas de desenvolvimento do Chrome também são boas, mas
há algumas diferenças.
Normalmente a API é chamada e depois redireciona para a próxima página...
por isso não é fácil descobrir como a API real está sendo chamada.
Dá para fazer na força bruta, interrompendo a página antes de o redirecionamento acontecer...
Ou então...
abre um programa de captura de pacotes de rede
e monitora que dá para encontrar a API final.
Mesmo que você encontre a API...
se a chave de autenticação, as informações de cookie e os dados de sessão relacionados não baterem,
mesmo chamando essa API vai dar erro.
Como cada companhia aérea tem suas próprias particularidades,
realmente precisa de uns truques -_-.
O lugar mais difícil é a Korean Air!! Como usa Angular,
é muito difícil fazer engenharia reversa.
Teve hora que pensei em largar tudo...
Fiquei uns 2 anos quebrando a cabeça nisso. hahaha Como não sou muito esperto... minhas mãos e meus pés é que sofreram...
Primeiro estou tentando com a Jin Air; será que posso perguntar como vocês trataram os valores de
x-csrf-tokene docookie...? Nas outras companhias aéreas ainda não consegui entender direito, mas na Jin Air eu já descobri como a requisição deve ser enviada; o problema agora são esses dois valores T_TNo Chrome, Firefox ou Edge, se você apertar F12,
as ferramentas de desenvolvedor aparecem.
Aqui, selecione a aba de depuração... e confira a janela de fontes à esquerda.
Se escolher a aba de armazenamento, à esquerda vão aparecer itens como armazenamento local, armazenamento de sessão, armazenamento em cache, Indexed DB e cookies.
Verifique isso...
Depois selecione a aba de rede... e, ao clicar na página web, observe como os pacotes vão e voltam.
Quando entender mais ou menos,
coloque breakpoints na aba de depuração
e, nesse estado,
você precisa verificar um por um como a página web se comunica com o servidor.
Na Jin Air é relativamente fácil^^;;; embora recentemente a interface tenha sido reformulada e ficado mais bonita.
A lógica interna é antiga (quase não mudou em relação a 2 anos atrás).
Quando um token gerado no servidor passa para o cliente, veja em qual lugar do armazenamento interno do navegador ele é salvo.
No meu caso, de forma simples, eu só uso as informações do usuário e da data
para ir até aquela tela...
e depois apenas rolo a tela até a posição daquele horário e termino.
Aqui até daria para clicar no preço e fazer login, mas
essa parte depende muito de cada caso...
Então deixei para o usuário poder fazer isso livremente.
Explicando de forma mais simples,
o usuário não abre o app da companhia aérea;
ele simplesmente usa um navegador que já utiliza bastante no smartphone (Chrome, Samsung Internet etc.)
para acessar o site da companhia aérea, pesquisar,
fazer login e pagar.
Mas, se fizer isso com WebView,
há muitas limitações e não dá para implementar direito.
Cada companhia aérea implementa isso com lógicas muito peculiares e diferentes...
Mesmo a Jin Air provavelmente tem vários sistemas de pagamento.
Aí teria que fazer todos os testes de integração disso...
Eu também vi este post e estou pensando em fazer algo focado nas companhias aéreas da rota que pego com frequência, mas acho que também vou penar bastante kkkkk
Obrigado
Que projeto incrível!! Como não tenho Android T_T, vou ficar na expectativa por uma versão para iOS ou uma página web!!
Como era um web app... eu poderia ter feito também como uma página web... ^^
Como eu tinha preguiça de gerenciar servidor -_-
simplesmente coloquei todos os arquivos da página web direto no celular.
Do ponto de vista do usuário, como não acessa um servidor..
a velocidade de resposta também é rápida..
Por isso...
havia muitas restrições e conflitos de segurança relacionados,
então sofri um pouco durante o desenvolvimento.
Principalmente os módulos de pagamento
variam absurdamente de uma companhia aérea para outra, e cada uma vinha com todo tipo de sistema de pagamento,
então só fui descobrir isso logo antes do lançamento
e foi bem difícil testar tudo.
Eu também, às vezes, quando ia comprar, criava um crawler para pesquisar o menor preço, então acho que vai ser útil haha
Tenho uma dúvida. Havia muitas coisas que não apareciam no Skyscanner?
Os sites estrangeiros de busca de passagens aéreas, como o Skyscanner, oferecem suporte a buscas em escala global.
Ou seja, como o foco é encontrar o menor preço para deslocamentos entre países... para voos domésticos não era muito bom.
A ideia inicial de desenvolvimento para voos domésticos era simplesmente permitir ver de uma vez, de forma fácil, a companhia aérea, a data e o horário desejados.
No começo, a ideia era pesquisar automaticamente (?) para alinhar companhia aérea, horário e preço em uma data específica
e enviar um alerta... mas deixei essa função de lado por enquanto...
Em vez disso, fiz com que fosse possível pesquisar como nos apps de passagens existentes, filtrar facilmente e ir direto para o site da companhia aérea
para fazer a reserva.
Vocês criaram um serviço incrível.
Não usei screen scraping.
Não uso cache.
Peguei as informações enviadas pelas companhias aéreas para a página web do usuário,
fui fazendo o parsing internamente uma a uma (-_-) e extraindo só o que precisava
para montar as informações de preço...
Eu até tentei fazer isso no servidor...
mas por causa do custo do servidor...
acabei processando tudo no
webview.Uau, isso é incrível. Vocês têm planos para iOS?
Comprei um Mac mini para fazer a versão para iOS. ^^