├── .gitignore ├── LICENSE ├── README.md ├── data ├── WMI_565.csv └── wmi_vinquery.csv ├── pyvin ├── __init__.py ├── data.py └── decoder.py ├── requirements.txt ├── setup.cfg ├── setup.py └── tests ├── test_data.py └── test_iso.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | 5 | # C extensions 6 | *.so 7 | 8 | # Distribution / packaging 9 | .Python 10 | env/ 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | lib/ 17 | lib64/ 18 | parts/ 19 | sdist/ 20 | var/ 21 | *.egg-info/ 22 | .installed.cfg 23 | *.egg 24 | 25 | # PyInstaller 26 | # Usually these files are written by a python script from a template 27 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 28 | *.manifest 29 | *.spec 30 | 31 | # Installer logs 32 | pip-log.txt 33 | pip-delete-this-directory.txt 34 | 35 | # Unit test / coverage reports 36 | htmlcov/ 37 | .tox/ 38 | .coverage 39 | .cache 40 | nosetests.xml 41 | coverage.xml 42 | 43 | # Translations 44 | *.mo 45 | *.pot 46 | 47 | # Django stuff: 48 | *.log 49 | 50 | # Sphinx documentation 51 | docs/_build/ 52 | 53 | # PyBuilder 54 | target/ 55 | 56 | #rope 57 | .ropeproject/ 58 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015, IOT Labs Ltd. 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | * Redistributions of source code must retain the above copyright notice, this 8 | list of conditions and the following disclaimer. 9 | 10 | * Redistributions in binary form must reproduce the above copyright notice, 11 | this list of conditions and the following disclaimer in the documentation 12 | and/or other materials provided with the distribution. 13 | 14 | * Neither the name of pyvin nor the names of its 15 | contributors may be used to endorse or promote products derived from 16 | this software without specific prior written permission. 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 22 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 24 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 25 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 26 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 | 29 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pyvin 2 | Vehicle Identification Number (VIN) Decoder 3 | 4 | ## Sources 5 | 6 | ### WMI Database 7 | 8 | ftp://ftp.nhtsa.dot.gov/manufacture 9 | http://www.sae.org/standardsdev/groundvehicle/vin.htm 10 | http://www.vinquery.com/faq.aspx#VIN_DECODING_vin_decoder 11 | -------------------------------------------------------------------------------- /data/wmi_vinquery.csv: -------------------------------------------------------------------------------- 1 | 10T, Oshkosh 2 | 11V, Ottawa 3 | 137, AM General, Hummer 4 | 145, Hyundai 5 | 15G, Gillig 6 | 17N, John Deere 7 | 18X, WRV 8 | 19U, Acura 9 | 1A4, Chrysler 10 | 1A8, Chrysler 11 | 1AC, AMC 12 | 1AM, AMC 13 | 1B3, Dodge 14 | 1B4, Dodge 15 | 1B6, Dodge 16 | 1B7, Dodge 17 | 1B7, Dodge 18 | 1BA, Blue Bird 19 | 1BB, Blue Bird 20 | 1BD, Blue Bird 21 | 1C3, Chrysler 22 | 1C4, Chrysler 23 | 1C6, Chrysler 24 | 1C8, Chrysler 25 | 1C9, Chance 26 | 1CY, Crane Carrier 27 | 1D3, Dodge 28 | 1D4, Dodge 29 | 1D5, Dodge 30 | 1D7, Dodge 31 | 1D8, Dodge 32 | 1EC, Fleetwood 33 | 1F1, Ford 34 | 1F4, Ford 35 | 1F6, Ford 36 | 1F9, FWD 37 | 1FA, Ford 38 | 1FB, Ford 39 | 1FC, Ford 40 | 1FD, Ford 41 | 1FE, Ford 42 | 1FF, Ford 43 | 1FM, Ford 44 | 1FT, Ford 45 | 1FU, Freightliner 46 | 1FV, Freightliner 47 | 1G1, Chevrolet 48 | 1G2, Pontiac 49 | 1G3, Oldsmobile 50 | 1G4, Buick 51 | 1G5, GMC, Pontiac 52 | 1G6, Cadillac 53 | 1G8, Chevrolet, Saturn 54 | 1GA, Chevrolet 55 | 1GB, Chevrolet 56 | 1GC, Chevrolet 57 | 1GM, Pontiac 58 | 1GN, Chevrolet 59 | 1GD, GMC 60 | 1GE, Cadillac 61 | 1GF, Flexible 62 | 1GG, Isuzu 63 | 1GH, GMC, Oldsmobile 64 | 1GJ, GMC 65 | 1GK, GMC 66 | 1GM, Pontiac 67 | 1GN, Chevrolet 68 | 1GT, GMC 69 | 1GY, Cadillac 70 | 1HF, Honda 71 | 1HD, Harley-Davidson 72 | 1HG, Honda 73 | 1HS, International 74 | 1HT, International 75 | 1HV, International 76 | 1J4, Jeep 77 | 1J6, Jeep 78 | 1J7, Jeep 79 | 1J8, Jeep 80 | 1JC, AMC, Jeep 81 | 1JD, AMC 82 | 1JE, Jeep 83 | 1JF, Jeep 84 | 1JH, Jeep 85 | 1JM, Jeep 86 | 1JT, AMC, Jeep 87 | 1L1, Lincoln 88 | 1LN, Lincoln 89 | 1M1, Mack 90 | 1M2, Mack 91 | 1M3, Mack 92 | 1M8, MCI 93 | 1MB, Mercedes-Benz 94 | 1ME, Mercury 95 | 1MR, Lincoln 96 | 1N4, Nissan 97 | 1N6, Datsun, Nissan 98 | 1N9, Neoplan 99 | 1NK, Kenworth 100 | 1NP, Peterbilt 101 | 1NX, Toyota 102 | 1P3, Plymouth 103 | 1P4, Plymouth 104 | 1P7, Plymouth 105 | 1P9, Panoz 106 | 1RF, Roadmaster 107 | 1S9, Saleen 108 | 177, Thomas 109 | 1T8, Thomas 110 | 1TU, TMC 111 | 1V1, Volkswagen 112 | 1VW, Volkswagen 113 | 1WA, Autostar 114 | 1WB, Autostar 115 | 1WU, White Volvo 116 | 1WV, Winnebago 117 | 1XK, Kenworth 118 | 1XM, AMC 119 | 1XP, Peterbilt 120 | 1Y1, Chevrolet, Geo 121 | 1YV, Mazda 122 | 1Z3, Mitsubishi 123 | 1Z5, Mitsubishi 124 | 1Z7, Mitsubishi 125 | 1ZV, Ford 126 | 1ZW, Mercury 127 | 2A3, Chrysler 128 | 2A4, Chrysler 129 | 2A8, Chrysler 130 | 2B1, Orion 131 | 2B3, Dodge 132 | 2B4, Dodge 133 | 2B5, Dodge 134 | 2B6, Dodge 135 | 2B7, Dodge 136 | 2B8, Dodge 137 | 2BC, AMC, Jeep 138 | 2BD, Jeep 139 | 2BT, Jeep 140 | 2C1, Chevrolet, Geo 141 | 2C3, Chrysler 142 | 2C4, Chrysler 143 | 2C7, Pontiac 144 | 2C8, Chrysler 145 | 2CC, AMC, Eagle 146 | 2CK, Geo, Pontiac 147 | 2CH, Chevrolet 148 | 2CM, AMC 149 | 2CN, Chevrolet, Geo 150 | 2D3, Dodge 151 | 2D4, Dodge 152 | 2D6, Dodge 153 | 2D7, Dodge 154 | 2D8, Dodge 155 | 2E3, Eagle 156 | 2FA, Ford 157 | 2FB, Ford 158 | 2FC, Ford 159 | 2FD, Ford 160 | 2FF, Ford 161 | 2FM, Ford 162 | 2FT, Ford 163 | 2FU, Freightliner 164 | 2FV, Freightliner 165 | 2FW, Sterling 166 | 2FZ, Sterling 167 | 2G0, GMC 168 | 2G1, Chevrolet 169 | 2G2, Pontiac 170 | 2G3, Oldsmobile 171 | 2G4, Buick 172 | 2G5, GMC 173 | 2G7, Pontiac 174 | 2G8, Chevrolet 175 | 2GA, Chevrolet 176 | 2GB, Chevrolet 177 | 2GC, Chevrolet 178 | 2GD, GMC 179 | 2GJ, GMC 180 | 2GK, GMC 181 | 2GN, Chevrolet 182 | 2GM, Pontiac 183 | 2GT, GMC 184 | 2GY, Cadillac 185 | 2HG, Honda 186 | 2HH, Acura 187 | 2HJ, Honda 188 | 2HK, Honda 189 | 2HM, Hyundai 190 | 2HN, Acura 191 | 2HS, International 192 | 2HT, International 193 | 2J4, Jeep 194 | 2J6, Jeep 195 | 2J7, Jeep 196 | 2LM, Lincoln 197 | 2M2, Mack 198 | 2ME, Mercury 199 | 2MH, Mercury 200 | 2MR, Mercury 201 | 2NK, Kenworth 202 | 2NP, Peterbilt 203 | 2NV, Nova Bus 204 | 2P3, Plymouth 205 | 2P4, Plymouth 206 | 2P5, Plymouth 207 | 2P9, Prevost 208 | 2PC, Prevost 209 | 2S2, Suzuki 210 | 2S3, Suzuki 211 | 2S4, Suzuki 212 | 2T1, Toyota 213 | 2T2, Lexus 214 | 2T3, Toyota 215 | 2V4, Volkswagen 216 | 2V8, Volkswagen 217 | 2WK, Western Star 218 | 2WL, Western Star 219 | 2WM, Western Star 220 | 2XK, Kenworth 221 | 2XM, Eagle 222 | 2XP, Peterbilt 223 | 3A4, Chrysler 224 | 3A8, Chrysler 225 | 3AB, Dina 226 | 3AL, Freightliner 227 | 3B3, Dodge 228 | 3B4, Dodge 229 | 3B6, Dodge 230 | 3B7, Dodge 231 | 3BK, Kenworth 232 | 3BP, Peterbilt 233 | 3C3, Chrysler 234 | 3C4, Chrysler 235 | 3C8, Chrysler 236 | 3CA, Chrysler 237 | 3CE, Volvo 238 | 3CZ, Honda 239 | 3D3, Dodge 240 | 3D5, Dodge 241 | 3D6, Dodge 242 | 3D7, Dodge 243 | 3FA, Ford 244 | 3FB, Ford 245 | 3FC, Ford 246 | 3FD, Ford 247 | 3FE, Ford 248 | 3FF, Ford 249 | 3FR, Ford 250 | 3FT, Ford 251 | 3G1, Chevrolet 252 | 3G2, Pontiac 253 | 3G4, Buick 254 | 3G5, Buick 255 | 3G7, Pontiac 256 | 3G8, Chevrolet 257 | 3GA, Chevrolet 258 | 3GB, Chevrolet 259 | 3GC, Chevrolet 260 | 3GD, GMC 261 | 3GE, Chevrolet 262 | 3GG, Cadillac 263 | 3GK, GMC 264 | 3GN, Chevrolet 265 | 3GM, Pontiac 266 | 3GT, GMC 267 | 3GY, Cadillac 268 | 3H1, Honda 269 | 3HA, International 270 | 3HG, Honda 271 | 3HM, Honda 272 | 3HS, International 273 | 3HT, International 274 | 3LN, Lincoln 275 | 3MA, Mercury 276 | 3ME, Mercury 277 | 3N1, Nissan 278 | 3N6, Nissan 279 | 3N8, Nissan 280 | 3NK, Kenworth 281 | 3NM, Peterbilt 282 | 3P3, Plymouth 283 | 3TM, Toyota 284 | 3VW, Volkswagen 285 | 3WK, Kenworth 286 | 45V, Utilimaster 287 | 46G, Gillig 288 | 478, Honda 289 | 49H, Sterling 290 | 4A3, Mitsubishi 291 | 4A4, Mitsubishi 292 | 4B3, Dodge 293 | 4C3, Chrysler 294 | 4CD, Oshkosh 295 | 4DR, Genesis, International 296 | 4E3, Eagle 297 | 4F2, Mazda 298 | 4F4, Mazda 299 | 4G1, Chevrolet 300 | 4G2, Pontiac 301 | 4GB, Chevrolet 302 | 4GD, GMC 303 | 4GT, Isuzu, WhiteGMC 304 | 4J4, Jeep 305 | 4JG, Mercedes-Benz 306 | 4KB, Chevrolet 307 | 4KD, GMC 308 | 4KL, Isuzu 309 | 4M2, Mercury 310 | 4N1, Nissan 311 | 4N2, Nissan 312 | 4NU, Isuzu 313 | 4P3, Plymouth 314 | 4RK, Nova Bus 315 | 4S1, Isuzu 316 | 4S2, Isuzu 317 | 4S3, Subaru 318 | 4S4, Subaru 319 | 4S6, Honda 320 | 4S7, Spartan 321 | 4SL, Magnum 322 | 4T1, Toyota 323 | 4T3, Toyota 324 | 4TA, Toyota 325 | 4US, BMW 326 | 4UZ, Freightliner 327 | 4V1, Volvo, WhiteGMC 328 | 4V2, Volvo, WhiteGMC 329 | 4V4, Volvo, WhiteGMC 330 | 4V5, Volvo, WhiteGMC 331 | 4V6, Volvo 332 | 4VA, Volvo 333 | 4VG, Volvo, WhiteGMC 334 | 4VH, Volvo 335 | 4VJ, Volvo 336 | 4VK, Volvo 337 | 4VL, Volvo 338 | 4VM, Volvo 339 | 4VZ, Spartan 340 | 5AS, GEM 341 | 5B4, Workhorse 342 | 5CK, Western Star Trucks 343 | 5FN, Honda 344 | 5FP, Honda 345 | 5FY, New Flyer 346 | 5GA, Buick 347 | 5GR, Hummer 348 | 5GT, Hummer 349 | 5GZ, Saturn 350 | 5J6, Honda 351 | 5J8, Acura 352 | 5KJ, Western Star Trucks 353 | 5KK, Western Star Trucks 354 | 5LM, Lincoln 355 | 5LT, Lincoln 356 | 5N1, Nissan 357 | 5N3, Infiniti 358 | 5NM, Hyundai 359 | 5NP, Hyundai 360 | 5PV, Hino 361 | 5SA, Suzuki 362 | 5S3, Saab 363 | 5SX, Amercian LeFrance 364 | 5T4, Workhorse 365 | 5TB, Toyota 366 | 5TD, Toyota 367 | 5TE, Toyota 368 | 5TF, Toyota 369 | 5UM, BMW 370 | 5UX, BMW 371 | 5XY, Kia 372 | 5Y2, Pontiac 373 | 5YM, BMW 374 | 5Z6, Suzuki 375 | 6AB, MAN 376 | 6F4, Nissan 377 | 6F5, Kenworth 378 | 6FP, Ford 379 | 6G1, General Motors 380 | 6G2, Pontiac 381 | 6H8, General Motors 382 | 6MM, Mitsubishi 383 | 6MP, Mercury 384 | 6T1, Toyota 385 | 8AG, Chevrolet 386 | 8GG, Chevrolet 387 | 8AP, Fiat 388 | 8AF, Ford 389 | 8AD, Peugeot 390 | 8GD, Peugeot 391 | 8A1, Renault 392 | 8AK, Suzuki 393 | 8AJ, Toyota 394 | 8AW, Volkswagen 395 | 935, Citroen 396 | 936, Peugeot 397 | 93H, Honda 398 | 93R, Toyota 399 | 93U, Audi 400 | 93Y, Renault 401 | 9BF, Ford 402 | 9BD, Fiat 403 | 9BF, Ford 404 | 9BG, Chevrolet 405 | 9BM, Mercedes-Benz 406 | 9BS, Scania 407 | 9BW, Volkswagen 408 | 9C2, Honda 409 | 9DB, Mercedes-Benz 410 | 9DW, Volkswagen 411 | 9FB, Renault 412 | AAV, Volkswagen 413 | AC5, Hyundai 414 | ADD, Hyundai 415 | AFA, Ford 416 | AHT, Toyota 417 | CL9, Wallyscar 418 | J81, Chevrolet,Geo 419 | J87, Isuzu 420 | J8B, Chevrolet 421 | J8C, Chevrolet 422 | J8D, GMC 423 | J8Y, Chevrolet 424 | J8Z, Chevrolet 425 | JA3, Mitsubishi 426 | JA4, Mitsubishi 427 | JA7, Mitsubishi 428 | JAA, Isuzu 429 | JAB, Isuzu 430 | JAC, Isuzu 431 | JAE, Acura 432 | JAL, Isuzu 433 | JB3, Dodge 434 | JB4, Dodge 435 | JB7, Dodge 436 | JC2, Ford 437 | JD1, Daihatsu 438 | JD2, Daihatsu 439 | JE3, Eagle 440 | JF1, Subaru 441 | JF2, Subaru 442 | JF3, Subaru 443 | JF4, Saab 444 | JG1, Chevrolet, Geo 445 | JG7, Pontiac 446 | JGC, Chevrolet, Geo 447 | JH2, Honda 448 | JH3, Honda 449 | JH4, Acura 450 | JHB, Hino 451 | JHK, Honda 452 | JHL, Honda 453 | JHM, Honda 454 | JJ3, Chrysler 455 | JL5, Mitsubishi 456 | JL6, Mitsubishi 457 | JLS, Sterling 458 | JK8, Suzuki 459 | JKS, Suzuki 460 | JM1, Mazda 461 | JM2, Mazda 462 | JM3, Mazda 463 | JMB, Mitsubishi 464 | JMZ, Mazda 465 | JN1, Datsun, Nissan 466 | JN3, Nissan 467 | JN4, Nissan 468 | JN6, Datsun, Nissan 469 | JN8, Nissan 470 | JNA, Nissan 471 | JNK, Infiniti 472 | JNR, Infiniti 473 | JNX, Infiniti 474 | JP3, Plymouth 475 | JP4, Plymouth 476 | JP7, Plymouth 477 | JR2X, Isuzu 478 | JS1, Suzuki 479 | JS2, Suzuki 480 | JS3, Suzuki 481 | JS4, Suzuki 482 | JSA, Suzuki 483 | JSL, Suzuki 484 | JT2, Toyota 485 | JT3, Toyota 486 | JT4, Toyota 487 | JT5, Toyota 488 | JT6, Lexus 489 | JT8, Lexus 490 | JTD, Toyota 491 | JTE, Toyota 492 | JTH, Lexus 493 | JTJ, Lexus 494 | JTK, Scion 495 | JTL, Scion 496 | JTM, Toyota 497 | JTN, Toyota 498 | JW6, Mitsubishi 499 | JW7, Mitsubishi 500 | KL1, Chevrolet 501 | KL2, Pontiac 502 | KL5, Suzuki 503 | KL7, Asuna 504 | KLA, Daewoo 505 | KM1, Suzuki 506 | KM4, Suzuki 507 | KM8, Hyundai 508 | KMF, Hyundai 509 | KMH, Hyundai 510 | KNA, Kia 511 | KNB, Kia 512 | KNC, Kia 513 | KND, Hyundai, Kia 514 | KNJ, Ford 515 | KNM, Renault Samsung 516 | KPA, Ssangyong 517 | KPH, Mitsubishi 518 | KPT, SsangYong 519 | L56, Renault Samsung 520 | L5Y, Merato Motorcycle Taizhou Zhongneng 521 | LDY, Zhongtong Coach 522 | LES, Isuzu 523 | LGH, Dong Feng (DFM) 524 | LKL, Suzhou King Long 525 | LM1, Suzuki 526 | LM4, Suzuki 527 | LM5, Isuzu 528 | LN1, Suzuki 529 | LSY, Brilliance Zhonghua 530 | LTV, Toyota Tian Jin 531 | LVS, Ford Chang An 532 | LVV, Chery, China 533 | LVZ, DFSK 534 | LZM, MAN China 535 | LZE, Isuzu Guangzhou 536 | LZG, Shaanxi Automobile Group 537 | LZY, Yutong Zhengzhou 538 | MA1, Mahindra 539 | MA3, Suzuki 540 | MA7, Honda 541 | MAL, Hyundai 542 | MDH, Nissan 543 | MEE, Renault 544 | MEX, Volkswagen 545 | MHF, Toyota Indonesia 546 | MHR, Honda 547 | ML3, Dodge 548 | MLC, Suzuki 549 | MLH, Honda 550 | MMB, Mitsubishi 551 | MMC, Mitsubishi 552 | MNB, Ford 553 | MNT, Nissan 554 | MMB, Mitsubishi 555 | MMM, Chevrolet 556 | MMT, Mitsubishi 557 | MM8, Mazda 558 | MPA, Isuzu 559 | MP1, Isuzu 560 | MRH, Honda 561 | MR0, Toyota 562 | NLA, Honda 563 | NLE, Mercedes-Benz 564 | NM0, Ford 565 | NM4, Tofas 566 | NMT, Toyota 567 | PE1, Ford 568 | PE3, Mazda 569 | PL1, Proton 570 | SA9, Morgan 571 | SAJ, Jaguar 572 | SAL, Land Rover 573 | SAT, Triumph 574 | SAR, Rover 575 | SAX, Sterling 576 | SB1, Toyota 577 | SCA, Rolls-Royce 578 | SCB, Bentley 579 | SCC, Lotus 580 | SCE, DeLorean 581 | SCF, Aston Martin 582 | SDB, Peugeot 583 | SFD, Alexander Dennis 584 | SHH, Honda 585 | SHS, Honda 586 | SJN, Nissan 587 | SU9, Solaris 588 | TCC, SMART 589 | TDM, QUANTYA 590 | TK9, SOR 591 | TMA, Hyundai 592 | TMB, Skoda 593 | TMK, Karosa 594 | TMP, Skoda 595 | TMT, Tatra 596 | TM9, Skoda 597 | TN9, Karosa 598 | TRA, Ikarus 599 | TRU, Audi 600 | TSE, Ikarus 601 | TSM, Suzuki 602 | TW1, Toyota 603 | TYA, Mitsubishi 604 | TYB, Mitsubishi 605 | U5Y, Kia 606 | U6Y, Kia 607 | UU1, Renault Dacia 608 | UU3, ARO 609 | UU6, Daewoo 610 | VA0, ÖAF 611 | VBK, KTM 612 | VF1, Renault 613 | VF2, Renault 614 | VF3, Peugeot 615 | VF4, Talbot 616 | VF6, Renault 617 | VF7, Citroën 618 | VF8, Matra 619 | VFE, IvecoBus 620 | VG6, Mack 621 | VLU, Scania 622 | VN1, SOVAB 623 | VNE, Irisbus 624 | VNK, Toyota 625 | VNV, Renault-Nissan 626 | VSA, Mercedes-Benz 627 | VSE, Suzuki 628 | VSK, Nissan 629 | VSS, SEAT 630 | VSX, Opel 631 | VS6, Ford 632 | VS9, Carrocerias Ayats 633 | VTM, Honda 634 | VTT, Suzuki 635 | VV9, Tauro Sport Auto 636 | VWA, Nissan 637 | VWV, Volkswagen 638 | VX1, Zastava 639 | W06, Cadillac 640 | WA1, Audi 641 | WAG, Neoplan 642 | WAU, Audi 643 | WAP, Alpina 644 | WB1, BMW 645 | WBA, BMW 646 | WBS, BMW 647 | WBX, BMW 648 | WBY, BMW 649 | WD0, Dodge 650 | WD1, Dodge 651 | WD2, Dodge 652 | WD3, Mercedes-Benz 653 | WD4, Mercedes-Benz 654 | WD5, Dodge 655 | WD8, Dodge 656 | WDA, Mercedes-Benz 657 | WDB, Mercedes-Benz 658 | WDC, Mercedes-Benz 659 | WDD, Mercedes-Benz 660 | WDF, Mercedes-Benz 661 | WDP, Dodge 662 | WDX, Dodge 663 | WDY, Dodge 664 | WDZ, Mercedes-Benz 665 | WEB, EvoBus 666 | WF0, Ford 667 | WF1, Merkur 668 | WJM, Iveco 669 | WJR, Irmscher 670 | WKK, Fahrzeugwerke 671 | WMA, MAN 672 | WME, Mercedes-Benz 673 | WMX, Mercedes-Benz 674 | WMW, Mini 675 | WP0, Porsche 676 | WP1, Porsche 677 | W0L, Opel 678 | WUA, Audi 679 | WV1, Volkswagen 680 | WV2, Volkswagen 681 | WV3, Volkswagen 682 | WVG, Volkswagen 683 | WVW, Volkswagen 684 | W0L, Opel 685 | XL9, Spyker 686 | XLB, Volvo 687 | XLE, Scania 688 | XLR, DAF 689 | XMC, Mitsubishi 690 | XTA, Lada 691 | XTT, UAZ/Sollers 692 | XUF, General Motors 693 | XUU, AvtoTor 694 | XW8, Volkswagen 695 | XWB, UZ-Daewoo 696 | XWE, AvtoTor 697 | X4X, AvtoTor 698 | X7L, Renault 699 | X7M, Hyundai 700 | YC1, Honda 701 | Y6D, Zaporozhets 702 | YB3, Volvo 703 | YBW, Volkswagen 704 | YCM, Mazda 705 | YE2, Van Hool 706 | YK1, Saab 707 | YS2, Scania 708 | YS3, Saab 709 | YS4, Scania 710 | YTN, Saab 711 | YV1, Volvo 712 | YV2, Volvo 713 | YV3, Volvo 714 | YV4, Volvo 715 | YV5, Volvo 716 | Z8M, Marussia 717 | ZA9, Lamborghini 718 | ZAA, Autobianchi 719 | ZAM, Maserati 720 | ZAP, Piaggio/Vespa/Gilera 721 | ZAR, Alfa Romeo 722 | ZBN, Benelli 723 | ZC2, Chrysler 724 | ZCF, Iveco 725 | ZCG, Cagiva 726 | ZDC, Honda 727 | ZDF, Ferrari 728 | ZD0, Yamaha 729 | ZD3, Beta Motor 730 | ZD4, Aprilia 731 | ZDM, Ducati 732 | ZFA, Fiat 733 | ZFC, Fiat 734 | ZFF, Ferrari 735 | ZGA, Iveco 736 | ZGU, Moto Guzzi 737 | ZHW, Lamborghini 738 | ZJM, Malaguti 739 | ZJN, Innocenti 740 | ZKH, Husqvarna 741 | ZLA, Lancia 742 | ZOM, OM 743 | -------------------------------------------------------------------------------- /pyvin/__init__.py: -------------------------------------------------------------------------------- 1 | from .decoder import VINDecoder 2 | -------------------------------------------------------------------------------- /pyvin/data.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | VIN_CHARS = "ABCDEFGHIJKLMNOPRSTUVWXYZ1234567890" 4 | 5 | VIN_REGIONS = [("A", "H", "Africa"), 6 | ("J", "R", "Asia"), 7 | ("S", "Z", "Europe"), 8 | ("1", "5", "North America"), 9 | ("6", "7", "Oceania"), 10 | ("8", "9", "South America")] 11 | 12 | VIN_COUNTRIES = [("AA", "AH", "South Africa"), 13 | ("AJ", "AN", "Ivory Coast"), 14 | ("BA", "BE", "Angola"), 15 | ("BF", "BK", "Kenya"), 16 | ("BL", "BR", "Tanzania"), 17 | ("CA", "CE", "Benin"), 18 | ("CF", "CK", "Madagascar"), 19 | ("CL", "CR", "Tunisia"), 20 | ("DA", "DE", "Egypt"), 21 | ("DF", "DK", "Morocco"), 22 | ("DL", "DR", "Zambia"), 23 | ("EA", "EE", "Ethiopia"), 24 | ("EF", "EK", "Mozambique"), 25 | ("FA", "FE", "Ghana"), 26 | ("FF", "FK", "Nigeria"), 27 | ("JA", "J0", "Japan"), 28 | ("KA", "KE", "Sri Lanka"), 29 | ("KF", "KK", "Israel"), 30 | ("KL", "KR", "Korea (South)"), 31 | ("KS", "K0", "Kazakhstan"), 32 | ("LA", "L0", "China"), 33 | ("MA", "ME", "India"), 34 | ("MF", "MK", "Indonesia"), 35 | ("ML", "MR", "Thailand"), 36 | ("NA", "NE", "Iran"), 37 | ("NF", "NK", "Pakistan"), 38 | ("NL", "NR", "Turkey"), 39 | ("PA", "PE", "Philippines"), 40 | ("PF", "PK", "Singapore"), 41 | ("PL", "PR", "Malaysia"), 42 | ("RA", "RE", "United Arab Emirates"), 43 | ("RF", "RK", "Taiwan"), 44 | ("RL", "RR", "Vietnam"), 45 | ("RS", "R0", "Saudi Arabia"), 46 | ("SA", "SM", "United Kingdom"), 47 | ("SN", "ST", "Germany"), 48 | ("SU", "SZ", "Poland"), 49 | ("S1", "S4", "Latvia"), 50 | ("TA", "TH", "Switzerland"), 51 | ("TJ", "TP", "Czech Republic"), 52 | ("TR", "TV", "Hungary"), 53 | ("TW", "T1", "Portugal"), 54 | ("UH", "UM", "Denmark"), 55 | ("UN", "UT", "Ireland"), 56 | ("UU", "UZ", "Romania"), 57 | ("U5", "U7", "Slovakia"), 58 | ("VA", "VE", "Austria"), 59 | ("VF", "VR", "France"), 60 | ("VS", "VW", "Spain"), 61 | ("VX", "V2", "Serbia"), 62 | ("V3", "V5", "Croatia"), 63 | ("V6", "V0", "Estonia"), 64 | ("WA", "W0", "Germany"), 65 | ("XA", "XE", "Bulgaria"), 66 | ("XF", "XK", "Greece"), 67 | ("XL", "XR", "Netherlands"), 68 | ("XS", "XW", "Russia"), 69 | ("XX", "X2", "Luxembourg"), 70 | ("X3", "X0", "Russia"), 71 | ("YA", "YE", "Belgium"), 72 | ("YF", "YK", "Finland"), 73 | ("YL", "YR", "Malta"), 74 | ("YS", "YW", "Sweden"), 75 | ("YX", "Y2", "Norway"), 76 | ("Y3", "Y5", "Belarus"), 77 | ("Y6", "Y0", "Ukraine"), 78 | ("ZA", "ZR", "Italy"), 79 | ("ZX", "Z2", "Slovenia"), 80 | ("Z3", "Z5", "Lithuania"), 81 | ("1A", "10", "United States"), 82 | ("2A", "20", "Canada"), 83 | ("3A", "37", "Mexico"), 84 | ("38", "30", "Cayman Islands"), 85 | ("4A", "40", "United States"), 86 | ("5A", "50", "United States"), 87 | ("6A", "6W", "Australia"), 88 | ("7A", "7E", "New Zealand"), 89 | ("8A", "8E", "Argentina"), 90 | ("8F", "8K", "Chile"), 91 | ("8L", "8R", "Ecuador"), 92 | ("8S", "8W", "Peru"), 93 | ("8X", "82", "Venezuela"), 94 | ("9A", "9E", "Brazil"), 95 | ("9F", "9K", "Colombia"), 96 | ("9L", "9R", "Paraguay"), 97 | ("9S", "9W", "Uruguay"), 98 | ("9X", "92", "Trinidad & Tobago"), 99 | ("93", "99", "Brazil")] 100 | 101 | YEARS = { 102 | "A": 2010, #1980, 103 | "B": 2011, #1981, 104 | "C": 2012, #1982, 105 | "D": 2013, #1983, 106 | "E": 2014, #1984, 107 | "F": 2015, #1985, 108 | "G": 2016, #1986, 109 | "H": 2017, #1987, 110 | "J": 2018, #1988, 111 | "K": 2019, #1989, 112 | "L": 1990, 113 | "M": 1991, 114 | "N": 1992, 115 | "P": 1993, 116 | "R": 1994, 117 | "S": 1995, 118 | "T": 1996, 119 | "V": 1997, 120 | "W": 1998, 121 | "X": 1999, 122 | "Y": 2000, 123 | "1": 2001, 124 | "2": 2002, 125 | "3": 2003, 126 | "4": 2004, 127 | "5": 2005, 128 | "6": 2006, 129 | "7": 2007, 130 | "8": 2008, 131 | "9": 2009, 132 | } 133 | 134 | def get_region(r): 135 | qi = VIN_CHARS.index(r) 136 | for region in VIN_REGIONS: 137 | i = VIN_CHARS.index(region[0]) 138 | j = VIN_CHARS.index(region[1]) 139 | if qi >= i and qi <= j: 140 | return region[2] 141 | return "Unknown" 142 | 143 | 144 | def get_index(s): 145 | return VIN_CHARS.index(s[0])*len(VIN_CHARS)+VIN_CHARS.index(s[1]) 146 | 147 | 148 | def get_country(c): 149 | qi = get_index(c) 150 | for country in VIN_COUNTRIES: 151 | i = get_index(country[0]) 152 | j = get_index(country[1]) 153 | if qi >= i and qi <= j: 154 | return country[2] 155 | return "Not assigned" 156 | 157 | 158 | def get_year(c): 159 | if len(c) == 1: 160 | return YEARS[c] 161 | elif len(c) == 2: 162 | if c[0].isdigit(): 163 | return YEARS[c[1]] 164 | else: 165 | return YEARS[c[1]]+20 166 | return 1979 167 | 168 | 169 | class WMIDatabase(object): 170 | def __init__(self, name): 171 | path = os.path.join(os.path.dirname( 172 | os.path.dirname( 173 | os.path.abspath(__file__))), 174 | "data", name) 175 | # print path, os.path.abspath(__file__) 176 | self.db = {} 177 | with open(path, "r") as f: 178 | for line in f: 179 | wmi, name = line.strip().split(",", 1) 180 | self.db[wmi] = name.strip() 181 | 182 | def get(self, wmi): 183 | return self.db[wmi] 184 | -------------------------------------------------------------------------------- /pyvin/decoder.py: -------------------------------------------------------------------------------- 1 | from .data import WMIDatabase, get_region, get_country, get_year 2 | 3 | 4 | class InvalidVINException(Exception): 5 | pass 6 | 7 | 8 | class VINDecoder(object): 9 | def __init__(self): 10 | self.wmi_db = WMIDatabase("wmi_vinquery.csv") 11 | 12 | def parse_wmi(self, vin): 13 | region_code = vin[0] 14 | country_code = vin[0:2] 15 | wmi = vin[0:3] 16 | region = get_region(region_code) 17 | country = get_country(country_code) 18 | manufacturer = self.wmi_db.get(wmi) 19 | return region, country, manufacturer 20 | 21 | def parse_vds(self, vin, region, manufacturer): 22 | vds = vin[3:8] 23 | check = True 24 | return "Unknown", check 25 | 26 | def parse_vis(self, vin, region, manufacturer): 27 | vis = vin[9:] 28 | # XXX determine make and based on that get 1 or 2 character year code 29 | # from position 7 and 10 accordingly 30 | year_code = vis[0] 31 | try: 32 | year = get_year(year_code) 33 | except KeyError: 34 | year = None 35 | plant = vis[1] 36 | serial = vis[2:] 37 | return year, plant, serial 38 | 39 | def decode(self, vin): 40 | if len(vin) != 17: 41 | raise InvalidVINException() 42 | region, country, manufacturer = self.parse_wmi(vin) 43 | model, check = self.parse_vds(vin, region, manufacturer) 44 | year, plant, serial = self.parse_vis(vin, region, manufacturer) 45 | return { 46 | "region": region, 47 | "country": country, 48 | "manufacturer": manufacturer, 49 | "model": model, 50 | "check": check, 51 | "year": year, 52 | "assembly plant": plant, 53 | "serial": serial, 54 | } 55 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | argparse==1.2.1 2 | ipython==3.0.0 3 | nose==1.3.4 4 | wsgiref==0.1.2 5 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [nosetests] 2 | verbosity=1 3 | detailed-errors=1 4 | with-coverage=1 5 | cover-package=nose 6 | debug=nose.loader 7 | pdb=0 8 | pdb-failures=0 9 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | 3 | setup( 4 | name="pyvin", 5 | version="0.1", 6 | packages=find_packages(), 7 | setup_requires=['nose>=1.0'] 8 | ) 9 | -------------------------------------------------------------------------------- /tests/test_data.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | 3 | from pyvin.data import WMIDatabase, get_country, get_region 4 | 5 | 6 | class TestData(unittest.TestCase): 7 | def test_region(self): 8 | expects = {"S": "Europe"} 9 | 10 | for k, v in expects.items(): 11 | e = get_region(k) 12 | self.assertEqual(v, e) 13 | 14 | def test_country(self): 15 | expects = {"SC": "United Kingdom"} 16 | 17 | for k, v in expects.items(): 18 | e = get_country(k) 19 | self.assertEqual(v, e) 20 | 21 | def test_wmidb(self): 22 | wmi_db = WMIDatabase("wmi_vinquery.csv") 23 | expects = {"SCC": "Lotus"} 24 | 25 | for k, v in expects.items(): 26 | e = wmi_db.get(k) 27 | self.assertEqual(v, e) 28 | -------------------------------------------------------------------------------- /tests/test_iso.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | 3 | from pyvin import VINDecoder 4 | 5 | 6 | class TestISO(unittest.TestCase): 7 | def test_valids(self): 8 | expects = {"SCCFE33C9VHF65358": {"region": "Europe", 9 | "country": "United Kingdom", 10 | "manufacturer": "Lotus", 11 | "model": "Unknown", 12 | "check": True, # valid 13 | "year": 1997, 14 | "assembly plant": "H", 15 | "serial": "F65358"}} 16 | decoder = VINDecoder() 17 | for vin, e in expects.items(): 18 | result = decoder.decode(vin) 19 | for k, v in result.items(): 20 | self.assertEqual(v, e[k], msg=k) 21 | --------------------------------------------------------------------------------