Como fiz meu Yandex.Transporte com horários e ônibus



Publicado por Mikhail Aksenov, Desenvolvedor .NET, DataArt


Como tudo começou


No outono de 2014, houve boas notícias sobre o lançamento do Yandex.Transport em Voronezh, que mostra o movimento de ônibus e trólebus. Foi muito legal no ponto de ônibus abrir um horário e descobrir que seu ônibus funcionará em 5 minutos.

Mas, depois de alguns meses, tudo correu de acordo com um cenário completamente previsível. Como todo o transporte em Voronezh, do carrinho até o microônibus, funciona em dinheiro, cada motorista está interessado em transportar o maior número possível de passageiros. Como resultado, eles organizam corridas entre si.

Os motoristas usavam o novo serviço para se seguir no mapa, ultrapassando e cortando concorrentes na estrada. Alguns começaram a perder receita, começaram a reclamar com os proprietários das rotas e foram a pessoas que vendiam equipamentos com GLONASS e GPS e enviavam dados sobre os movimentos de carros para a Yandex. A pedido dos proprietários da frota, eles pararam de enviar informações e os ônibus começaram imediatamente a desaparecer do mapa. Agora há um pouco mais deles, mas isso ainda é muito menor do que na realidade.



Para quem tem preguiça de ler mais, proponho um relatório em vídeo sobre este tópico:

Quanto ao resto, descreverei o projeto na forma de texto.

Onde obter os dados?


Ao mesmo tempo, em Voronezh, há um local onde todos os dados são coletados - o Centro de Organização do Tráfego Rodoviário (DPC). Eles têm um aplicativo Web grande e pesado em seu site com JavaScript insustentável e outros artefatos, enquanto tudo nele é fornecido com solicitações POST e nada é armazenado em cache. Usando este site em si, você pode facilmente colocar um serviço que coleta dados sobre a movimentação de ônibus.

Havia uma opção que permite que você cutuque o mapa e descubra quando o ônibus chegará e qual será. Desde que você aproximadamente pare (± 50 metros). No menu, você pode abrir uma lista de rotas e ver exatamente para onde os ônibus vão, mas havia um problema - eles dirigiam estranhamente. Por exemplo, ao longo de Koltsovskaya, uma rua no centro onde você não pode acelerar especialmente, o ônibus avançava e recuava a uma velocidade de cerca de 200 km / h.


Por que Python?


Eu escolhi o Python porque é legal, as baterias estão empacotadas e assim por diante .. E 3.6 porque existe formatação para literais de string, digitação, só isso. Vejamos o que eu basicamente usei:

  • Muitos reclamaram que dirigir o nome exato de uma parada com todos os tipos de sinais de pontuação é muito difícil. Então percebi a possibilidade de busca difusa e criei o primeiro teste de unidade para ela.
  • Todo o sistema está hospedado no Heroku. É grátis, porque não tenho um banco de dados - espero me dar bem com o banco de dados do data center. Concordei em usá-lo com o Centro quando percebi que os dados que eu coleciono através da interface da web não são suficientes.
  • Na verdade, a hospedagem passa pelo servidor da web Tornado. Eu acho que é familiar para quem já encontrou solicitações da Web em Python.
  • Eu precisava do pacote Pytz porque o servidor Heroku está em um fuso horário diferente e os dados chegam até mim sem especificar um fuso horário. Portanto, eu mesmo cuidei da localização.
  • Para criar o bot, usei a biblioteca Python-telegram-bot recomendada . A documentação aqui é bastante adequada e, em geral, a biblioteca atende aos requisitos mínimos viáveis ​​do produto. Inicialmente, todo o projeto era um bot do Telegram, que em resposta ao envio da sua localização enviou uma programação de ônibus.
  • O Firebird, um antigo Interbase, é um banco de dados de código aberto com o qual acho que muitos de vocês já trabalharam. Obviamente, não é tão legal quanto o mesmo PostgreSQL, mas para um número muito grande de consultas é suficiente. No nosso caso, não é mais necessário.
  • Cachetools é um módulo muito simples que permite armazenar em cache cálculos. Obviamente, não se trata de cache de memórias ou cache de páginas da Web, mas de casos em que você precisa de memorização para consultas longas. Basta levá-lo, adicione o decorador apropriado - e tudo funciona. O cache tem opções diferentes, eu uso a versão TTL, que salva os dados pelo tempo especificado, porque sei que os dados não serão atualizados com mais frequência do que em determinados intervalos (no meu caso - 30 segundos).


