Interceptando mensagens de uma web app (Cittamobi) usando o Google Chrome

Nota: este texto é um rascunho. Como ficou duas semanas assim e não tive tempo para voltar a ele, decidi publicar do jeito que está porque é útil assim mesmo.

A minha intenção era ver se eu conseguiria o necessário para escrever meu próprio programa para contornar algumas limitações da app Cittamobi. Por exemplo, sinto diariamente falta do alarme de proximidade do ônibus. A Cittamobi oferece uma API mas o acesso a ela parece ser restrito. Eu queria então interceptar a comunicação da web app que roda no navegador sem ter que instalar um sniffer como o Wireshark e ter que filtrar o resto do tráfego do computador. Comecei instalando o Postman Interceptor, que de cara me mostrou que estava “vendo” as mensagens, mas não mostrava o conteúdo. Ativei “Request Capture” no Interceptor, em seguida instalei o Postman (falei sobre ele aqui) e depois de ativar o Interceptor nele, pude não apenas ver as mensagens enviadas pela web app e as respostas, com também testar no próprio Postman qual seria o mínimo necessário para obter uma resposta do servidor.

Você envia uma solicitação assim (não precisa de cookies, configurar headers… nada):

https://api.cittamobi.com.br/m3p/js/vehicles/service/15323

e recebe do servidor Cittamobi uma resposta assim (os comentários são meus):

“15323” é o número da rota. Cada linha tem um número diferente para IDA e VOLTA e para saber os números correspondentes à linha que você quer, você vai ter que interceptar as respectivas mensagens com a web app rodando.

Recarregue o mapa de forma que todas as linhas sejam apagadas e vá dando zoom devagar. Mensagens desse tipo serão interceptadas:

https://info.cittamobi.com.br/m3p/embedded/predictionMap?0-1.IBehaviorListener.0-mapPanel&out=false&ta=729&ta=708&ta=415&ta=202&_=1552543135484

Vá testando uma por uma. Dê, zoom, teste a mensagem recebida, dê zoom, teste de novo… Note que o número final vai sendo incrementado a cada zoom (também perceba que ele é parecido com o valor “ts” que é recebido junto com cada posição de veículo.

Inicialmente as respostas não vão ter nada interessante, mas uma delas vai ser do tipo:

Role para a direita e você verá na quarta linha uma lista enorme com aparentemente todas as linhas de Recife e seus respectivos códigos de rota. No Postman você não vai ter esse trabalho de rolar pois vai perceber imediatamente que a mensagem é diferente das outras e contém os nomes das linhas.

Possivelmente existe um jeito de obter essa lista de forma muito mais simples através da inspeção do html source da lista drop-down que a app exibe, mas eu não consegui ainda determinar como. Minha proficiência com as ferramentas de desenvolvedor dos navegadores é muita baixa.

Para obter a lista de todos os pontos de uma rota com respectivas coordenadas:

https://api.cittamobi.com.br/m3p/js/stops/service/v2/15323

Resposta:

Usando as informações que obtive como termos de busca encontrei alguém trabalhando em algo semelhante em 2015.

2 comentários
  • Carlos Roque - 1 Comentário

    Oi! Fiquei curioso sobre como o aplicativo funciona, achei bem acessível seu conteúdo e gostaria de tirar algumas dúvidas que foram surgindo nas lidas dos seus posts.

    Atualmente o Cittamobi não tem mais a versão web, o que (no momento) me impossibilitou de encontrar as linhas da cidade que quero analisar (Maceió). Como eu poderia interceptar essas informações? O Fiddler 4 daria cargo disso, interceptando o celular durante o uso do app?

    Outro questionamento surgiu em relação aos resultados que a API retorna, esse Polylines é o que? De que forma posso utilizar isso? Penso que se refira à construção da rota do ônibus no mapa, porém não encontrei nada a respeito dessa forma de código em nenhum lugar, porém os “@s” do código me lembram as coordenadas polares do Autocad.

    • Jefferson - 6.606 Comentários

      Como eu poderia interceptar essas informações? O Fiddler 4 daria cargo disso, interceptando o celular durante o uso do app?

      Você só poderia usar o fiddler se a app estiver rodando em um emulador. Eu não testei isso.

      Com a app em um celular o modo mais “fácil” é interceptar no próprio celular usando uma app como esta:
      https://play.google.com/store/apps/details?id=app.greyshirts.sslcapture&hl=en

      Mesmo assim, eu testei agora e não funcionou. Você consegue ver algumas comunicações da app cittamobi com o servidor, mas ela acusa que não consegue se comunicar com os servidores e você não consegue ver dados de linhas.

      Outro questionamento surgiu em relação aos resultados que a API retorna, esse Polylines é o que?

      Você quase acertou, provavelmente é a rota da linha (não do ônibus) para desenhar sobre o mapa.

      De que forma posso utilizar isso?

      Não sei. Só o que me importa é saber a que distância está o ônibus e isso pode ser determinado pelas coordenadas.

Deixe um comentário para Jefferson Cancelar resposta

Você pode usar estas tags HTML

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

  

  

  

:) :( ;) O_o B) :lol: :huh: :S :D :-P 8-O :yahoo: :rtfm: :dashhead1: :clapping: more »