如何无限免费白嫖Cursor,手把手教你一步破解!

Cursor这个工具使得不会开发的人也能做产品开发,对于会开发的人来说,更如神来之臂,好多繁锁的CRUD开发工作都可以扔给它做了

背景

最早接触Cursor是在11月份,当初只是打开试用了下,几分钟做了一个Chrome插件,感觉还行,但是不太相信能做复杂的开发,所以没上心。最近两周看了一些网用试用,感觉功能还是比较强,所以近两周认真试用了下Cursor,还真是让我信服,确实在某些方面可以减少开发的工作,比如,我使用它一晚上就开发一个技术性品(注意,不是业务产品), 感觉如果用好它,真的可以指数级提升开发工作了。具体可以见:《Cursor太牛逼了,2小时完成一个Web框架开发》。

Cursor好用是好用,但是有些限制,免费交互次数用完了就要收费,之前有提过大家的解答《Cursor能免费使用吗》,文中有提到一些方法,可以免费持续白嫖Cursor使用。

免费使用完了,客户端提示Too many free trials,无法继续使用

破解思路

其中方法就是删除账号,用原来的邮箱重新注册一个(如何操作看这里),然后就可以接着白嫖了。估计官方发现这个问题了,后面Cursor更新了策略,作了限制,本人经过实践经验检查,发现Cursor客户端是通过增加机器码来限制同一邮箱账号同一机器限制使用。

既然知道原因,那么破解就十分简单了,修改机器码不就完事了嘛。

实操破解

两种方式修改(建议直接看方法二),不过都需要两个前提:
  1. 删除原来的注册账号,重新注册(可以用原来的邮箱),不知道怎么操作的,具体看这里,重新注册后,登录网页账号可以看到又有250次免费慢调用。

  2. 关闭本地电脑里运行的Cursor软件

方法一:运行脚本

给你一段python脚本,保存为python文件,如cursor.py,拿到电脑上运行下就行了

当然,你得有python环境,对于python开发同学来说无所谓,以下是相关的代码:

import json
import os
import sys
import uuid
import random
import platform
from pathlib import Path
import tkinter as tk
from tkinter import ttk, messagebox
from tkinter.scrolledtext import ScrolledText

class CursorResetterGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("Cursor ID 重置工具")
        self.root.geometry("600x400")
        self.root.resizable(False, False)
        
        # 设置窗口图标(如果有的话)
        # self.root.iconbitmap('icon.ico')
        
        self.setup_ui()
        self.resetter = CursorResetter(self.log)
        
    def setup_ui(self):
        """设置UI界面"""
        # 主框架
        main_frame = ttk.Frame(self.root, padding="10")
        main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
        
        # 标题
        title_label = ttk.Label(
            main_frame, 
            text="Cursor ID 重置工具", 
            font=('Arial', 16, 'bold')
        )
        title_label.grid(row=0, column=0, pady=10)
        
        # 说明文本
        desc_text = """此工具用于重置 Cursor 编辑器的设备识别码。
使用前请确保:
1. Cursor 已完全关闭
2. 已备份重要数据
3. 具有足够的文件访问权限"""
        
        desc_label = ttk.Label(
            main_frame, 
            text=desc_text,
            wraplength=550,
            justify=tk.LEFT
        )
        desc_label.grid(row=1, column=0, pady=10)
        
        # 重置按钮
        self.reset_button = ttk.Button(
            main_frame,
            text="开始重置",
            command=self.reset_ids
        )
        self.reset_button.grid(row=2, column=0, pady=10)
        
        # 日志区域
        log_frame = ttk.LabelFrame(main_frame, text="操作日志", padding="5")
        log_frame.grid(row=3, column=0, sticky=(tk.W, tk.E, tk.N, tk.S), pady=10)
        
        self.log_text = ScrolledText(
            log_frame,
            width=60,
            height=10,
            wrap=tk.WORD
        )
        self.log_text.pack(expand=True, fill=tk.BOTH)
        
        # 状态栏
        self.status_var = tk.StringVar(value="就绪")
        status_bar = ttk.Label(
            main_frame,
            textvariable=self.status_var,
            relief=tk.SUNKEN
        )
        status_bar.grid(row=4, column=0, sticky=(tk.W, tk.E), pady=5)

    def log(self, message):
        """添加日志信息"""
        self.log_text.insert(tk.END, message + "\n")
        self.log_text.see(tk.END)
        self.root.update()

    def reset_ids(self):
        """重置ID的操作"""
        self.reset_button.state(['disabled'])
        self.status_var.set("正在重置...")
        self.log("开始重置过程...")
        
        try:
            if self.resetter.update_config():
                messagebox.showinfo("成功", "重置完成!请重启 Cursor 以使更改生效。")
                self.status_var.set("重置完成")
            else:
                messagebox.showerror("错误", "重置过程中发生错误,请查看日志。")
                self.status_var.set("重置失败")
        except Exception as e:
            messagebox.showerror("错误", f"发生异常:{str(e)}")
            self.status_var.set("发生错误")
        finally:
            self.reset_button.state(['!disabled'])

