Skip to content

Instantly share code, notes, and snippets.

@np5
Last active February 27, 2025 21:17
Show Gist options
  • Save np5/a5603d1698ae88bd20e26e542e3db786 to your computer and use it in GitHub Desktop.
Save np5/a5603d1698ae88bd20e26e542e3db786 to your computer and use it in GitHub Desktop.
Apple computer / model identifiers model id models ID IDENTIFIERS APPLE mac MacPro script parse download output
Model Type Identifier
MacBook Air LAPTOP Mac14,15
MacBook Air LAPTOP Mac14,2
MacBook Air LAPTOP Mac15,12
MacBook Air LAPTOP Mac15,13
MacBook Air LAPTOP MacBookAir10,1
MacBook Air LAPTOP MacBookAir2,1
MacBook Air LAPTOP MacBookAir3,1
MacBook Air LAPTOP MacBookAir3,2
MacBook Air LAPTOP MacBookAir4,1
MacBook Air LAPTOP MacBookAir4,2
MacBook Air LAPTOP MacBookAir5,1
MacBook Air LAPTOP MacBookAir5,2
MacBook Air LAPTOP MacBookAir6,1
MacBook Air LAPTOP MacBookAir6,1
MacBook Air LAPTOP MacBookAir6,2
MacBook Air LAPTOP MacBookAir6,2
MacBook Air LAPTOP MacBookAir7,1
MacBook Air LAPTOP MacBookAir7,2
MacBook Air LAPTOP MacBookAir7,2
MacBook Air LAPTOP MacBookAir8,1
MacBook Air LAPTOP MacBookAir8,2
MacBook Air LAPTOP MacBookAir9,1
MacBook Pro LAPTOP Mac14,10
MacBook Pro LAPTOP Mac14,5
MacBook Pro LAPTOP Mac14,6
MacBook Pro LAPTOP Mac14,7
MacBook Pro LAPTOP Mac14,9
MacBook Pro LAPTOP Mac15,10
MacBook Pro LAPTOP Mac15,11
MacBook Pro LAPTOP Mac15,3
MacBook Pro LAPTOP Mac15,6
MacBook Pro LAPTOP Mac15,7
MacBook Pro LAPTOP Mac15,8
MacBook Pro LAPTOP Mac15,9
MacBook Pro LAPTOP Mac16,1
MacBook Pro LAPTOP Mac16,5
MacBook Pro LAPTOP Mac16,6
MacBook Pro LAPTOP Mac16,7
MacBook Pro LAPTOP Mac16,8
MacBook Pro LAPTOP MacBookPro10,1
MacBook Pro LAPTOP MacBookPro10,1
MacBook Pro LAPTOP MacBookPro10,2
MacBook Pro LAPTOP MacBookPro10,2
MacBook Pro LAPTOP MacBookPro11,1
MacBook Pro LAPTOP MacBookPro11,1
MacBook Pro LAPTOP MacBookPro11,2
MacBook Pro LAPTOP MacBookPro11,2
MacBook Pro LAPTOP MacBookPro11,3
MacBook Pro LAPTOP MacBookPro11,3
MacBook Pro LAPTOP MacBookPro11,4
MacBook Pro LAPTOP MacBookPro11,5
MacBook Pro LAPTOP MacBookPro12,1
MacBook Pro LAPTOP MacBookPro13,1
MacBook Pro LAPTOP MacBookPro13,2
MacBook Pro LAPTOP MacBookPro13,3
MacBook Pro LAPTOP MacBookPro14,1
MacBook Pro LAPTOP MacBookPro14,2
MacBook Pro LAPTOP MacBookPro14,3
MacBook Pro LAPTOP MacBookPro15,1
MacBook Pro LAPTOP MacBookPro15,1
MacBook Pro LAPTOP MacBookPro15,2
MacBook Pro LAPTOP MacBookPro15,2
MacBook Pro LAPTOP MacBookPro15,3
MacBook Pro LAPTOP MacBookPro15,4
MacBook Pro LAPTOP MacBookPro16,1
MacBook Pro LAPTOP MacBookPro16,2
MacBook Pro LAPTOP MacBookPro16,3
MacBook Pro LAPTOP MacBookPro16,4
MacBook Pro LAPTOP MacBookPro17,1
MacBook Pro LAPTOP MacBookPro18,1
MacBook Pro LAPTOP MacBookPro18,2
MacBook Pro LAPTOP MacBookPro18,3
MacBook Pro LAPTOP MacBookPro18,4
MacBook Pro LAPTOP MacBookPro4,1
MacBook Pro LAPTOP MacBookPro4,1
MacBook Pro LAPTOP MacBookPro5,1
MacBook Pro LAPTOP MacBookPro5,2
MacBook Pro LAPTOP MacBookPro5,2
MacBook Pro LAPTOP MacBookPro5,3
MacBook Pro LAPTOP MacBookPro5,3
MacBook Pro LAPTOP MacBookPro5,5
MacBook Pro LAPTOP MacBookPro6,1
MacBook Pro LAPTOP MacBookPro6,2
MacBook Pro LAPTOP MacBookPro7,1
MacBook Pro LAPTOP MacBookPro8,1
MacBook Pro LAPTOP MacBookPro8,1
MacBook Pro LAPTOP MacBookPro8,2
MacBook Pro LAPTOP MacBookPro8,2
MacBook Pro LAPTOP MacBookPro8,3
MacBook Pro LAPTOP MacBookPro8,3
MacBook Pro LAPTOP MacBookPro9,1
MacBook Pro LAPTOP MacBookPro9,2
Mac mini DESKTOP Mac14,12
Mac mini DESKTOP Mac14,3
Mac mini DESKTOP Mac16,10
Mac mini DESKTOP Mac16,11
Mac mini DESKTOP Macmini3,1
Mac mini DESKTOP Macmini3,1
Mac mini DESKTOP Macmini4,1
Mac mini DESKTOP Macmini5,1
Mac mini DESKTOP Macmini5,2
Mac mini DESKTOP Macmini6,1
Mac mini DESKTOP Macmini6,2
Mac mini DESKTOP Macmini7,1
Mac mini DESKTOP Macmini8,1
Mac mini DESKTOP Macmini9,1
Mac Studio DESKTOP Mac13,1
Mac Studio DESKTOP Mac13,2
Mac Studio DESKTOP Mac14,13
Mac Studio DESKTOP Mac14,14
iMac DESKTOP Mac15,4
iMac DESKTOP Mac15,5
iMac DESKTOP Mac16,2
iMac DESKTOP Mac16,3
iMac DESKTOP iMac10,1
iMac DESKTOP iMac10,1
iMac DESKTOP iMac11,2
iMac DESKTOP iMac11,3
iMac DESKTOP iMac12,1
iMac DESKTOP iMac12,2
iMac DESKTOP iMac13,1
iMac DESKTOP iMac13,2
iMac DESKTOP iMac14,1
iMac DESKTOP iMac14,2
iMac DESKTOP iMac14,4
iMac DESKTOP iMac15,1
iMac DESKTOP iMac15,1
iMac DESKTOP iMac16,1
iMac DESKTOP iMac16,2
iMac DESKTOP iMac17,1
iMac DESKTOP iMac18,1
iMac DESKTOP iMac18,2
iMac DESKTOP iMac18,3
iMac DESKTOP iMac19,1
iMac DESKTOP iMac19,2
iMac DESKTOP iMac20,1
iMac DESKTOP iMac20,2
iMac DESKTOP iMac21,1
iMac DESKTOP iMac21,2
iMac DESKTOP iMac9,1
iMac DESKTOP iMac9,1
iMac DESKTOP iMacPro1,1
Mac Pro DESKTOP Mac14,8
Mac Pro DESKTOP Mac14,8
Mac Pro DESKTOP MacPro4,1
Mac Pro DESKTOP MacPro5,1
Mac Pro DESKTOP MacPro5,1
Mac Pro DESKTOP MacPro5,1
Mac Pro DESKTOP MacPro5,1
Mac Pro DESKTOP MacPro6,1
Mac Pro DESKTOP MacPro7,1
Mac Pro DESKTOP MacPro7,1
import argparse
import re
import urllib.request
MODEL_IDENTIFIER_RE = re.compile(r"i?[A-Z][a-zA-Z]+[0-9]{1,2},[0-9]{1,2}")
PAGES = (
("https://support.apple.com/en-us/HT201862", "MacBook Air", "LAPTOP"),
("https://support.apple.com/en-us/HT201300", "MacBook Pro", "LAPTOP"),
("https://support.apple.com/en-us/HT201894", "Mac mini", "DESKTOP"),
("https://support.apple.com/en-us/HT213073", "Mac Studio", "DESKTOP"),
("https://support.apple.com/en-us/HT201634", "iMac", "DESKTOP"),
("https://support.apple.com/en-us/HT202888", "Mac Pro", "DESKTOP"),
)
def get_page_content(url):
f = urllib.request.urlopen(url)
return f.read().decode("utf-8")
def extract_model_identifiers(content):
for line in content.splitlines():
if "Model Identifier" not in line:
continue
for match in MODEL_IDENTIFIER_RE.findall(line):
yield match
def pretty_print(model, machine_type, model_identifiers):
print(model, "-", machine_type.title())
for model_identifier in model_identifiers:
print(" -", model_identifier)
def quick_and_dirty_header_print():
print("Model,Type,Identifier")
def quick_and_dirty_csv_print(model, machine_type, model_identifiers):
for model_identifier in model_identifiers:
print(f'{model},{machine_type},"{model_identifier}"')
def get_all_model_identifiers(args):
if args.csv:
quick_and_dirty_header_print()
aggs = []
for url, model, machine_type in PAGES:
content = get_page_content(url)
model_identifiers = list(extract_model_identifiers(content))
model_identifiers.sort()
if args.pretty:
pretty_print(model, machine_type, model_identifiers)
elif args.csv:
quick_and_dirty_csv_print(model, machine_type, model_identifiers)
elif args.ztl:
for model_identifier in model_identifiers:
aggs.append((model_identifier, machine_type))
if aggs:
aggs.sort(key=lambda k: (-1*len(k[0]), k[0].lower()))
for model_identifier, machine_type in aggs:
print(f" ('{model_identifier.lower()}', {machine_type}),")
if __name__ == "__main__":
parser = argparse.ArgumentParser("apple_model_identifiers.py")
group = parser.add_mutually_exclusive_group()
group.add_argument('-z', '--ztl', action='store_true', help='Zentral output')
group.add_argument('-p', '--pretty', action='store_true', help='Pretty print')
group.add_argument('-c', '--csv', action='store_true', help='CSV output')
args = parser.parse_args()
get_all_model_identifiers(args)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment