https://gitee.com/anyphasy/trae-history-builds

7月底之后,

3.3.81开始换成积分制,不友好,用完没法使用

最后一个3.3.80版本是2.3.59356

下载链接:

https://lf-cdn.trae.com.cn/obj/trae-com-cn/pkg/app/releases/stable/2.3.59356/win32/Trae_CN-Setup-x64.exe

Traework也是0.1.39是最后一个无积分版本

https://lf-cdn.trae.com.cn/obj/trae-com-cn/pkg/app/releases/stable/2.3.57763/win32/TRAE_Work_CN-Setup-x64.exe

新代码,用于寻找版本

import sys
import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
import threading
import time
import os
import json

# https://lf-cdn.trae.com.cn/obj/trae-com-cn/pkg/app/releases/stable/2.3.62837/win32/Trae_CN-Setup-x64.exe
base_url = "https://lf-cdn.trae.com.cn/obj/trae-com-cn/pkg/app/releases/stable/{version}/win32/Trae_CN-Setup-x64.exe"

file_lock = threading.Lock()
counter_lock = threading.Lock()
progress_lock = threading.Lock()

found_count = 0
checked_count = 0

PROGRESS_FILE = "trae_scan_progress.json"
RESULT_FILE = "trae_available_versions.txt"


# ============================================================
# 断点续传:保存和加载进度
# ============================================================
def save_progress(last_checked_index, found_versions):
    with progress_lock:
        data = {
            "last_checked_index": last_checked_index,
            "found_versions": found_versions,
            "save_time": time.strftime('%Y-%m-%d %H:%M:%S')
        }
        with open(PROGRESS_FILE, "w", encoding="utf-8") as f:
            json.dump(data, f, ensure_ascii=False, indent=2)


def load_progress():
    if os.path.exists(PROGRESS_FILE):
        with open(PROGRESS_FILE, "r", encoding="utf-8") as f:
            data = json.load(f)
        return data
    return None


def save_result(version, url):
    with file_lock:
        with open(RESULT_FILE, "a", encoding="utf-8") as f:
            f.write(f"{version} {url}\n")


# ============================================================
# 检测单个版本
# ============================================================
def check_version(version):
    url = base_url.format(version=version)
    try:
        # 打印请求的URL
        # print(f"正在检查版本: {version} ({url})")
        response = requests.head(url, timeout=5, allow_redirects=True)
        if response.status_code == 200:
            return (version, url, True)
        return (version, url, False)
    except:
        return (version, url, False)


# ============================================================
# 生成版本列表(从新到旧)
# ============================================================


def generate_versions():
    versions = []
    # 可以👇自己调整

    # 2.3.62837 → 2.3.58
    for patch in range(62839, 27281,  -1):
        versions.append(f"2.3.{patch}")

    # # 2.3.62837 → 2.3.0
    # for patch in range(62839, -1, -1):
    #     versions.append(f"2.3.{patch}")

    # # 2.2.MAX → 2.2.0
    # for patch in range(70000, -1, -1):
    #     versions.append(f"2.2.{patch}")

    # # 2.1.MAX → 2.1.0
    # for patch in range(70000, -1, -1):
    #     versions.append(f"2.1.{patch}")

    # # 2.0.MAX → 2.0.0
    # for patch in range(70000, -1, -1):
    #     versions.append(f"2.0.{patch}")

    return versions


