Publié par Mikhail Aksenov, développeur .NET, DataArtComment tout a commencé
À l'automne 2014, il y avait de bonnes nouvelles que Yandex.Transport a été lancé à Voronej, qui montre le mouvement des bus et des trolleybus. C'était très cool juste à l'arrêt de bus pour ouvrir un horaire et découvrir que votre bus fonctionnera en 5 minutes.
Mais après quelques mois, tout s'est déroulé selon un scénario complètement prévisible. Étant donné que tout le transport à Voronej du chariot au minibus fonctionne en espèces, chaque chauffeur est intéressé à transporter le plus de passagers possible. En conséquence, ils organisent des courses entre eux.
Les conducteurs ont utilisé le nouveau service pour se suivre sur la carte, doubler et couper les concurrents sur la route. Certains ont commencé à baisser leurs revenus, ils ont commencé à se plaindre aux propriétaires des itinéraires, et ils sont allés voir des gens vendre des équipements avec GLONASS et GPS et envoyer des données sur les mouvements de voitures à Yandex. À la demande des propriétaires de la flotte, ils ont cessé d'envoyer des informations et les bus ont immédiatement commencé à disparaître de la carte. Maintenant, il y en a un peu plus, mais c'est encore beaucoup moins qu'en réalité.

Pour ceux qui sont trop paresseux pour lire plus loin, je propose un reportage vidéo sur ce sujet:
Pour le reste - je décrirai le projet sous forme de texte.
Où obtenir les données?
Dans le même temps, à Voronej, il y a un endroit où toutes les données sont collectées - le
Centre pour l'organisation de la circulation routière (DPC). Ils ont une application Web volumineuse et lourde sur leur site avec JavaScript non durable et d'autres artefacts, tandis que tout y est livré avec des requêtes POST et rien n'est mis en cache. En utilisant ce site lui-même, vous pouvez facilement mettre en place un service de collecte de données sur la circulation des bus.
Il y avait une option qui vous permet de fouiller sur la carte et de savoir quand le bus arrivera et ce qu'il sera. Pourvu que vous arriviez approximativement à un arrêt (± 50 mètres). Dans le menu, vous pouvez ouvrir une liste d'itinéraires et voir exactement où vont les bus, mais il y avait un problème - ils conduisaient étrangement. Par exemple, le long de Koltsovskaya, une rue du centre où vous ne pouvez pas particulièrement accélérer, le bus a avancé et reculé à une vitesse d'environ 200 km / h.
Pourquoi Python?
J'ai choisi Python parce que c'est cool, les piles sont regroupées, etc. Et 3.6 parce qu'il y a un formatage pour les littéraux de chaîne, la frappe, c'est tout. Voyons ce que j'ai essentiellement utilisé:
- Beaucoup se sont plaints que conduire le nom exact d'un arrêt avec toutes sortes de signes de ponctuation est très difficile. Ensuite, j'ai réalisé la possibilité d'une recherche floue et créé le premier test unitaire pour cela.
- L'ensemble du système est hébergé sur Heroku. C'est gratuit, parce que je n'ai pas de base de données - j'espère m'en sortir avec la base de données du centre de données. J'ai convenu de son utilisation avec le Centre lorsque j'ai réalisé que les données que je collectais via l'interface Web n'étaient pas suffisantes.
- En fait, l'hébergement passe par le serveur Web Tornado. Je pense qu'il est familier à tous ceux qui ont rencontré des demandes Web en Python.
- J'avais besoin du package Pytz car le serveur Heroku est dans un fuseau horaire différent et les données me parviennent sans spécifier de fuseau horaire. J'ai donc moi-même pris en charge la localisation.
- Pour créer le bot, j'ai utilisé la bibliothèque Python-telegram-bot recommandée. La documentation ici est tout à fait adéquate et, en général, la bibliothèque répond aux exigences minimales du produit viable. Initialement, l'ensemble du projet était un bot Telegram, qui en réponse à l'envoi de votre emplacement a envoyé un horaire de bus.
- Firebird, un ancien Interbase, est une base de données open source avec laquelle je pense que beaucoup d'entre vous ont travaillé. Bien sûr, ce n'est pas aussi cool que le même PostgreSQL, mais pour un très grand nombre de requêtes c'est suffisant. Dans notre cas, il n'en faut plus.
- Cachetools est un module très simple qui vous permet de mettre en cache les calculs. Bien sûr, cela ne concerne pas la mise en cache ou la mise en cache des pages Web, mais les cas où vous avez besoin de mémorisation pour de longues requêtes. Prenez-le, ajoutez le décorateur approprié - et tout fonctionne. Le cache a différentes options, j'utilise la version TTL, qui enregistre les données pour le temps spécifié, car je sais que les données ne seront pas mises à jour plus souvent qu'à certains intervalles (dans mon cas - 30 secondes).
Fonctionnalité du bot
- / nom du prochain arrêt de bus - heure d'arrivée prévue;
- / derniers numéros d'itinéraire séparés par des espaces - derniers arrêts;
- Envoi du lieu - l'heure d'arrivée prévue pour les trois prochains arrêts;
- Entrée gratuite - numéros d'itinéraire et distance par rapport aux bus (lors de l'envoi de la position).
J'ai essayé de décrire les commandes suffisamment pour que les gens ne demandent pas comment les utiliser. Il existe essentiellement deux commandes de base: nextbus, lorsque vous écrivez le nom de l'arrêt, et l'envoi de l'emplacement.
Fonctionnalité du site
J'ai rendu le
site Web aussi minimaliste que possible. Parmi les bibliothèques tierces, je n'en ai utilisé que deux pour prendre en charge la récupération et la promesse, car les anciennes versions des navigateurs préinstallés dans les téléphones ne peuvent pas s'en passer. Si vous ne supportez pas ces méthodes, vous obtiendrez des nouilles de rappel assez lourdes pour les demandes elles-mêmes. Avec fetch, tout semble plus élégant.

