mirror of
https://github.com/zoffline/zwift-offline.git
synced 2025-12-16 09:30:44 -08:00
659 lines
23 KiB
Python
Executable File
659 lines
23 KiB
Python
Executable File
#! /usr/bin/env python
|
|
|
|
# Use this script to populate bot.txt with names from https://www.procyclingstats.com
|
|
# Refer to http://cdn.zwift.com/gameassets/GameDictionary.xml
|
|
# pip install beautifulsoup4 country-converter fuzzywuzzy
|
|
# scripts/get_pro_names.py -h
|
|
|
|
|
|
from bs4 import BeautifulSoup
|
|
import urllib.request
|
|
import json
|
|
import country_converter as coco
|
|
import argparse
|
|
import os
|
|
import sys
|
|
import xml.etree.ElementTree as ET
|
|
from fuzzywuzzy import process
|
|
from fuzzywuzzy import fuzz
|
|
|
|
base_url = "https://www.procyclingstats.com/rankings.php?filter=Filter"
|
|
cc = coco.CountryConverter()
|
|
|
|
teams = {
|
|
"UAE Team Emirates - XRG": {
|
|
"abv": "UAD",
|
|
"jersey_name": "UAE",
|
|
"jersey_signature": 1751349769,
|
|
"bike_name": "Colnago V3RS",
|
|
"bike_signature": 3628259811,
|
|
"front_wheel_name": "Enve SES 3.4",
|
|
"front_wheel_signature": 2223270801,
|
|
"rear_wheel_name": "Enve SES 3.4",
|
|
"rear_wheel_signature": 3835575171
|
|
},
|
|
"Soudal Quick-Step": {
|
|
"abv": "SOQ",
|
|
"jersey_name": "Deceuninck-Quick-Step",
|
|
"jersey_signature": 2906189156,
|
|
"bike_name": "Specialized Tarmac SL7",
|
|
"bike_signature": 935373427,
|
|
"front_wheel_name": "Roval Rapide CLX",
|
|
"front_wheel_signature": 2181416413,
|
|
"rear_wheel_name": "Roval Rapide CLX",
|
|
"rear_wheel_signature": 3548735686,
|
|
"helmet_name": "S-Works Evade",
|
|
"helmet_signature": 3109903878
|
|
},
|
|
"Team Visma | Lease a Bike": {
|
|
"abv": "TVL",
|
|
"jersey_name": "Jumbo Visma TdF Edition 2023",
|
|
"jersey_signature": 2246416303,
|
|
"womens_jersey": 2922761319,
|
|
"bike_name": "Cervelo CerveloS52021",
|
|
"bike_signature": 1972610461,
|
|
"front_wheel_name": "Reserve Reserve 25 GR",
|
|
"front_wheel_signature": 635220876,
|
|
"rear_wheel_name": "Reserve Reserve 25 GR",
|
|
"rear_wheel_signature": 1842698274,
|
|
"helmet_name": "LOC_ACCESSORY_LAZERBULLET",
|
|
"helmet_signature": 1292376041
|
|
},
|
|
"Alpecin - Deceuninck": {
|
|
"abv": "ADC",
|
|
"jersey_name": "Alpecin Deceuninck 2023",
|
|
"jersey_signature": 1905664161,
|
|
"bike_name": "Canyon Aeroad2024",
|
|
"bike_signature": 2629993294,
|
|
"bike_frame_colour_name": "Canyon Aeroad2024-Aeroad Alpecin-Deceuninck",
|
|
"bike_frame_colour_signature": 1978783051,
|
|
"front_wheel_name": "Shimano C50",
|
|
"front_wheel_signature": 1742598126,
|
|
"rear_wheel_name": "Shimano C50",
|
|
"rear_wheel_signature": 3725678091,
|
|
"helmet_name": "ABUS GameChanger",
|
|
"helmet_signature": 1387973863
|
|
},
|
|
"Lidl - Trek": {
|
|
"abv": "TRK",
|
|
"jersey_name": "Trek-Segafredo Men",
|
|
"jersey_signature": 2140478849,
|
|
"womens_jersey_signature": 1154847422,
|
|
"bike_name": "Trek Madone",
|
|
"bike_signature": 4129467727,
|
|
"front_wheel_name": "Bontrager Aeolus5",
|
|
"front_wheel_signature": 702195190,
|
|
"rear_wheel_name": "Bontrager Aeolus5",
|
|
"rear_wheel_signature": 3594144634
|
|
},
|
|
"Movistar Team": {
|
|
"abv": "MOV",
|
|
"jersey_name": "Movistar 2023",
|
|
"jersey_signature": 436926002,
|
|
"bike_name": "Canyon Aeroad Team Edition",
|
|
"bike_signature": 390579581,
|
|
"bike_frame_colour_name": "Canyon Aeroad Team Edition-Movistar 2023",
|
|
"bike_frame_colour_signature": 2280475316,
|
|
"front_wheel_name": "Zipp 404",
|
|
"front_wheel_signature": 613983807,
|
|
"rear_wheel_name": "Zipp 404",
|
|
"rear_wheel_signature": 4183014640,
|
|
"helmet_name": "ABUS GameChanger Movistar Team",
|
|
"helmet_signature": 4241132751
|
|
},
|
|
"Lotto": {
|
|
"abv": "LOT",
|
|
"jersey_name": "Lotto Dstny 2023",
|
|
"jersey_signature": 712380058,
|
|
"bike_name": "Ridley Noah Fast 2019",
|
|
"bike_signature": 4288910569,
|
|
"bike_frame_colour_name": "Ridley Noah Fast 2019-Lotto Soudal",
|
|
"bike_frame_colour_signature": 1205664811,
|
|
"front_wheel_name": "DTSwiss ARC 1100 DICUT 62",
|
|
"front_wheel_signature": 346409677,
|
|
"rear_wheel_name": "DTSwiss ARC 1100 DICUT 62",
|
|
"rear_wheel_signature": 2049111692
|
|
},
|
|
"EF Education - EasyPost": {
|
|
"abv": "EFE",
|
|
"jersey_name": "EF Education First",
|
|
"jersey_signature": 2349035663,
|
|
"bike_name": "Cannondale System Six",
|
|
"bike_signature": 2005280203,
|
|
"bike_frame_colour_name": "Cannondale Super Six Evo-Education First",
|
|
"bike_frame_colour_signature": 507139888,
|
|
"front_wheel_name": "HED HED Vanquish RC6 Pro",
|
|
"front_wheel_signature": 1791179228,
|
|
"rear_wheel_name": "HED HED Vanquish RC6 Pro",
|
|
"rear_wheel_signature": 2913819265,
|
|
"helmet_name": "POC Ventral Air EF",
|
|
"helmet_signature": 3707571564
|
|
},
|
|
"INEOS Grenadiers": {
|
|
"abv": "IGD",
|
|
"jersey_name": "INEOS Grenadiers 2022 Pro",
|
|
"jersey_signature": 542207259,
|
|
"bike_name": "Pinarello Dogma F",
|
|
"bike_signature": 4208139356,
|
|
"bike_frame_colour_name": "Pinarello Dogma F-Ineos",
|
|
"bike_frame_colour_signature": 870887764,
|
|
"front_wheel_name": "Shimano C50",
|
|
"front_wheel_signature": 1742598126,
|
|
"rear_wheel_name": "Shimano C50",
|
|
"rear_wheel_signature": 3725678091,
|
|
"helmet_name": "Protone INEOS Grenadier",
|
|
"helmet_signature": 3438211262
|
|
},
|
|
"Groupama - FDJ": {
|
|
"abv": "GFC",
|
|
"jersey_name": "Groupama FDJ 2023",
|
|
"jersey_signature": 2814449542,
|
|
"bike_name": "Specialized Tarmac SL7",
|
|
"bike_signature": 935373427,
|
|
"front_wheel_name": "Shimano C50",
|
|
"front_wheel_signature": 1742598126,
|
|
"rear_wheel_name": "Shimano C50",
|
|
"rear_wheel_signature": 3725678091,
|
|
"helmet_name": "Giro Eclipse FDJ",
|
|
"helmet_signature": 3912703277
|
|
},
|
|
"Bahrain - Victorious": {
|
|
"abv": "TBV",
|
|
"jersey_name": "Bahrain McLaren",
|
|
"jersey_signature": 2155858980,
|
|
"bike_frame_colour_name": "Merida Scultura-Merida Scultura Bahrain McLaren",
|
|
"bike_frame_colour_signature": 2063693653,
|
|
"bike_name": "Merida Scultura",
|
|
"bike_signature": 3033010663
|
|
},
|
|
"Team Picnic PostNL": {
|
|
"abv": "TPP",
|
|
"jersey_name": "Team ODZ",
|
|
"jersey_signature": 2695025247,
|
|
"bike_name": "Scott Foil",
|
|
"bike_signature": 1315158373,
|
|
"front_wheel_name": "Shimano C50",
|
|
"front_wheel_signature": 1742598126,
|
|
"rear_wheel_name": "Shimano C50",
|
|
"rear_wheel_signature": 3725678091
|
|
},
|
|
"Team Jayco AlUla": {
|
|
"abv": "JAY",
|
|
"jersey_name": "Team Jayco Alula 2023",
|
|
"jersey_signature": 91507230,
|
|
"womens_jersey": 1912060275,
|
|
"bike_name": "Giant Propel Advanced SL Disc",
|
|
"bike_signature": 103914490,
|
|
"front_wheel_name": "Cadex CADEX 42",
|
|
"front_wheel_signature": 1497226614,
|
|
"rear_wheel_name": "Cadex CADEX 42",
|
|
"rear_wheel_signature": 1347687916
|
|
},
|
|
"Uno-X Mobility": {
|
|
"abv": "UXT",
|
|
"bike_name": "Ridley Noah Fast 2019",
|
|
"bike_signature": 4288910569,
|
|
"jersey_name": "UnoXPro2022",
|
|
"jersey_signature": 1756517729
|
|
},
|
|
"Cofidis": {
|
|
"abv": "COF",
|
|
"bike_name": "Zwift Carbon",
|
|
"bike_signature": 2106340733,
|
|
"bike_frame_colour_name": "Zwift Carbon-Cofidis De Rosa",
|
|
"bike_frame_colour_signature": 2273815071,
|
|
"jersey_name": "Cofidis 2018",
|
|
"jersey_signature": 927604154,
|
|
"front_wheel_name": "Shimano C50",
|
|
"front_wheel_signature": 1742598126,
|
|
"rear_wheel_name": "Shimano C50",
|
|
"rear_wheel_signature": 3725678091
|
|
},
|
|
"Intermarché - Wanty": {
|
|
"abv": "ICW",
|
|
"jersey_name": "Intermarché Wanty Circus 2023",
|
|
"jersey_signature": 2642337455,
|
|
"bike_name": "Cube Cube Litening",
|
|
"bike_signature": 1767548815,
|
|
"front_wheel_name": "Shimano C50",
|
|
"front_wheel_signature": 1742598126,
|
|
"rear_wheel_name": "Shimano C50",
|
|
"rear_wheel_signature": 3725678091
|
|
},
|
|
"Red Bull - BORA - hansgrohe": {
|
|
"abv": "BOH",
|
|
"jersey_name": "Bora Hansgrohe",
|
|
"jersey_signature": 3798832688,
|
|
"bike_name": "Specialized Tarmac SL7",
|
|
"bike_signature": 935373427,
|
|
"front_wheel_name": "Roval Rapide CLX",
|
|
"front_wheel_signature": 2181416413,
|
|
"rear_wheel_name": "Roval Rapide CLX",
|
|
"rear_wheel_signature": 3548735686,
|
|
"helmet_name": "S-Works Evade",
|
|
"helmet_signature": 3109903878
|
|
},
|
|
"Arkéa - B&B Hotels": {
|
|
"abv": "ARK",
|
|
"jersey_name": "Arkea-Samsic",
|
|
"jersey_signature": 598687666,
|
|
"front_wheel_name": "Shimano C50",
|
|
"front_wheel_signature": 1742598126,
|
|
"rear_wheel_name": "Shimano C50",
|
|
"rear_wheel_signature": 3725678091
|
|
},
|
|
"Decathlon AG2R La Mondiale Team": {
|
|
"abv": "ACT",
|
|
"bike_name": "Zwift Carbon",
|
|
"bike_signature": 2106340733,
|
|
"bike_frame_colour_name": "Zwift Carbon-AG2R",
|
|
"bike_frame_colour_signature": 455876950,
|
|
"jersey_name": "AG2R La Mondiale",
|
|
"jersey_signature": 1587982785,
|
|
"front_wheel_name": "Campagnolo Bora Ultra 35",
|
|
"front_wheel_signature": 1053884173,
|
|
"rear_wheel_name": "Campagnolo Bora Ultra 35",
|
|
"rear_wheel_signature": 1614586487
|
|
},
|
|
"XDS Astana Team": {
|
|
"abv": "XAT",
|
|
"jersey_name": "ASTANA PRO TEAM",
|
|
"jersey_signature": 1969335676,
|
|
"bike_name": "Zwift Carbon",
|
|
"bike_signature": 2106340733,
|
|
"bike_frame_colour_name": "Zwift Carbon-Astana",
|
|
"bike_frame_colour_signature": 1208416225,
|
|
"front_wheel_name": "Shimano C50",
|
|
"front_wheel_signature": 1742598126,
|
|
"rear_wheel_name": "Shimano C50",
|
|
"rear_wheel_signature": 3725678091,
|
|
"helmet_name": "Limar Air Speed TWENTY24",
|
|
"helmet_signature": 9439966
|
|
},
|
|
"Israel - Premier Tech": {
|
|
"abv": "IPT",
|
|
"jersey_name": "Israel Premier-Tech",
|
|
"jersey_signature": 552170906,
|
|
"bike_name": "Factor One",
|
|
"bike_signature": 3469325930
|
|
},
|
|
"Team TotalEnergies": {
|
|
"abv": "TEN",
|
|
"bike_name": "Zwift Carbon",
|
|
"bike_signature": 2106340733,
|
|
"bike_frame_colour_name": "Zwift Carbon-Total Direct Energie",
|
|
"bike_frame_colour_signature": 1215759893,
|
|
"jersey_name": "Total Direct Energie",
|
|
"jersey_signature": 2092402045,
|
|
"front_wheel_name": "Shimano C50",
|
|
"front_wheel_signature": 1742598126,
|
|
"rear_wheel_name": "Shimano C50",
|
|
"rear_wheel_signature": 3725678091
|
|
},
|
|
"Q36.5 Pro Cycling Team": {
|
|
"abv": "Q36",
|
|
"bike_name": "Scott Addict RC",
|
|
"bike_signature": 4100131524,
|
|
"bike_frame_colour_name": "Scott ScottAddict2021-2022",
|
|
"bike_frame_colour_signature": 2522283696,
|
|
"jersey_name": "Q36.5 Pro Team",
|
|
"jersey_signature": 1185917078,
|
|
"front_wheel_name": "Zipp 454",
|
|
"front_wheel_signature": 667389725,
|
|
"rear_wheel_name": "Zipp 454",
|
|
"rear_wheel_signature": 461030369,
|
|
},
|
|
"Team SD Worx - Protime": {
|
|
"abv": "SDW",
|
|
"jersey_name": "Team SD Worx",
|
|
"jersey_signature": 1494272741,
|
|
"bike_name": "Specialized Tarmac SL7",
|
|
"bike_signature": 935373427,
|
|
"helmet_name": "S-Works Evade",
|
|
"helmet_signature": 3109903878
|
|
},
|
|
"UAE Team ADQ": {
|
|
"abv": "UAD",
|
|
"jersey_name": "UAE",
|
|
"jersey_signature": 1751349769,
|
|
"bike_name": "Colnago Colnago V3RS",
|
|
"bike_signature": 3628259811,
|
|
"front_wheel_name": "Enve SES 3.4",
|
|
"front_wheel_signature": 2223270801,
|
|
"rear_wheel_name": "Enve SES 3.4",
|
|
"rear_wheel_signature": 3835575171
|
|
},
|
|
"UAE Development Team": {
|
|
"abv": "UDT",
|
|
"bike_name": "Colnago Colnago V3RS",
|
|
"bike_signature": 3628259811,
|
|
"jersey_name": "UAE",
|
|
"jersey_signature": 1751349769
|
|
},
|
|
"FDJ - SUEZ": {
|
|
"abv": "FST",
|
|
"bike_name": "Zwift Carbon",
|
|
"bike_signature": 2106340733,
|
|
"bike_frame_colour_name": "Zwift Carbon-Lapierre FDJ",
|
|
"bike_frame_colour_signature": 1248651886,
|
|
"jersey_name": "FDJ Suez 2023",
|
|
"jersey_signature": 3360845221,
|
|
"front_wheel_name": "Shimano C50",
|
|
"front_wheel_signature": 1742598126,
|
|
"rear_wheel_name": "Shimano C50",
|
|
"rear_wheel_signature": 3725678091
|
|
},
|
|
"CANYON//SRAM zondacrypto": {
|
|
"abv": "CSZ",
|
|
"jersey_name": "CANYON//SRAM Racing",
|
|
"jersey_signature": 3970245639,
|
|
"bike_name": "Canyon AeroadSRAM2024",
|
|
"bike_signature": 1122831861,
|
|
"front_wheel_name": "Zipp 404",
|
|
"front_wheel_signature": 613983807,
|
|
"rear_wheel_name": "Zipp 404",
|
|
"rear_wheel_signature": 4183014640,
|
|
"helmet_name": "Giro Eclipse Canyon SRAM",
|
|
"helmet_signature": 3346861673
|
|
},
|
|
"CANYON//SRAM zondacrypto Generation": {
|
|
"abv": "CSG",
|
|
"jersey_name": "Canyon//SRAM Generation",
|
|
"jersey_signature": 189587516,
|
|
"bike_name": "Canyon AeroadSRAM2024",
|
|
"bike_signature": 1122831861,
|
|
"front_wheel_name": "Zipp 404",
|
|
"front_wheel_signature": 613983807,
|
|
"rear_wheel_name": "Zipp 404",
|
|
"rear_wheel_signature": 4183014640,
|
|
"helmet_name": "Giro Eclipse Canyon SRAM",
|
|
"helmet_signature": 3346861673
|
|
},
|
|
"AG Insurance - Soudal Team": {
|
|
"abv": "AGS",
|
|
"jersey_name": "Lotto-Soudal",
|
|
"jersey_signature": 3103938066,
|
|
"bike_name": "Specialized Tarmac SL7",
|
|
"bike_signature": 935373427,
|
|
"helmet_name": "S-Works Evade",
|
|
"helmet_signature": 3109903878
|
|
},
|
|
"Human Powered Health": {
|
|
"abv": "HPW",
|
|
"jersey_name": "Human Powered Health Fan",
|
|
"jersey_signature": 854534852,
|
|
"bike_name": "Felt AR",
|
|
"bike_signature": 3002729519
|
|
},
|
|
"Liv AlUla Jayco": {
|
|
"abv": "LAJ",
|
|
"jersey_name": "Liv AlUla Jayco 2024",
|
|
"jersey_signature": 2095486697,
|
|
"bike_name": "Liv Langma Advanced SL",
|
|
"bike_signature": 3495124341
|
|
},
|
|
"Roland Le Dévoluy": {
|
|
"abv": "CGS",
|
|
"jersey_name": "Team Roland Cogeas Edelweiss",
|
|
"jersey_signature": 3398931495,
|
|
"bike_name": "Factor One",
|
|
"bike_signature": 3469325930,
|
|
"bike_frame_colour_name": "Factor One-One Israel",
|
|
"bike_frame_colour_signature": 3959514452,
|
|
"helmet_name": "Limar Air Speed TWENTY24",
|
|
"helmet_signature": 9439966
|
|
},
|
|
"Fenix-Deceuninck": {
|
|
"abv": "FDC",
|
|
"jersey_name": "Fenix Deceuninck 2023",
|
|
"jersey_signature": 3290712389,
|
|
"bike_name": "Canyon Aeroad2024",
|
|
"bike_signature": 2629993294
|
|
},
|
|
"Fenix-Deceuninck Development Team": {
|
|
"abv": "FDD",
|
|
"bike_name": "Canyon Aeroad2024",
|
|
"bike_signature": 2629993294,
|
|
"jersey_name": "Fenix Deceuninck 2023",
|
|
"jersey_signature": 3290712389
|
|
},
|
|
"CERATIZIT Pro Cycling Team": {
|
|
"abv": "CTC",
|
|
"bike_name": "Zwift Carbon",
|
|
"bike_signature": 2106340733,
|
|
"bike_frame_colour_name": "Zwift Carbon-Orbea Orca",
|
|
"bike_frame_colour_signature": 806402273,
|
|
"jersey_name": "Ceratizit-WNT",
|
|
"jersey_signature": 97975537
|
|
},
|
|
"St Michel - Preference Home - Auber93 WE": {
|
|
"abv": "AUB",
|
|
"jersey_name": "South Africa Elite",
|
|
"jersey_signature": 3305515323,
|
|
"bike_name": "Cannondale System Six",
|
|
"bike_signature": 2005280203,
|
|
"front_wheel_name": "Mavic Comete Pro Carbon SL UST",
|
|
"front_wheel_signature": 897949453,
|
|
"rear_wheel_name": "Mavic Comete Pro Carbon SL UST",
|
|
"rear_wheel_signature": 4001596344
|
|
},
|
|
"Cofidis Women Team": {
|
|
"abv": "CWT",
|
|
"bike_name": "Zwift Carbon",
|
|
"bike_signature": 2106340733,
|
|
"bike_frame_colour_name": "Zwift Carbon-Cofidis De Rosa",
|
|
"bike_frame_colour_signature": 2273815071,
|
|
"jersey_name": "Cofidis",
|
|
"jersey_signature": 4191972189
|
|
},
|
|
"Arkéa - B&B Hotels Women": {
|
|
"abv": "ARK",
|
|
"jersey_name": "Arkea",
|
|
"jersey_signature": 1128201030
|
|
},
|
|
"MAT Atom Deweloper Wrocław": {
|
|
"abv": "MAT",
|
|
"bike_name": "Ridley Noah Fast 2019",
|
|
"bike_signature": 4288910569,
|
|
"jersey_name": "Atom Racing Team",
|
|
"jersey_signature": 851470392
|
|
},
|
|
"Top Girls Fassa Bortolo": {
|
|
"abv": "TOP",
|
|
"bike_name": "Pinarello Dogma F",
|
|
"bike_signature": 4208139356,
|
|
"jersey_name": "Clash Of Clubs Blue",
|
|
"jersey_signature": 520081294
|
|
},
|
|
"Team Polti VisitMalta": {
|
|
"abv": "PTV",
|
|
"jersey_name": "Eolo Kometa",
|
|
"jersey_signature": 2422819298,
|
|
"front_wheel_name": "Enve SES 3.4",
|
|
"front_wheel_signature": 2223270801,
|
|
"rear_wheel_name": "Enve SES 3.4",
|
|
"rear_wheel_signature": 3835575171
|
|
},
|
|
"VF Group - Bardiani CSF - Faizanè": {
|
|
"abv": "VBF",
|
|
"jersey_name": "Bardiani 2019",
|
|
"jersey_signature": 3503002798,
|
|
"front_wheel_name": "Campagnolo Bora Ultra 35",
|
|
"front_wheel_signature": 1053884173,
|
|
"rear_wheel_name": "Campagnolo Bora Ultra 35",
|
|
"rear_wheel_signature": 1614586487
|
|
},
|
|
"L39ION of Los Angeles": {
|
|
"abv": "LLA",
|
|
"bike_name": "Factor One",
|
|
"bike_signature": 3469325930,
|
|
"jersey_name": "L39ION of LA 2022",
|
|
"jersey_signature": 2330819669
|
|
},
|
|
"Lotto Ladies": {
|
|
"abv": "LOL",
|
|
"jersey_name": "Lotto Dstny 2023",
|
|
"jersey_signature": 712380058
|
|
},
|
|
"Parkhotel Valkenburg": {
|
|
"abv": "PHV",
|
|
"bike_name": "Giant Propel Advanced SL Disc",
|
|
"bike_signature": 103914490,
|
|
"jersey_name": "Parkhotel Valkenburg",
|
|
"jersey_signature": 4102459937
|
|
},
|
|
"Tudor Pro Cycling Team": {
|
|
"abv": "TUD",
|
|
"jersey_name": "Assos Superleger",
|
|
"jersey_signature": 142676981,
|
|
"bike_name": "BMC TeamMachine",
|
|
"bike_signature": 3868468027,
|
|
"bike_frame_colour_name": "BMC Timemachine01-BMC Timemachine01 Black",
|
|
"bike_frame_colour_signature": 2850354759,
|
|
"front_wheel_name": "DTSwiss ARC 1100 DICUT 85/Disc",
|
|
"front_wheel_signature": 1213183664,
|
|
"rear_wheel_name": "DTSwiss ARC 1100 DICUT 85/Disc",
|
|
"rear_wheel_signature": 590647095,
|
|
},
|
|
"EF Education-Oatly": {
|
|
"abv": "EFO",
|
|
"jersey_name": "EF Education First",
|
|
"jersey_signature": 2349035663,
|
|
"bike_name": "Cannondale System Six",
|
|
"bike_signature": 2005280203
|
|
},
|
|
"Roland": {
|
|
"abv": "CGS",
|
|
"bike_name": "Pinarello Dogma F",
|
|
"bike_signature": 4208139356
|
|
},
|
|
"AG Insurance - Soudal Team": {
|
|
"abv": "AGS",
|
|
"jersey_name": "Lotto-Soudal",
|
|
"jersey_signature": 3103938066,
|
|
"bike_name": "Specialized Tarmac SL7",
|
|
"bike_signature": 935373427
|
|
},
|
|
"VolkerWessels Women\"s Pro Cycling Team": {
|
|
"abv": "VWT",
|
|
"bike_name": "Specialized Tarmac SL7",
|
|
"bike_signature": 935373427
|
|
}
|
|
}
|
|
|
|
|
|
def get_pros(url, male, get_jersey, get_equipment, team_abbrv):
|
|
data = []
|
|
|
|
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
|
|
site = urllib.request.urlopen(req).read()
|
|
soup = BeautifulSoup(site)
|
|
|
|
for td in soup.find_all('td'):
|
|
if td.span and td.contents[0]:
|
|
tmp = {}
|
|
if "flag" in repr(td.contents[0]):
|
|
code = td.span.get_attribute_list("class")[1]
|
|
tmp['country_code'] = cc.convert(names=code, to='ISOnumeric')
|
|
tmp['is_male'] = male
|
|
if td.a:
|
|
fn = []
|
|
ln = []
|
|
for n in td.a.contents[0].split():
|
|
if n.isupper():
|
|
ln.append(n.title())
|
|
else:
|
|
fn.append(n)
|
|
tmp['first_name'] = ' '.join(fn)
|
|
tmp['last_name'] = ' '.join(ln)
|
|
if td.a and td.contents[0]:
|
|
if "cu600" in repr(td) and td.a.contents:
|
|
if 'first_name' in tmp:
|
|
if team_abbrv:
|
|
if td.a.contents[0] in teams and 'abv' in teams[td.a.contents[0]]:
|
|
tmp['last_name'] += " ("+teams[td.a.contents[0]]['abv']+")"
|
|
if get_jersey:
|
|
if not male and td.a.contents[0] in teams and 'womens_jersey_signature' in teams[td.a.contents[0]]:
|
|
tmp['ride_jersey'] = teams[td.a.contents[0]]['womens_jersey_signature']
|
|
elif td.a.contents[0] in teams and 'jersey_signature' in teams[td.a.contents[0]]:
|
|
tmp['ride_jersey'] = teams[td.a.contents[0]]['jersey_signature']
|
|
else:
|
|
best_match = process.extractOne(td.a.contents[0], jerseys.keys(), scorer=fuzz.token_set_ratio)
|
|
print ("%s %s : %s - %s" % (tmp['first_name'],tmp['last_name'],td.a.contents[0], best_match))
|
|
tmp['ride_jersey'] = jerseys[best_match[0]]
|
|
if get_equipment:
|
|
if td.a.contents[0] in teams:
|
|
team = teams[td.a.contents[0]]
|
|
if 'bike_signature' in team:
|
|
tmp['bike_frame'] = team['bike_signature']
|
|
if 'bike_frame_colour_signature' in team:
|
|
tmp['bike_frame_colour'] = team['bike_frame_colour_signature'] << 32
|
|
if 'front_wheel_signature' in team:
|
|
tmp['bike_wheel_front'] = team['front_wheel_signature']
|
|
if 'rear_wheel_signature' in team:
|
|
tmp['bike_wheel_rear'] = team['rear_wheel_signature']
|
|
if 'helmet_signature' in team:
|
|
tmp['ride_helmet_type'] = team['helmet_signature']
|
|
|
|
data.append(tmp)
|
|
|
|
return data
|
|
|
|
gd_file = 'GameDictionary.xml'
|
|
if not os.path.isfile(gd_file):
|
|
open(gd_file, 'wb').write(urllib.request.urlopen('http://cdn.zwift.com/gameassets/%s' % gd_file).read())
|
|
tree = ET.parse(gd_file)
|
|
jerseys = {}
|
|
for x in tree.findall("./JERSEYS/JERSEY"):
|
|
jerseys[x.get('name')] = int(x.get('signature'))
|
|
|
|
def main(argv):
|
|
global args
|
|
|
|
parser = argparse.ArgumentParser(description='Populate Bot names with professional riders')
|
|
parser.add_argument('-n', '--nation', help='Riders from specified nation only', default=False)
|
|
parser.add_argument('-f', '--female', help='Female riders only', default=False, action='store_true')
|
|
parser.add_argument('-m', '--male', help='Male riders only', default=False, action='store_true')
|
|
parser.add_argument('-a', '--alltime', help='Use all time ranking', default=False, action='store_true')
|
|
parser.add_argument('-p', '--pages', help='Number of pages to process', default=1)
|
|
parser.add_argument('-j', '--jersey', help='Get team jerseys', default=False, action='store_true')
|
|
parser.add_argument('-e', '--equipment', help='Get team bike and wheels', default=False, action='store_true')
|
|
parser.add_argument('-t', '--teamabbrv', help='Add team abbreviation to last name', default=False, action='store_true')
|
|
args = parser.parse_args()
|
|
url_additions = ""
|
|
url_list = []
|
|
if args.alltime:
|
|
url_additions += "&s=all-time"
|
|
if args.nation:
|
|
url_additions += "&nation="+args.nation
|
|
if args.female:
|
|
url_list = [ { "url": base_url + url_additions + "&p=we", "is_male": False } ]
|
|
elif args.male:
|
|
url_list = [ { "url": base_url + url_additions + "&p=me", "is_male": True } ]
|
|
else:
|
|
url_list = [ { "url": base_url + url_additions + "&p=me", "is_male": True }, { "url": base_url + url_additions + "&p=we", "is_male": False } ]
|
|
if args.pages:
|
|
new_url_list = url_list.copy()
|
|
for x in range(1,int(args.pages)):
|
|
offset = str(x*100)
|
|
for url in url_list:
|
|
new_url_list += [ { "url": url['url'] + "&offset=" + offset, "is_male": url['is_male'] }]
|
|
url_list = new_url_list.copy()
|
|
|
|
total_data = {}
|
|
total_data['riders'] = []
|
|
for item in url_list:
|
|
total_data['riders'] = total_data['riders'] + get_pros(item['url'], item['is_male'], args.jersey, args.equipment, args.teamabbrv)
|
|
|
|
with open('bot.txt', 'w') as outfile:
|
|
json.dump(total_data, outfile, indent=2)
|
|
|
|
if __name__ == '__main__':
|
|
try:
|
|
main(sys.argv)
|
|
except KeyboardInterrupt:
|
|
pass
|
|
except SystemExit as se:
|
|
print("ERROR:", se)
|
|
|