# ============================================================
# 主函数
# ============================================================
def main():
    global found_count, checked_count

    print("正在生成版本列表...")
    all_versions = generate_versions()
    total = len(all_versions)
    print(f"总版本数: {total}")

    # ============================================================
    # 检查是否有断点
    # ============================================================
    progress = load_progress()
    if progress:
        last_index = progress["last_checked_index"]
        found_list = progress.get("found_versions", [])
        save_time = progress.get("save_time", "未知")

        print(f"\n{'='*50}")
        print(f"发现上次中断的进度!")
        print(f"  上次保存时间: {save_time}")
        print(f"  上次扫描到第: {last_index}/{total}")
        print(f"  上次已找到: {len(found_list)} 个版本")
        print(f"  剩余: {total - last_index} 个版本")
        print(f"{'='*50}")

        choice = input("\n是否继续上次的扫描?(y=继续 / n=从头开始): ").strip().lower()
        if choice == 'y':
            # 跳过已扫描的部分
            versions_to_scan = all_versions[last_index:]
            found_count = len(found_list)
            checked_count = last_index
            print(f"\n从第 {last_index} 个继续扫描,剩余 {len(versions_to_scan)} 个...")
        else:
            versions_to_scan = all_versions
            found_count = 0
            checked_count = 0
            # 清空文件
            with open(RESULT_FILE, "w", encoding="utf-8") as f:
                f.write("=== Trae CN 可用版本扫描结果 ===\n")
                f.write(f"扫描范围: 2.3.62837 ~ 2.0.0(从新到旧)\n")
                f.write(f"开始时间: {time.strftime('%Y-%m-%d %H:%M:%S')}\n")
                f.write("=" * 50 + "\n")
            if os.path.exists(PROGRESS_FILE):
                os.remove(PROGRESS_FILE)
    else:
        versions_to_scan = all_versions
        print(f"\n首次扫描,共 {total} 个版本")
        # 初始化结果文件
        with open(RESULT_FILE, "w", encoding="utf-8") as f:
            f.write("=== Trae CN 可用版本扫描结果 ===\n")
            f.write(f"扫描范围: 2.3.62837 ~ 2.0.0(从新到旧)\n")
            f.write(f"开始时间: {time.strftime('%Y-%m-%d %H:%M:%S')}\n")
            f.write("=" * 50 + "\n")

    print(f"使用 50 线程加速...")
    print(f"支持 Ctrl+C 随时中断,下次运行自动续传\n")

    available_versions = []
    start_time = time.time()

    # 分批扫描,每批 1000 个,每批结束保存进度
    BATCH_SIZE = 1000
    batches = []
    for i in range(0, len(versions_to_scan), BATCH_SIZE):
        batches.append(versions_to_scan[i:i + BATCH_SIZE])

    batch_start_index = checked_count

    try:
        for batch_num, batch in enumerate(batches):
            batch_results = []

            with ThreadPoolExecutor(max_workers=50) as executor:
                futures = {executor.submit(check_version, v): v for v in batch}

                for future in as_completed(futures):
                    version, url, ok = future.result()

                    with counter_lock:
                        checked_count += 1
                        current = checked_count

                    if ok:
                        with counter_lock:
                            found_count += 1
                            idx = found_count

                        available_versions.append((version, url))
                        batch_results.append(version)
                        save_result(version, url)

                        elapsed = time.time() - start_time
                        speed = (current - batch_start_index) / \
                            elapsed if elapsed > 0 else 0
                        remaining = (total - current) / \
                            speed if speed > 0 else 0

                        print(f"\n✅ [{current}/{total}] 发现版本: {version}")
                        print(f"   下载地址: {url}")
                        print(f"   已找到: {idx} 个 | "
                              f"进度: {current/total*100:.1f}% | "
                              f"速度: {speed:.0f}/秒 | "
                              f"剩余: {remaining/60:.0f}分钟")
                    else:
                        if current % 200 == 0:
                            elapsed = time.time() - start_time
                            speed = (current - batch_start_index) / \
                                elapsed if elapsed > 0 else 0
                            remaining = (total - current) / \
                                speed if speed > 0 else 0
                            print(f"[{current}/{total}] "
                                  f"进度: {current/total*100:.1f}% | "
                                  f"速度: {speed:.0f}/秒 | "
                                  f"已找到: {found_count} | "
                                  f"剩余: {remaining/60:.0f}分钟",
                                  flush=True)

            # 每批结束保存进度(断点)
            save_progress(checked_count, [v for v, _ in available_versions])

    except KeyboardInterrupt:
        print(f"\n\n⚠️ 用户中断!保存进度中...")

    # ============================================================
    # 输出结果
    # ============================================================
    elapsed = time.time() - start_time

    # 保存最终进度
    save_progress(checked_count, [v for v, _ in available_versions])

    # 写入汇总到文件
    with file_lock:
        with open(RESULT_FILE, "a", encoding="utf-8") as f:
            f.write("\n" + "=" * 50 + "\n")
            f.write(f"扫描结束时间: {time.strftime('%Y-%m-%d %H:%M:%S')}\n")
            f.write(f"共扫描 {checked_count}/{total} 个版本\n")
            f.write(f"共找到 {len(available_versions)} 个可用版本\n")
            f.write(f"耗时: {elapsed/60:.1f} 分钟\n")
            f.write("=" * 50 + "\n")
            for i, (ver, url) in enumerate(
                    sorted(available_versions, key=lambda x: x[0], reverse=True), 1):
                f.write(f"{i}. {ver}\n   {url}\n")

    print(f"\n\n{'='*60}")
    print(f"扫描结果:")
    print(f"  已扫描: {checked_count}/{total}")
    print(f"  找到: {len(available_versions)} 个可用版本")
    print(f"  耗时: {elapsed/60:.1f} 分钟")
    print(f"  进度已保存到: {PROGRESS_FILE}")
    print(f"  结果已保存到: {RESULT_FILE}")
    print(f"{'='*60}")

    if available_versions:
        available_versions.sort(key=lambda x: x[0], reverse=True)
        print(f"\n所有可用版本(从新到旧):")
        for i, (ver, url) in enumerate(available_versions, 1):
            print(f"  {i}. {ver}")
            print(f"     {url}")
    else:
        print("\n本次未找到新的可用版本")

    if checked_count < total:
        print(f"\n💡 下次运行将自动从第 {checked_count} 个继续扫描")


if __name__ == "__main__":
    main()

多余的版本记录保存到了gittee:

https://gitee.com/anyphasy/trae-history-builds

----------------------------------------分割线(下面是旧文章)---------------

https://lf-cdn.trae.com.cn/obj/trae-com-cn/pkg/app/releases/stable/{此处替换为版本号}/win32/Trae%20CN-Setup-x64.exeb

比如版本号为1.0.11939
那么链接为https://lf-cdn.trae.com.cn/obj/trae-com-cn/pkg/app/releases/stable/1.0.11939/win32/Trae%20CN-Setup-x64.exe

有关版本日期参考官网更新日志

TRAE IDE更新日志
更新日志 - 文档 - Trae CN

https://docs.trae.cn/ide_changelog

TRAEWork更新日志

https://docs.trae.cn/work_changelog

目前最新可下载版本号如下

1.0.12490 //最新截止4月29日
1.0.12470
1.0.12467
1.0.12457
1.0.12453
1.0.12385
1.0.12366
1.0.12354
1.0.12297
1.0.12284
1.0.12261
1.0.12236
1.0.12227
1.0.12118
1.0.12101
1.0.12006
1.0.11999  //对应4月22日版本
1.0.11959
1.0.11951
1.0.11939
1.0.11924
1.0.11911
1.0.11902
1.0.11896
1.0.11884
1.0.11873
1.0.11868
1.0.11849
1.0.11583  //对应4月16日版本

相关的ping代码

import requests
from urllib.parse import quote
import time

base_url = "https://lf-cdn.trae.com.cn/obj/trae-com-cn/pkg/app/releases/stable/{version}/win32/Trae%20CN-Setup-x64.exe"

def check_version(url):
    try:
        response = requests.head(url, timeout=5)
        return response.status_code == 200
    except Exception as e:
        print(f"请求失败: {str(e)}")
        return False

def main():
    # 从1.0.12384开始递减
    major, minor, patch = 1, 0, 12491 # 开始版本号
    available_versions = []
    
    while patch > 0:  # 设置最小版本号限制
        version = f"{major}.{minor}.{patch}"
        encoded_version = quote(version, safe='')
        url = base_url.format(version=encoded_version)
        
        print(f"正在检测版本: {version}", end='\r', flush=True)
        
        if check_version(url):
            print(f"\n发现可下载版本: {version}")
            print(f"下载地址: {url}")
            available_versions.append(url)
            
        patch -= 1
        if patch < 12480:  # 这里调节结束版本号,否则难以停止,得在任务管理器手动结束进程
            break
        time.sleep(0.5)  # 降低请求频率

    print("\n\n检测完成,以下是所有可下载版本:")
    for i, url in enumerate(available_versions, 1):
        print(f"{i}. {url}")

if __name__ == "__main__":
    print("开始检测可用版本...")
    main()

运行结果

Logo

AtomGit AI 社区提供模型库、数据集、Agent、Token等资源

更多推荐