Funcionalidade de bot


  • / nome do ponto de ônibus próximo - hora prevista de chegada;
  • / números da última rota separados por espaços - últimas paradas;
  • Envio da localização - a hora prevista de chegada para as próximas três paradas;
  • Entrada gratuita - números de rota e distância dos ônibus (ao enviar o local).


Tentei descrever os comandos completamente o suficiente para que as pessoas não perguntassem como usá-los. Existem basicamente dois comandos básicos: nextbus, quando você escreve o nome da parada e envia o local.

Funcionalidade do site


Eu fiz o site o mais minimalista possível. Das bibliotecas de terceiros, usei apenas duas para oferecer suporte à busca e promessa, porque as versões mais antigas dos navegadores pré-instalados nos telefones não podem ficar sem elas. Se você não suportar esses métodos, obterá um macarrão de retorno de chamada bastante pesado para as próprias solicitações. Com a busca, tudo parece mais elegante.



Na verdade, o funcional aqui consiste em 4 pontos:

  1. Chegada Você pode apenas assistir a parada. Ao clicar no botão (a propósito, pode valer a pena fazer um pouco mais - vou pensar nisso!), Você envia sua localização, o sistema procura as três paradas mais próximas a você e exibe informações sobre elas. Você pode inserir o nome da parada e obter informações sobre ela. Como você dificilmente precisa de todos os 20 a 30 ônibus que podem chegar ao ponto, é possível filtrá-los por rota.
  2. Ônibus A segunda página contém informações sobre ônibus. Isso se deve a outra história que me levou a esse projeto. Um belo dia, esqueci o chapéu no ônibus, liguei para a sala de controle e expliquei onde aconteceu. O despachante sugeriu que eu pegasse meu ônibus no centro, onde ele retornaria, dando a volta no terminal. Lembrei-me de que tinha um login e senha do sistema Center for Traffic Management, mas verificou-se que ainda não conseguia rastrear a localização do carro de que precisava através da interface da web. Devolvi o chapéu, mas com grande dificuldade.
    Eu pensei que encontrar um ônibus poderia ser muito mais fácil. Escrevi o número da rota e o sistema mostra os carros na linha, a localização atual e a hora em que eles passaram para no caminho. E mesmo se você souber o número da rota, mas o número do ônibus (isso também acontece), ainda poderá encontrá-lo.
  3. Mapa. Mapa no site sem animação. Aqui você pode selecionar ônibus da lista ou inserir números manualmente, pode filtrá-los. Até 600 ônibus podem ser mostrados no mapa, embora depois dos 20 se torne difícil encontrar algo no centro, simplesmente porque as rotas estão todas concentradas aqui. Portanto, é melhor limitar a pesquisa a parâmetros mais rigorosos.
  4. Sobre o projeto. Agora o projeto tem um site, existe um bot do Telegram, grupos nas redes sociais.


***
Felizmente, Python é uma linguagem com baterias prontas para uso. Para coisas simples, você nem precisa baixar nada, basta ler a documentação com cuidado.

Certamente, esses serviços podem ser feitos para outras cidades, além disso, em algumas delas já funcionam. Depende muito do data center local; em alguns lugares, por exemplo, em São Petersburgo, existe até uma API para desenvolvedores. Mas o mais importante são as pessoas da cidade que querem mudar de cidade para melhor.

Source: https://habr.com/ru/post/pt411249/


All Articles