Files
nezhacursor/test_compare_reset.py
2025-02-12 13:20:06 +08:00

295 lines
12 KiB
Python

import json
import logging
import os
import time
import subprocess
from pathlib import Path
from datetime import datetime
from account_switcher import AccountSwitcher
def get_full_machine_info():
"""获取更完整的机器码相关信息"""
info = {}
# 1. 获取 package.json 中的所有信息(检查两个可能的路径)
cursor_paths = [
Path(os.path.expanduser("~")) / "AppData" / "Local" / "Programs" / "Cursor",
Path(os.path.expanduser("~")) / "AppData" / "Local" / "cursor"
]
info["package_json"] = {}
for cursor_path in cursor_paths:
package_json = cursor_path / "resources" / "app" / "package.json"
if package_json.exists():
with open(package_json, "r", encoding="utf-8") as f:
info["package_json"][str(package_json)] = json.load(f)
# 2. 获取 storage.json 的内容
storage_path = Path(os.getenv('APPDATA')) / "Cursor" / "User" / "globalStorage" / "storage.json"
info["storage_json"] = None
if storage_path.exists():
try:
with open(storage_path, "r", encoding="utf-8") as f:
info["storage_json"] = json.load(f)
except:
pass
# 3. 检查注册表项和其值
import winreg
registry_paths = {
"cryptography": r"SOFTWARE\Microsoft\Cryptography", # 系统 MachineGuid
"cursor_shell": r"Software\Classes\Directory\Background\shell\Cursor",
"cursor_command": r"Software\Classes\Directory\Background\shell\Cursor\command",
"cursor_auth": r"Software\Cursor\Auth",
"cursor_updates": r"Software\Cursor\Updates",
"cursor_main": r"Software\Cursor"
}
info["registry"] = {}
# HKEY_LOCAL_MACHINE 项
try:
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, registry_paths["cryptography"], 0, winreg.KEY_READ | winreg.KEY_WOW64_64KEY)
info["registry"]["HKLM_MachineGuid"] = {
"exists": True,
"value": winreg.QueryValueEx(key, "MachineGuid")[0]
}
except WindowsError:
info["registry"]["HKLM_MachineGuid"] = {
"exists": False,
"value": None
}
# HKEY_CURRENT_USER 项
for name, path in registry_paths.items():
if name == "cryptography":
continue
try:
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, path, 0, winreg.KEY_READ)
info["registry"][f"HKCU_{name}"] = {"exists": True, "values": {}}
try:
i = 0
while True:
name, value, type = winreg.EnumValue(key, i)
info["registry"][f"HKCU_{name}"]["values"][name] = value
i += 1
except WindowsError:
pass
except WindowsError:
info["registry"][f"HKCU_{name}"] = {"exists": False, "values": {}}
# 4. 检查关键文件的存在状态
paths_to_check = {
"storage": storage_path,
"storage_backup": Path(os.getenv('APPDATA')) / "Cursor" / "User" / "globalStorage" / "backups",
"user_data": Path(os.getenv('LOCALAPPDATA')) / "Cursor" / "User",
"global_storage": Path(os.getenv('APPDATA')) / "Cursor" / "User" / "globalStorage",
"cache": Path(os.getenv('LOCALAPPDATA')) / "Cursor" / "Cache",
"updater": Path(os.getenv('LOCALAPPDATA')) / "cursor-updater"
}
info["files"] = {}
for name, path in paths_to_check.items():
if path.exists():
info["files"][name] = {
"exists": True,
"is_dir": path.is_dir(),
"size": os.path.getsize(path) if path.is_file() else None,
"modified_time": datetime.fromtimestamp(os.path.getmtime(path)).isoformat()
}
else:
info["files"][name] = {
"exists": False,
"is_dir": None,
"size": None,
"modified_time": None
}
# 5. 获取遥测相关的配置值
info["telemetry"] = {
"machineId": info["storage_json"].get("telemetry.machineId") if info["storage_json"] else None,
"macMachineId": info["storage_json"].get("telemetry.macMachineId") if info["storage_json"] else None,
"devDeviceId": info["storage_json"].get("telemetry.devDeviceId") if info["storage_json"] else None,
"sqmId": info["storage_json"].get("telemetry.sqmId") if info["storage_json"] else None
}
return info
def save_info(info, filename):
"""保存信息到文件"""
with open(filename, "w", encoding="utf-8") as f:
json.dump(info, f, indent=2, ensure_ascii=False)
def compare_info(before_file, after_file):
"""比较两个信息文件的差异"""
with open(before_file, "r", encoding="utf-8") as f:
before = json.load(f)
with open(after_file, "r", encoding="utf-8") as f:
after = json.load(f)
differences = {
"package_json_changes": {},
"registry_changes": {},
"file_changes": {}
}
# 比较 package.json 变化
if "package_json" in before and "package_json" in after:
for key in set(before["package_json"].keys()) | set(after["package_json"].keys()):
before_val = before["package_json"].get(key)
after_val = after["package_json"].get(key)
if before_val != after_val:
differences["package_json_changes"][key] = {
"before": before_val,
"after": after_val
}
# 比较注册表变化
for path in set(before["registry"].keys()) | set(after["registry"].keys()):
before_reg = before["registry"].get(path, {})
after_reg = after["registry"].get(path, {})
if before_reg != after_reg:
differences["registry_changes"][path] = {
"before": before_reg,
"after": after_reg
}
# 比较文件变化
for name in set(before["files"].keys()) | set(after["files"].keys()):
before_file = before["files"].get(name, {})
after_file = after["files"].get(name, {})
if before_file != after_file:
differences["file_changes"][name] = {
"before": before_file,
"after": after_file
}
return differences
def main():
"""主测试流程"""
# 设置日志
logging.basicConfig(level=logging.INFO)
print("选择操作:")
print("1. 记录当前状态(在运行 GitHub 脚本前执行)")
print("2. 记录重置后状态并对比(在运行 GitHub 脚本后执行)")
print("3. 运行我们的重置方法并记录对比")
choice = input("\n请选择操作 (1/2/3): ").strip()
if choice == "1":
# 记录初始状态
print("\n记录初始状态...")
initial_info = get_full_machine_info()
save_info(initial_info, "before_github_reset.json")
print("初始状态已保存到 before_github_reset.json")
elif choice == "2":
# 检查是否存在初始状态文件
if not os.path.exists("before_github_reset.json"):
print("错误:找不到初始状态文件 before_github_reset.json")
print("请先执行选项 1 记录初始状态")
return
# 记录 GitHub 脚本执行后的状态
print("\n记录 GitHub 脚本执行后的状态...")
after_info = get_full_machine_info()
save_info(after_info, "after_github_reset.json")
# 对比变化
print("\n=== GitHub 脚本执行前后的变化 ===")
differences = compare_info("before_github_reset.json", "after_github_reset.json")
# 显示 package.json 的变化
if differences["package_json_changes"]:
print("\npackage.json 变化:")
for key, change in differences["package_json_changes"].items():
print(f"- {key}:")
print(f" 之前: {change['before']}")
print(f" 之后: {change['after']}")
# 显示注册表的变化
if differences["registry_changes"]:
print("\n注册表变化:")
for path, change in differences["registry_changes"].items():
print(f"\n- {path}:")
print(f" 之前: {change['before']}")
print(f" 之后: {change['after']}")
# 显示文件的变化
if differences["file_changes"]:
print("\n文件变化:")
for name, change in differences["file_changes"].items():
print(f"\n- {name}:")
before_status = "存在" if change["before"].get("exists") else "不存在"
after_status = "存在" if change["after"].get("exists") else "不存在"
print(f" 状态: {before_status} -> {after_status}")
if change["before"].get("exists") and change["after"].get("exists"):
if change["before"].get("size") != change["after"].get("size"):
print(f" 大小: {change['before'].get('size')} -> {change['after'].get('size')}")
if change["before"].get("modified_time") != change["after"].get("modified_time"):
print(f" 修改时间: {change['before'].get('modified_time')} -> {change['after'].get('modified_time')}")
# 保存差异到文件
save_info(differences, "github_script_changes.json")
print("\n详细的变化信息已保存到 github_script_changes.json")
elif choice == "3":
if not os.path.exists("github_script_changes.json"):
print("错误:找不到 GitHub 脚本的变化记录文件 github_script_changes.json")
print("请先执行选项 1 和 2 来记录 GitHub 脚本的变化")
return
# 记录运行我们的重置方法前的状态
print("\n记录当前状态...")
before_our_reset = get_full_machine_info()
save_info(before_our_reset, "before_our_reset.json")
# 运行我们的重置方法
print("\n运行我们的重置方法...")
switcher = AccountSwitcher()
original_restart = switcher.restart_cursor
try:
switcher.restart_cursor = lambda: True
switcher.reset_machine_id()
finally:
switcher.restart_cursor = original_restart
# 记录重置后的状态
print("\n记录重置后的状态...")
after_our_reset = get_full_machine_info()
save_info(after_our_reset, "after_our_reset.json")
# 对比我们的方法与 GitHub 脚本的差异
print("\n=== 对比我们的重置方法与 GitHub 脚本的差异 ===")
with open("github_script_changes.json", "r", encoding="utf-8") as f:
github_changes = json.load(f)
our_changes = compare_info("before_our_reset.json", "after_our_reset.json")
# 分析差异
print("\n=== 差异分析 ===")
print("1. GitHub 脚本改变但我们没有改变的项:")
for category in ["package_json_changes", "registry_changes", "file_changes"]:
for key in github_changes[category]:
if key not in our_changes[category]:
print(f"- {category}: {key}")
print("\n2. 我们改变但 GitHub 脚本没有改变的项:")
for category in ["package_json_changes", "registry_changes", "file_changes"]:
for key in our_changes[category]:
if key not in github_changes[category]:
print(f"- {category}: {key}")
# 保存分析结果
save_info({
"github_changes": github_changes,
"our_changes": our_changes
}, "reset_methods_comparison.json")
print("\n详细的对比结果已保存到 reset_methods_comparison.json")
else:
print("无效的选择")
if __name__ == "__main__":
main()