En fait, la fonctionnalité se compose ici de 4 points:
- Arrivée Vous pouvez simplement regarder l'arrêt. En cliquant sur le bouton (au fait, cela vaut peut-être la peine d'en faire un peu plus - j'y pense!), Vous envoyez votre position, le système recherche les trois arrêts les plus proches de vous et affiche des informations à leur sujet. Vous pouvez entrer le nom de l'arrêt et obtenir des informations à ce sujet. Comme vous n'avez pratiquement pas besoin de tous les 20-30 bus pouvant arriver à l'arrêt de bus, vous pouvez les filtrer par itinéraire.
- Autobus La deuxième page contient des informations sur les bus. Cela est dû à une autre histoire qui m'a poussé à ce projet. Un beau jour, j'ai oublié le chapeau dans le bus, appelé la salle de contrôle, expliqué où c'était arrivé. Le répartiteur a suggéré que j'attrape mon bus au centre, où il reviendra, se retournant au terminal. Je me souvenais que j'avais un identifiant et un mot de passe du système Center for Traffic Management, mais il s'est avéré que je ne pouvais toujours pas suivre l'emplacement de la voiture dont j'avais besoin via l'interface Web. J'ai rendu le chapeau, mais avec beaucoup de difficulté.
Je pensais que trouver un bus pourrait être beaucoup plus facile. J'ai écrit le numéro de l'itinéraire et le système vous montre les voitures sur la ligne, leur emplacement actuel et l'heure à laquelle elles sont passées s'arrête en cours de route. Et même si vous connaissez le numéro de l'itinéraire, mais que vous connaissez le numéro de bus (cela se produit également), vous pouvez toujours le trouver. - Carte. Carte sur le site sans animation. Ici, vous pouvez sélectionner des bus dans la liste ou entrer des numéros manuellement, vous pouvez les filtrer. Jusqu'à 600 bus peuvent être indiqués sur la carte, bien qu'après 20, il devienne difficile de trouver quelque chose au centre, simplement parce que les itinéraires sont tous concentrés ici. Par conséquent, il est préférable de limiter la recherche à des paramètres plus stricts.
- À propos du projet. Maintenant, le projet a un site Web, il y a un bot Telegram, des groupes dans les réseaux sociaux.
***
Heureusement, Python est un langage avec des piles prêtes à l'emploi. Pour les choses simples, vous n'avez même pas besoin de télécharger quoi que ce soit, il suffit de lire attentivement la documentation.
Bien sûr, de tels services peuvent être effectués pour d'autres villes, d'ailleurs, dans certaines, ils travaillent déjà. Cela dépend beaucoup du centre de données local, à certains endroits, par exemple, à Saint-Pétersbourg, il existe même une API pour les développeurs. Mais le plus important, ce sont les citadins qui veulent changer leur ville pour le mieux.