Skip to content

Instantly share code, notes, and snippets.

@nbadal
Last active January 28, 2023 14:21
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save nbadal/9efeb14856b3d5c4b7bf3dc5c784d166 to your computer and use it in GitHub Desktop.
Save nbadal/9efeb14856b3d5c4b7bf3dc5c784d166 to your computer and use it in GitHub Desktop.
Tesla Part Catalog SVG Downloader (requires "requests": pip install requests)
import json
import os
import sys
import time
import requests
if sys.version_info > (3, 0):
from urllib.parse import unquote
else:
from urllib import unquote
apiBase = 'https://epc.teslamotors.com/api'
models = ['modelS', 'modelSR', 'modelX', 'model3', 'roadster', 'tooling']
downloads = []
session = requests.Session()
sessionRes = session.post(apiBase + '/generalsessions')
session.headers.update({'X-XSRF-TOKEN': unquote(session.cookies['XSRF-TOKEN'])})
for model in models:
modelRes = session.get(apiBase + '/' + model + '/Categories')
modelData = json.loads(modelRes.text)
modelName = modelData[0]['catalog']['name']
print('Getting categories for ' + modelName + '...')
for category in modelData:
categoryName = category['title']
categoryId = category['id']
print('\t- Getting subcategories for ' + categoryName + '...')
for subcategory in category['subcategories']:
subcatId = subcategory['id']
subcatName = subcategory['title']
print('\t\t- Getting parts for ' + subcatName + '...')
subcatRes = session.get(apiBase + '/Categories/' + str(categoryId) + '/subcategories/' + str(subcatId))
subcatData = json.loads(subcatRes.text)
for group in subcatData['systemGroups']:
groupTitle = group['title']
groupImage = group['image']
if groupImage is None or 'NULL' in groupImage:
continue
fileName = groupImage.split('/')[-1]
url = apiBase + '/drawings/' + groupImage
downloadPath = os.path.join('output', modelName, categoryName, subcatName, fileName)
downloads.append((url, downloadPath))
time.sleep(0.25) # Rate limiting.
currentDl = 1
for (url, downloadPath) in downloads:
print('[{0}/{1}] Downloading {2}'.format(currentDl, len(downloads), downloadPath))
currentDl += 1
dir = os.path.dirname(downloadPath)
if sys.version_info > (3, 0):
os.makedirs(dir, exist_ok=True)
else:
if not os.path.exists(dir):
os.makedirs(dir)
fileRes = requests.get(url, allow_redirects=True)
open(downloadPath, 'wb').write(fileRes.content)
time.sleep(0.5) # Rate limiting.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment