import csv
from dataclasses import dataclass
from typing import List
import json
@dataclass
class CursorVersion:
version: str
build_id: str
def get_download_links(self) -> dict:
base_url = f"https://downloader.cursor.sh/builds/{self.build_id}"
return {
"windows": {
"x64": f"{base_url}/windows/nsis/x64",
"arm64": f"{base_url}/windows/nsis/arm64"
},
"mac": {
"universal": f"{base_url}/mac/installer/universal",
"arm64": f"{base_url}/mac/installer/arm64",
"x64": f"{base_url}/mac/installer/x64"
},
"linux": {
"x64": f"{base_url}/linux/appImage/x64"
}
}
def parse_versions(data: str) -> List[CursorVersion]:
versions = []
for line in data.strip().split('\n'):
if not line:
continue
version, build_id = line.strip().split(',')
versions.append(CursorVersion(version, build_id))
return versions
def generate_markdown(versions: List[CursorVersion]) -> str:
md = """# 🖥️ Windows
## x64
📦 Windows x64 安装包
| 版本 | 下载链接 |
|------|----------|
"""
# Windows x64
for version in versions:
links = version.get_download_links()
md += f"| {version.version} | [下载]({links['windows']['x64']}) |\n"
md += """
## ARM64
📱 Windows ARM64 安装包
| 版本 | 下载链接 |
|------|----------|
"""
# Windows ARM64
for version in versions:
links = version.get_download_links()
md += f"| {version.version} | [下载]({links['windows']['arm64']}) |\n"
md += """
# 🍎 macOS
## Universal
🎯 macOS Universal 安装包
| 版本 | 下载链接 |
|------|----------|
"""
# macOS Universal
for version in versions:
links = version.get_download_links()
md += f"| {version.version} | [下载]({links['mac']['universal']}) |\n"
md += """
## ARM64
💪 macOS ARM64 安装包
| 版本 | 下载链接 |
|------|----------|
"""
# macOS ARM64
for version in versions:
links = version.get_download_links()
md += f"| {version.version} | [下载]({links['mac']['arm64']}) |\n"
md += """
## Intel
💻 macOS Intel 安装包
| 版本 | 下载链接 |
|------|----------|
"""
# macOS Intel
for version in versions:
links = version.get_download_links()
md += f"| {version.version} | [下载]({links['mac']['x64']}) |\n"
md += """
# 🐧 Linux
## x64
🎮 Linux x64 AppImage
| 版本 | 下载链接 |
|------|----------|
"""
# Linux x64
for version in versions:
links = version.get_download_links()
md += f"| {version.version} | [下载]({links['linux']['x64']}) |\n"
md += """
"""
return md
def main():
# 示例数据
data = """
0.45.11,250207y6nbaw5qc
0.45.10,250205buadkzpea
0.45.9,250202tgstl42dt
0.45.8,250201b44xw1x2k
0.45.7,250130nr6eorv84
0.45.6,25013021lv9say3
0.45.5,250128loaeyulq8
0.45.4,250126vgr3vztvj
0.45.3,250124b0rcj0qql
0.45.2,250123mhituoa6o
0.45.1,2501213ljml5byg
0.45.0,250120dh9ezx9pg
0.44.11,250103fqxdt5u9z
0.44.10,250102ys80vtnud
0.44.9,2412268nc6pfzgo
0.44.8,241222ooktny8mh
0.44.7,2412219nhracv01
0.44.6,2412214pmryneua
0.44.5,241220s3ux0e1tv
0.44.4,241219117fcvexy
0.44.3,241218sybfbogmq
0.44.2,241218ntls52u8v
0.44.0,2412187f9v0nffu
0.43.6,241206z7j6me2e2
0.43.5,241127pdg4cnbu2
0.43.4,241126w13goyvrs
0.43.3,2411246yqzx1jmm
0.43.1,241124gsiwb66nc
0.42.5,24111460bf2loz1
0.42.4,2410291z3bdg1dy
0.42.3,241016kxu9umuir
0.42.2,2410127mj66lvaq
0.42.1,241011i66p9fuvm
0.42.0,241009fij7nohn5
0.41.3,240925fkhcqg263
0.41.2,240921llnho65ov
0.41.1,2409189xe3envg5
0.40.4,2409052yfcjagw2
0.40.3,240829epqamqp7h
0.40.2,240828c021k3aib
0.40.1,2408245thnycuzj
0.40.0,24082202sreugb2
0.39.6,240819ih4ta2fye
0.39.5,240814y9rhzmu7h
0.39.4,240810elmeg3seq
0.39.3,2408092hoyaxt9m
0.39.2,240808phaxh4b5r
0.39.1,240807g919tr4ly
0.39.0,240802cdixtv9a6
0.38.1,240725f0ti25os7
0.38.0,240723790oxe4a2
0.37.1,240714yrr3gmv3k
0.36.2,2407077n6pzboby
0.36.1,240706uekt2eaft
0.36.0,240703xqkjv5aqa
0.35.1,240621pc2f7rl8a
0.35.0,240608cv11mfsjl
0.34.6,240606kgzq24cfb
0.34.6,240605r495newcf
0.34.5,240602rq6xovt3a
0.34.4,2406014h0rgjghe
0.34.3,240529baisuyd2e
0.34.2,240528whh1qyo9h
0.34.1,24052838ygfselt
0.34.0,240527xus72jmkj
0.33.4,240511kb8wt1tms
0.33.3,2405103lx8342ta
0.33.2,240510dwmw395qe
0.33.1,2405039a9h2fqc9
0.33.0,240503hyjsnhazo
0.32.8,240428d499o6zja
0.32.7,240427w5guozr0l
0.32.2,240417ab4wag7sx
0.32.1,2404152czor73fk
0.32.0,240412ugli06ue0
0.31.3,240402rq154jw46
0.31.1,240402pkwfm2ps6
0.31.0,2404018j7z0xv2g
0.30.5,240327tmd2ozdc7
0.30.4,240325dezy8ziab
0.30.3,2403229gtuhto9g
0.30.2,240322gzqjm3p0d
0.30.1,2403212w1ejubt8
0.30.0,240320tpx86e7hk
0.29.1,2403027twmz0d1t
0.29.0,240301kpqvacw2h
0.28.1,240226tstim4evd
0.28.0,240224g2d7jazcq
0.27.4,240219qdbagglqz
0.27.3,240218dxhc6y8os
0.27.2,240216kkzl9nhxi
0.27.1,240215l4ooehnyl
0.27.0,240215at6ewkd59
0.26.2,240212o6r9qxtcg
0.26.1,2402107t904hing
0.26.0,240210k8is5xr6v
0.25.3,240207aacboj1k8
0.25.2,240206p3708uc9z
0.25.1,2402033t030rprh
0.25.0,240203kh86t91q8
0.24.4,240129iecm3e33w
0.24.3,2401289dx79qsc0
0.24.1,240127cad17436d
0.24.0,240126wp9irhmza
0.23.9,240124dsmraeml3
0.23.8,240123fnn1hj1fg
0.23.7,240123xsfe7ywcv
0.23.6,240121m1740elox
0.23.5,2401215utj6tx6q
0.23.4,240121f4qy6ba2y
0.23.3,2401201und3ytom
0.23.2,240120an2k2hf1i
0.23.1,240119fgzxwudn9
0.22.2,24011721vsch1l1
0.22.1,2401083eyk8kmzc
0.22.0,240107qk62kvva3
0.21.1,231230h0vi6srww
0.21.0,231229ezidnxiu3
0.20.2,231219aksf83aad
0.20.1,231218ywfaxax09
0.20.0,231216nsyfew5j1
0.19.1,2312156z2ric57n
0.19.0,231214per9qal2p
0.18.8,2312098ffjr3ign
0.18.7,23120880aolip2i
0.18.6,231207ueqazwde8
0.18.5,231206jzy2n2sbi
0.18.4,2312033zjv5fqai
0.18.3,231203k2vnkxq2m
0.18.1,23120176kaer07t
0.17.0,231127p7iyxn8rg
0.16.0,231116rek2xuq6a
0.15.5,231115a5mv63u9f
0.15.4,23111469e1i3xyi
0.15.3,231113b0yv3uqem
0.15.2,231113ah0kuf3pf
0.15.1,231111yanyyovap
0.15.0,231110mdkomczmw
0.14.1,231109xitrgihlk
0.14.0,231102m6tuamwbx
0.13.4,231029rso7pso8l
0.13.3,231025uihnjkh9v
0.13.2,231024w4iv7xlm6
0.13.1,231022f3j0ubckv
0.13.0,231022ptw6i4j42
0.12.3,231008c5ursm0oj"""
versions = parse_versions(data)
# 生成 Markdown 文件
markdown_content = generate_markdown(versions)
with open('Cursor历史.md', 'w', encoding='utf-8') as f:
f.write(markdown_content)
# 创建结果数据结构
result = {
"versions": []
}
# 处理每个版本
for version in versions:
version_info = {
"version": version.version,
"build_id": version.build_id,
"downloads": version.get_download_links()
}
result["versions"].append(version_info)
# 保存为JSON文件
with open('cursor_downloads.json', 'w', encoding='utf-8') as f:
json.dump(result, f, indent=2, ensure_ascii=False)
# 同时生成CSV格式的下载链接
with open('cursor_downloads.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['Version', 'Platform', 'Architecture', 'Download URL'])
for version in versions:
links = version.get_download_links()
for platform, archs in links.items():
for arch, url in archs.items():
writer.writerow([version.version, platform, arch, url])
if __name__ == "__main__":
main()