class CursorResetter:
    def __init__(self, log_func):
        self.log_func = log_func
        self.config_path = self.get_config_path()
    
    def get_config_path(self):
        """获取配置文件路径"""
        system = platform.system().lower()
        
        if system == "windows":
            base_path = os.getenv("APPDATA")
            return Path(base_path) / "Cursor" / "User" / "globalStorage" / "storage.json"
        
        elif system == "darwin":  # macOS
            return Path.home() / "Library" / "Application Support" / "Cursor" / "User" / "globalStorage" / "storage.json"
        
        elif system == "linux":
            return Path.home() / ".config" / "Cursor" / "User" / "globalStorage" / "storage.json"
        
        else:
            raise OSError(f"不支持的操作系统: {system}")

    def generate_hex_id(self, length=64):
        """生成指定长度的十六进制ID"""
        return ''.join(random.choices('0123456789abcdef', k=length))

    def generate_uuid(self):
        """生成UUID格式的ID"""
        return str(uuid.uuid4())

    def make_writable(self, path):
        """设置文件为可写"""
        try:
            os.chmod(path, 0o666)
            self.log_func("已设置文件为可写")
            return True
        except Exception as e:
            self.log_func(f"设置文件权限失败: {e}")
            return False

    def make_readonly(self, path):
        """设置文件为只读"""
        try:
            os.chmod(path, 0o444)
            self.log_func("已设置文件为只读")
            return True
        except Exception as e:
            self.log_func(f"设置文件只读失败: {e}")
            return False

    def update_config(self):
        """更新配置文件"""
        try:
            self.log_func(f"配置文件路径: {self.config_path}")
            
            if not self.config_path.exists():
                self.log_func("配置文件不存在!")
                return False

            if not self.make_writable(self.config_path):
                return False

            with open(self.config_path, 'r', encoding='utf-8') as f:
                config = json.load(f)
                self.log_func("已读取现有配置")

            new_mac_id = self.generate_hex_id()
            new_machine_id = self.generate_hex_id()
            new_device_id = self.generate_uuid()

            config.update({
                "telemetry.macMachineId": new_mac_id,
                "telemetry.machineId": new_machine_id,
                "telemetry.devDeviceId": new_device_id
            })

            self.log_func(f"新的 macMachineId: {new_mac_id}")
            self.log_func(f"新的 machineId: {new_machine_id}")
            self.log_func(f"新的 devDeviceId: {new_device_id}")

            with open(self.config_path, 'w', encoding='utf-8') as f:
                json.dump(config, f, indent=4)
                self.log_func("已写入新配置")

            if not self.make_readonly(self.config_path):
                return False

            self.log_func("配置更新完成")
            return True

        except Exception as e:
            self.log_func(f"更新配置时出错: {e}")
            return False

def main():
    root = tk.Tk()
    app = CursorResetterGUI(root)
    root.mainloop()

if __name__ == "__main__":
    main()

方法二:直接人工修改机器码

直接修改Cursor对应配置文件storage.json里面的机器码配置值,修改其中任意字符

其实,看了第一个方法里的代码,就知道这段脚本是干什么的,单纯就是修改了下一个cursor配置文件里面配置项值,具体代码不分析了,直接告诉你人工怎么操作吧

找到这个配置项文件,看代码是在位置:

C:\Users\{你电脑的用户名}\AppData\Roaming\Cursor\User\globalStorage\storage.json

只要把“你电脑用户名”这修改下,就是这个路径了,大多数用户安装电脑都是用Administrator作为用户名,其他的视实际情况。

以上是windows文件位置,mac和linux位置分对应以下位置:

MacOS系统位置:用户主目录/Library/Application Support/Cursor/User/globalStorage/storage.json

Linux系统位置:用户主目录/.config/Cursor/User/globalStorage/storage.json

然后找到对应的这三项配置项修改它的值:

    "telemetry.macMachineId": "b977ee117563f712e5e9159d0c6f2b52d5d7ecc120bc773bca430ca78230f107",
    "telemetry.machineId": "ca5d3148023f91f19d8264f845734f178c5da30ba73d06510ab92e91d9d06b57",
    "telemetry.devDeviceId": "99e1e955-cea9-4ae1-9b5c-256aaea0e830",

cursor破解,配置文件修改点

修改方式很简单,就是修改这么长字符里面任意一个字符(任意数字、小写a~z字符),注意字符长度不要变化就可以了。

修改完保存文件关闭,然后就可以继续enjoy你的Cursor吧。

后文

此文提供方法目前亲自测试有效,如果失效了,我也会及时更新

免费白嫖对技术氛围影响不太好,毕竟人家花了成本做出这么好用的产品,有条件的还是建议付费使用吧,咱现在是工资都发不上了,只能先考虑吃饭问题。

虽然这是小白的破解方法,咱白嫖也就算了,但是还有网友更恶心,拿它这简单方法来变相收钱,希望广大网友尽量不要花费这冤枉钱,比如下面这种行为,鄙视之:

License:  CC BY 4.0

©2024 我的AI之道. Some rights reserved.

    备案号: 浙ICP备06043869号-8