2 Commits

Author SHA1 Message Date
煎饼果子卷鲨鱼辣椒 83de7388a8 ``` 1 month ago
煎饼果子卷鲨鱼辣椒 91a72f9216 fix(cursor): 优化 ID 替换逻辑与 ESM 兼容性支持 1 month ago
  1. 35
      scripts/run/cursor_linux_id_modifier.sh
  2. 59
      scripts/run/cursor_mac_id_modifier.sh
  3. 90
      scripts/run/cursor_win_id_modifier.ps1

35
scripts/run/cursor_linux_id_modifier.sh

@ -826,37 +826,54 @@ EOF
local replaced=false
# ========== 方法A: someValue占位符替换(稳定锚点) ==========
# 重要说明:
# 当前 Cursor 的 main.js 中占位符通常是以字符串字面量形式出现,例如:
# this.machineId="someValue.machineId"
# 如果直接把 someValue.machineId 替换成 "\"<真实值>\"",会形成 ""<真实值>"" 导致 JS 语法错误。
# 因此这里优先替换完整的字符串字面量(包含外层引号),再兜底替换不带引号的占位符。
if grep -q 'someValue\.machineId' "$file"; then
sed -i "s/\"someValue\.machineId\"/\"${machine_id}\"/g" "$file"
sed -i "s/'someValue\.machineId'/\"${machine_id}\"/g" "$file"
sed -i "s/someValue\.machineId/\"${machine_id}\"/g" "$file"
log_info " ✓ [方案A] 替换 someValue.machineId"
replaced=true
fi
if grep -q 'someValue\.macMachineId' "$file"; then
sed -i "s/\"someValue\.macMachineId\"/\"${mac_machine_id}\"/g" "$file"
sed -i "s/'someValue\.macMachineId'/\"${mac_machine_id}\"/g" "$file"
sed -i "s/someValue\.macMachineId/\"${mac_machine_id}\"/g" "$file"
log_info " ✓ [方案A] 替换 someValue.macMachineId"
replaced=true
fi
if grep -q 'someValue\.devDeviceId' "$file"; then
sed -i "s/\"someValue\.devDeviceId\"/\"${device_id}\"/g" "$file"
sed -i "s/'someValue\.devDeviceId'/\"${device_id}\"/g" "$file"
sed -i "s/someValue\.devDeviceId/\"${device_id}\"/g" "$file"
log_info " ✓ [方案A] 替换 someValue.devDeviceId"
replaced=true
fi
if grep -q 'someValue\.sqmId' "$file"; then
sed -i "s/\"someValue\.sqmId\"/\"${sqm_id}\"/g" "$file"
sed -i "s/'someValue\.sqmId'/\"${sqm_id}\"/g" "$file"
sed -i "s/someValue\.sqmId/\"${sqm_id}\"/g" "$file"
log_info " ✓ [方案A] 替换 someValue.sqmId"
replaced=true
fi
if grep -q 'someValue\.sessionId' "$file"; then
sed -i "s/\"someValue\.sessionId\"/\"${session_id}\"/g" "$file"
sed -i "s/'someValue\.sessionId'/\"${session_id}\"/g" "$file"
sed -i "s/someValue\.sessionId/\"${session_id}\"/g" "$file"
log_info " ✓ [方案A] 替换 someValue.sessionId"
replaced=true
fi
if grep -q 'someValue\.firstSessionDate' "$file"; then
sed -i "s/\"someValue\.firstSessionDate\"/\"${first_session_date}\"/g" "$file"
sed -i "s/'someValue\.firstSessionDate'/\"${first_session_date}\"/g" "$file"
sed -i "s/someValue\.firstSessionDate/\"${first_session_date}\"/g" "$file"
log_info " ✓ [方案A] 替换 someValue.firstSessionDate"
replaced=true
@ -864,9 +881,22 @@ EOF
# ========== 方法B: 增强版深度 Hook 注入 ==========
local inject_code='// ========== Cursor Hook 注入开始 ==========
;(function(){/*__cursor_patched__*/
;(async function(){/*__cursor_patched__*/
"use strict";
if(globalThis.__cursor_patched__)return;
// 兼容 ESM:确保可用的 require(部分版本 main.js 可能是纯 ESM,不保证存在 require)
var __require__=typeof require==="function"?require:null;
if(!__require__){
try{
var __m__=await import("module");
__require__=__m__.createRequire(import.meta.url);
}catch(e){
// 无法获得 require 时直接退出,避免影响主进程启动
return;
}
}
globalThis.__cursor_patched__=true;
var __ids__={
@ -879,7 +909,7 @@ var __ids__={
globalThis.__cursor_ids__=__ids__;
var Module=require("module");
var Module=__require__("module");
var _origReq=Module.prototype.require;
var _hooked=new Map();
@ -1395,6 +1425,7 @@ main() {
echo
echo -e "${GREEN}=====================================================${NC}"
echo -e "${YELLOW} 请关注公众号【煎饼果子卷AI】获取更多技巧和交流 ${NC}"
echo -e "${YELLOW}⚡ [小小广告] Cursor官网正规成品号:Pro¥65 | Pro+¥265 | Ultra¥888 独享账号/7天质保,WeChat:JavaRookie666 ${NC}"
echo -e "${GREEN}=====================================================${NC}"
echo

59
scripts/run/cursor_mac_id_modifier.sh

@ -1623,40 +1623,69 @@ EOF
log_info "📝 [处理] 正在处理: ${file/$CURSOR_APP_PATH\//}"
# ========== 方法A: someValue占位符替换(稳定锚点) ==========
# 重要说明:
# 当前 Cursor 的 main.js 中占位符通常是以字符串字面量形式出现,例如:
# this.machineId="someValue.machineId"
# 如果直接把 someValue.machineId 替换成 "\"<真实值>\"",会形成 ""<真实值>"" 导致 JS 语法错误。
# 因此这里优先替换完整的字符串字面量(包含外层引号),再兜底替换不带引号的占位符。
local replaced=false
if grep -q 'someValue\.machineId' "$file"; then
sed -i.tmp "s/someValue\.machineId/\"${machine_id}\"/g" "$file"
sed -i.tmp \
-e "s/\"someValue\.machineId\"/\"${machine_id}\"/g" \
-e "s/'someValue\.machineId'/\"${machine_id}\"/g" \
-e "s/someValue\.machineId/\"${machine_id}\"/g" \
"$file"
log_info " ✓ [方案A] 替换 someValue.machineId"
replaced=true
fi
if grep -q 'someValue\.macMachineId' "$file"; then
sed -i.tmp "s/someValue\.macMachineId/\"${mac_machine_id}\"/g" "$file"
sed -i.tmp \
-e "s/\"someValue\.macMachineId\"/\"${mac_machine_id}\"/g" \
-e "s/'someValue\.macMachineId'/\"${mac_machine_id}\"/g" \
-e "s/someValue\.macMachineId/\"${mac_machine_id}\"/g" \
"$file"
log_info " ✓ [方案A] 替换 someValue.macMachineId"
replaced=true
fi
if grep -q 'someValue\.devDeviceId' "$file"; then
sed -i.tmp "s/someValue\.devDeviceId/\"${device_id}\"/g" "$file"
sed -i.tmp \
-e "s/\"someValue\.devDeviceId\"/\"${device_id}\"/g" \
-e "s/'someValue\.devDeviceId'/\"${device_id}\"/g" \
-e "s/someValue\.devDeviceId/\"${device_id}\"/g" \
"$file"
log_info " ✓ [方案A] 替换 someValue.devDeviceId"
replaced=true
fi
if grep -q 'someValue\.sqmId' "$file"; then
sed -i.tmp "s/someValue\.sqmId/\"${sqm_id}\"/g" "$file"
sed -i.tmp \
-e "s/\"someValue\.sqmId\"/\"${sqm_id}\"/g" \
-e "s/'someValue\.sqmId'/\"${sqm_id}\"/g" \
-e "s/someValue\.sqmId/\"${sqm_id}\"/g" \
"$file"
log_info " ✓ [方案A] 替换 someValue.sqmId"
replaced=true
fi
if grep -q 'someValue\.sessionId' "$file"; then
sed -i.tmp "s/someValue\.sessionId/\"${session_id}\"/g" "$file"
sed -i.tmp \
-e "s/\"someValue\.sessionId\"/\"${session_id}\"/g" \
-e "s/'someValue\.sessionId'/\"${session_id}\"/g" \
-e "s/someValue\.sessionId/\"${session_id}\"/g" \
"$file"
log_info " ✓ [方案A] 替换 someValue.sessionId"
replaced=true
fi
if grep -q 'someValue\.firstSessionDate' "$file"; then
sed -i.tmp "s/someValue\.firstSessionDate/\"${first_session_date}\"/g" "$file"
sed -i.tmp \
-e "s/\"someValue\.firstSessionDate\"/\"${first_session_date}\"/g" \
-e "s/'someValue\.firstSessionDate'/\"${first_session_date}\"/g" \
-e "s/someValue\.firstSessionDate/\"${first_session_date}\"/g" \
"$file"
log_info " ✓ [方案A] 替换 someValue.firstSessionDate"
replaced=true
fi
@ -1664,9 +1693,22 @@ EOF
# ========== 方法B: 增强版深度 Hook 注入 ==========
# 创建注入代码
local inject_code='// ========== Cursor Hook 注入开始 ==========
;(function(){/*__cursor_patched__*/
;(async function(){/*__cursor_patched__*/
"use strict";
if(globalThis.__cursor_patched__)return;
// 兼容 ESM:确保可用的 require(部分版本 main.js 可能是纯 ESM,不保证存在 require)
var __require__=typeof require==="function"?require:null;
if(!__require__){
try{
var __m__=await import("module");
__require__=__m__.createRequire(import.meta.url);
}catch(e){
// 无法获得 require 时直接退出,避免影响主进程启动
return;
}
}
globalThis.__cursor_patched__=true;
var __ids__={
@ -1679,7 +1721,7 @@ var __ids__={
globalThis.__cursor_ids__=__ids__;
var Module=require("module");
var Module=__require__("module");
var _origReq=Module.prototype.require;
var _hooked=new Map();
@ -2847,6 +2889,7 @@ main() {
# 📱 显示公众号信息
echo -e "${GREEN}================================${NC}"
echo -e "${YELLOW}📱 关注公众号【煎饼果子卷AI】一起交流更多Cursor技巧和AI知识(脚本免费、关注公众号加群有更多技巧和大佬) ${NC}"
echo -e "${YELLOW}⚡ [小小广告] Cursor官网正规成品号:Pro¥65 | Pro+¥265 | Ultra¥888 独享账号/7天质保,WeChat:JavaRookie666 ${NC}"
echo -e "${GREEN}================================${NC}"
echo
log_info "🚀 [提示] 现在可以重新启动 Cursor 尝试使用了!"

90
scripts/run/cursor_win_id_modifier.ps1

@ -1,4 +1,4 @@
# 设置输出编码为 UTF-8
# 设置输出编码为 UTF-8
$OutputEncoding = [System.Text.Encoding]::UTF8
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
@ -178,49 +178,53 @@ function Modify-CursorJSFiles {
# ========== 方法A: someValue占位符替换(稳定锚点) ==========
# 这些字符串是固定的占位符,不会被混淆器修改,跨版本稳定
# 重要说明:
# 当前 Cursor 的 main.js 中占位符通常是以字符串字面量形式出现,例如:
# this.machineId="someValue.machineId"
# 如果直接把 someValue.machineId 替换成 "\"<真实值>\"",会形成 ""<真实值>"" 导致 JS 语法错误(Invalid token)。
# 因此这里优先替换完整的字符串字面量(包含外层引号),并使用 JSON 字符串字面量确保转义安全。
# 替换 someValue.machineId
if ($content -match 'someValue\.machineId') {
$content = $content -replace 'someValue\.machineId', "`"$machineId`""
Write-Host " $GREEN✓$NC [方案A] 替换 someValue.machineId"
$replaced = $true
}
# 🔧 新增: firstSessionDate(重置首次会话日期)
$firstSessionDateValue = (Get-Date).ToString("yyyy-MM-ddTHH:mm:ss.fffZ")
# 替换 someValue.macMachineId
if ($content -match 'someValue\.macMachineId') {
$content = $content -replace 'someValue\.macMachineId', "`"$macMachineId`""
Write-Host " $GREEN✓$NC [方案A] 替换 someValue.macMachineId"
$replaced = $true
}
$placeholders = @(
@{ Name = 'someValue.machineId'; Value = [string]$machineId },
@{ Name = 'someValue.macMachineId'; Value = [string]$macMachineId },
@{ Name = 'someValue.devDeviceId'; Value = [string]$deviceId },
@{ Name = 'someValue.sqmId'; Value = [string]$sqmId },
@{ Name = 'someValue.sessionId'; Value = [string]$sessionId },
@{ Name = 'someValue.firstSessionDate'; Value = [string]$firstSessionDateValue }
)
# 替换 someValue.devDeviceId
if ($content -match 'someValue\.devDeviceId') {
$content = $content -replace 'someValue\.devDeviceId', "`"$deviceId`""
Write-Host " $GREEN✓$NC [方案A] 替换 someValue.devDeviceId"
$replaced = $true
}
foreach ($ph in $placeholders) {
$name = $ph.Name
$jsonValue = ($ph.Value | ConvertTo-Json -Compress) # 生成带双引号的 JSON 字符串字面量
# 替换 someValue.sqmId
if ($content -match 'someValue\.sqmId') {
$content = $content -replace 'someValue\.sqmId', "`"$sqmId`""
Write-Host " $GREEN✓$NC [方案A] 替换 someValue.sqmId"
$replaced = $true
$changed = $false
# 优先替换带引号的占位符字面量,避免出现 ""abc"" 破坏语法
$doubleLiteral = '"' + $name + '"'
if ($content.Contains($doubleLiteral)) {
$content = $content.Replace($doubleLiteral, $jsonValue)
$changed = $true
}
$singleLiteral = "'" + $name + "'"
if ($content.Contains($singleLiteral)) {
$content = $content.Replace($singleLiteral, $jsonValue)
$changed = $true
}
# 替换 someValue.sessionId(新增锚点)
if ($content -match 'someValue\.sessionId') {
$content = $content -replace 'someValue\.sessionId', "`"$sessionId`""
Write-Host " $GREEN✓$NC [方案A] 替换 someValue.sessionId"
$replaced = $true
# 兜底:如果占位符以非字符串字面量形式出现,则替换为 JSON 字符串字面量(自带引号)
if (-not $changed -and $content.Contains($name)) {
$content = $content.Replace($name, $jsonValue)
$changed = $true
}
# 🔧 新增: 替换 someValue.firstSessionDate
$firstSessionDateValue = (Get-Date).ToString("yyyy-MM-ddTHH:mm:ss.fffZ")
if ($content -match 'someValue\.firstSessionDate') {
$content = $content -replace 'someValue\.firstSessionDate', $firstSessionDateValue
Write-Host " $GREEN✓$NC [方案A] 替换 someValue.firstSessionDate"
if ($changed) {
Write-Host " $GREEN✓$NC [方案A] 替换 $name"
$replaced = $true
}
}
# ========== 方法B: 增强版深度 Hook 注入 ==========
# 从底层拦截所有设备标识符的生成:
@ -234,9 +238,22 @@ function Modify-CursorJSFiles {
$injectCode = @"
// ========== Cursor Hook 注入开始 ==========
;(function(){/*__cursor_patched__*/
;(async function(){/*__cursor_patched__*/
'use strict';
if(globalThis.__cursor_patched__)return;
// 兼容 ESM确保可用的 require部分版本 main.js 可能是纯 ESM不保证存在 require
var __require__=typeof require==='function'?require:null;
if(!__require__){
try{
var __m__=await import('module');
__require__=__m__.createRequire(import.meta.url);
}catch(e){
// 无法获得 require 时直接退出避免影响主进程启动
return;
}
}
globalThis.__cursor_patched__=true;
// 固定的设备标识符
@ -252,7 +269,7 @@ var __ids__={
globalThis.__cursor_ids__=__ids__;
// Hook Module.prototype.require
var Module=require('module');
var Module=__require__('module');
var _origReq=Module.prototype.require;
var _hooked=new Map();
@ -1868,6 +1885,7 @@ if ($executeMode -eq "MODIFY_ONLY") {
Write-Host ""
Write-Host "$GREEN================================$NC"
Write-Host "$YELLOW📱 关注公众号【煎饼果子卷AI】一起交流更多Cursor技巧和AI知识(脚本免费、关注公众号加群有更多技巧和大佬) $NC"
Write-Host "$YELLOW⚡ [小小广告] Cursor官网正规成品号:Pro¥65 | Pro+¥265 | Ultra¥888 独享账号/7天质保,WeChat:JavaRookie666 $NC"
Write-Host "$GREEN================================$NC"
Write-Host ""

Loading…
Cancel
Save