commit 56775e85f383a412c65d34e30287446b71f998f3 Author: 李志强 <357099073@qq.com> Date: Tue Apr 14 09:47:00 2026 +0800 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..83dbe80 --- /dev/null +++ b/.htaccess @@ -0,0 +1,5 @@ +RewriteEngine On + +# 讓 /api/getcard 直接對應到 api/getcard.php(避免漏寫 .php) +RewriteRule ^api/getcard/?$ api/getcard.php [L] + diff --git a/.user.ini b/.user.ini new file mode 100644 index 0000000..3d58219 --- /dev/null +++ b/.user.ini @@ -0,0 +1 @@ +open_basedir=/www/wwwroot/sendcard.yunzer.cn/:/tmp/ \ No newline at end of file diff --git a/404.html b/404.html new file mode 100644 index 0000000..6f17eaf --- /dev/null +++ b/404.html @@ -0,0 +1,7 @@ + +404 Not Found + +

404 Not Found

+
nginx
+ + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..9f13370 --- /dev/null +++ b/README.md @@ -0,0 +1,154 @@ + + +# sendcard PHP 后端 + +提供一个接口用来向外部服务拉取 `token`,并把外部回传的 `data` 备档写入 SQLite 数据库。 + +## 前置要求 + +- PHP 8.x(已使用 `declare(strict_types=1)`) +- `curl` 扩展 +- `PDO_SQLITE` 扩展 +- SQLite 写入权限(默认写入到 `./data/sendcard.sqlite`) +- 如果你用 Apache:需要启用 `.htaccess`(本项目已添加重写规则) + +## 接口说明 + +### 1) 获取 token + +`GET /api/getcard?type=xianyu` + +请求参数: + +- `type`:必须等于 `xianyu`,否则会报错不执行外部请求 + +**说明(避免和轮询脚本混淆):** + +- **不需要**配置 `poll_cron_key`,也**不需要**在 URL 里传 `device_code` / `device_code_md5`。浏览器只访问带 `type=xianyu` 的地址即可。 +- `device_code`、`device_code_md5`、`external_base_url`(例如 `82.157.20.83:9091/.../getCredentials?...`)都在服务端 **`config.php`** 里,由 **`getcard.php` 在服务器上** 用 cURL 去调外部接口;调用方看不到也不会传这些参数。此处对应 **机器 A**(即时 Web 请求)。 +- 定时脚本 **`getcard_poll.php`** 仍调同一 `external_base_url`,但使用 **`config['poll']` 里机器 B** 的 `device_code` / `device_code_md5`,与机器 A 分离,便于在上游对 **单设备或请求频次** 有限制时分流(轮询与即时各走一套设备参数)。 + +成功响应(HTTP 200,**响应体为纯文本**,即 token 字符串本身,不是 JSON 包一层): + +```text +<外部返回的 data.token,例如 JWT 整段> +``` + +错误响应: + +- 未带 `type=xianyu`: + +```json +{"error":"Invalid request parameter","need_type":"xianyu"} +``` + +- 外部接口返回异常/缺少数据: + +```json +{"error":"External response missing data"} +``` + +## SQLite 备档 + +每次成功调用并拿到外部 `data` 后,会把外部返回的字段逐列拆开写入一行记录(并额外保存 `raw_json`)。 + +- 数据库文件:`./data/sendcard.sqlite` +- 表名:`cursor_login_backups` + +表字段包含(部分): + +- `external_msg`, `external_code` +- `token`, `email`, `deviceCode`, `activationCode`, `status`, `createTime` 等 +- `raw_json`:保存外部完整 JSON(可用于排查) + +## 配置文件 + +`config.php` 里可配置: + +- `external_base_url`:`getcard` 与 `getcard_poll` **共用**的外部 `getCredentials` 基础地址 +- `device_code`、`device_code_md5`:**机器 A**,仅 **`getcard.php`** 使用 +- `poll.device_code`、`poll.device_code_md5`:**机器 B**,仅 **`getcard_poll.php`** 使用(与 A 不同,用于上游限流/限设备时分流) +- `sqlite_path`:SQLite 路径 + +## 部署路由(Apache / Nginx) + +本项目包含 `.htaccess`(仅对 Apache 生效),用于把 `/api/getcard` 重写到 `api/getcard.php`。 + +如果你部署在宝塔(通常是 Nginx),建议直接访问: + +`/api/getcard.php?type=xianyu` + +这样不依赖重写;如果你确实想保留 `/api/getcard` 形式,把你宝塔里“重写/伪静态”的设置截图或说明一下,我再给你对应的 Nginx 规则。 + +## 接口说明 + +本仓库里的 config.php 只负责把现成的字符串传给外部接口,没有生成逻辑;下面按你这条 device_code 的常见写法说明各段含义。 + +device_code 的三段(用 - 拼起来) +示例: + +BFEBFBFF000A06A4 - 5210N57MP0004BXP00R2 - c84b8af03a6c40e888f72576a5f34a1f + +段 典型来源(Windows 上常见叫法) +第 1 段 BFEBFBFF000A06A4 +CPU ProcessorId(wmic cpu get ProcessorId / WMI Win32_Processor.ProcessorId)。BFEBFBFF 是 Intel 上很常见的 CPUID 特征前缀,后面一般是 family/model/stepping 等拼成的十六进制,不是传统意义上的“CPU 出厂序列号”,但常被叫作 CPU 标识/CPU ID。 +第 2 段 5210N57MP0004BXP00R2 +多为 主板序列号(Win32_BaseBoard.SerialNumber)或 BIOS/机器厂商序列 一类 OEM 串号;也可能是别的固定硬件标识,取决于采集工具具体取哪一项。 +第 3 段 c84b8af…(32 位十六进制) +很像 去掉连字符的 UUID(128 bit)。常见对应是 Windows 机器 GUID(注册表 HKLM\SOFTWARE\Microsoft\Cryptography\MachineGuid 去掉 -),也可能是程序自己生成的 GUID,要看上游工具怎么定义。 +所以你记的「CPU 序列 + 别的」大致对应:CPU ProcessorId + 主板/机器类序列号 + 机器 UUID(或同类唯一 ID),中间用 - 连成一条 device_code。 + +device_code_md5 +从形态看是 32 位小写十六进制,符合 MD5 的常见输出。 +在本项目里没有对 device_code 做校验或计算;我用 PHP 对整条 device_code 做 md5(),结果不等于你配置里的 bc5613415689b537679ba22c2feae68c。 +因此它可能是:对别的规范化字符串(大小写、是否含 -、段顺序等)做的 MD5,或 带盐/由别的客户端算法 生成,需要以提供 device_code 的那套工具/文档为准。 +若你需要和上游完全一致,建议对照当时生成 device_code 的程序或接口文档;若你手头有那套工具的源码或说明,发一段我可以帮你对齐 device_code_md5 的精确算法。 + + + +## 定时轮询 getcard_poll.php + +与 **`getcard.php` 调同一套外部接口、同一种返回数据**;差别在于:**`getcard` 是即时(Web)**,**`getcard_poll` 约每 5 分钟(计划任务 + 脚本内随机间隔)**。因上游常对 **单设备或请求频次** 有限制,**即时走机器 A**(顶层 `device_code` / `device_code_md5`),**轮询走机器 B**(`config['poll']` 内同名键,值与 A 不同)。 + +- **`getcard.php`**:带 `type=xianyu`,**不要 `poll_cron_key`**,用机器 A 调外部并写 SQLite、回 token。 +- **`getcard_poll.php`**:命令行跑定时 **不要 `key`**;仅当用 HTTP 触发该脚本时配置 **`poll_cron_key`** 与 `?key=`(见下文方式二)。用机器 B 调外部,并写 **txt 日志**(与 getcard 的 SQLite 备档可并存)。 + +已在项目里提供 `api/getcard_poll.php`:宝塔 **计划任务每分钟** 执行一次;脚本内未到点会 `Skip`;到点后按 **约 5 分钟 ±3 分钟、不少于 4 分钟** 再请求外部,结果追加到 `data/getcard_poll_log.txt`。**请务必将 `poll` 里机器 B 的 `device_code` / `device_code_md5` 填全**,否则轮询脚本会因配置校验失败退出。 + +### 宝塔里怎么设「定时」(二选一) + +**方式一:Shell 里直接跑 PHP(不经过 Web)** + +1. 打开 **计划任务** → **Shell 脚本**(或同类「执行脚本」)。 +2. 执行周期选 **每 1 分钟**(要足够密;未到点脚本会 `Skip` 退出,不会打外部接口)。 +3. 脚本内容把路径换成你站点实际路径,例如: + +```bash +/usr/bin/php /www/wwwroot/你的域名/sendcard.yunzer.cn/api/getcard_poll.php >>/www/wwwroot/你的域名/sendcard.yunzer.cn/data/getcard_poll_cron.log 2>&1 +``` + +- 若不确定 PHP 路径:宝塔 **软件商店** → 已安装的 **PHP** → **设置** → **命令行版本**,常见为 `/www/server/php/82/bin/php`(版本号按你的来)。 + +**方式二:调你自己站点上的 URL(走 HTTP,等价于「调接口」)** + +可以,不必在 Shell 里写 `php` 路径。先在 `config.php` 里配置 **`poll_cron_key`**(一长串随机密钥,勿泄露),则允许通过 Web 访问: + +`https://你的域名/api/getcard_poll.php?key=你配置的密钥` + +然后任选其一: + +- 宝塔计划任务选 **访问 URL**(若有),每分钟访问上述地址;或 +- Shell 计划任务里每分钟执行:`curl -fsS 'https://你的域名/api/getcard_poll.php?key=你的密钥' >>/path/to/curl.log 2>&1` + +**注意:** `key` 会出现在 **Web 服务器访问日志** 里,且可能被中间代理记录;更稳妥仍是 **方式一 CLI**。若用 Nginx 且未配置重写,请用带 `.php` 的路径:`/api/getcard_poll.php?key=...`。 + +### 写入的文件 + +- `data/getcard_poll_state.json`:下次允许执行的时间(含文件锁,避免并发重复跑) +- `data/getcard_poll_log.txt`:每次拉取的一行日志(时间 + HTTP 状态 + 整段 JSON;失败则写 `ERROR ...`) + +### 间隔规则(脚本内已实现) + +- 本次执行后,下次间隔秒数:`max(240, 300 + random_int(-180, 180))`,即 **4~8 分钟** 之间随机。 + +若你希望轮询成功时也像 `getcard.php` 一样写入 SQLite,可以再说一下,我可以把那段插入逻辑复用到 `getcard_poll.php` 里。 \ No newline at end of file diff --git a/api/getcard.php b/api/getcard.php new file mode 100644 index 0000000..e2b633f --- /dev/null +++ b/api/getcard.php @@ -0,0 +1,132 @@ + 'Method Not Allowed'], JSON_UNESCAPED_UNICODE); + exit; +} + +// 只有在携带 type=xianyu 参数时才允许返回 +$reqType = $_GET['type'] ?? null; +if ($reqType !== 'xianyu') { + http_response_code(400); + echo json_encode(['error' => 'Invalid request parameter', 'need_type' => 'xianyu'], JSON_UNESCAPED_UNICODE); + exit; +} + +require_once __DIR__ . '/../lib/db.php'; +require_once __DIR__ . '/../lib/external.php'; + +$cfg = require __DIR__ . '/../config.php'; + +$externalBase = $cfg['external_base_url'] ?? ''; +$deviceCode = $cfg['device_code'] ?? ''; +$deviceCodeMd5 = $cfg['device_code_md5'] ?? ''; +$sqlitePath = $cfg['sqlite_path'] ?? (__DIR__ . '/../data/sendcard.sqlite'); + +if ($externalBase === '' || $deviceCode === '' || $deviceCodeMd5 === '') { + http_response_code(500); + echo json_encode(['error' => 'Config missing'], JSON_UNESCAPED_UNICODE); + exit; +} + +$externalUrl = $externalBase . '?device_code=' . rawurlencode($deviceCode) . '&device_code_md5=' . rawurlencode($deviceCodeMd5); + +try { + $resp = sendcard_fetch_credentials($externalUrl); + $httpStatus = $resp['http_status']; + $json = $resp['json']; + + $externalMsg = isset($json['msg']) ? (string)$json['msg'] : null; + $externalCode = isset($json['code']) ? (string)$json['code'] : null; + + $data = is_array($json['data'] ?? null) ? $json['data'] : null; + if ($data === null) { + http_response_code(502); + echo json_encode([ + 'error' => 'External response missing data', + 'external_http_status' => $httpStatus, + 'external_response' => $json, + ], JSON_UNESCAPED_UNICODE); + exit; + } + + // 仅给请求端返回 token;其它字段仅用于 SQLite 备档 + $token = isset($data['token']) ? (string)$data['token'] : null; + + $pdo = sendcard_get_pdo($sqlitePath); + sendcard_init_db($pdo); + + $stmt = $pdo->prepare( + 'INSERT INTO cursor_login_backups ( + external_msg, external_code, + external_id, email, token, createTime, lastTokenTime, status, + deviceCode, activationCode, useTime, lastId, deleted, emailLastStatus, + useCount, pwd, type, updateTime, banName, + webToken, cpName, comeStatus, comePushTime, + freeSevenStatus, windsurfUseStatus, windsurfStatus, windsurfToken, + windsurfPwd, windsurfUseTime, raw_json + ) VALUES ( + :external_msg, :external_code, + :external_id, :email, :token, :createTime, :lastTokenTime, :status, + :deviceCode, :activationCode, :useTime, :lastId, :deleted, :emailLastStatus, + :useCount, :pwd, :type, :updateTime, :banName, + :webToken, :cpName, :comeStatus, :comePushTime, + :freeSevenStatus, :windsurfUseStatus, :windsurfStatus, :windsurfToken, + :windsurfPwd, :windsurfUseTime, :raw_json + )' + ); + + // 一次回调:把 external data 的字段拆出来逐列存储 + $stmt->execute([ + ':external_msg' => $externalMsg, + ':external_code' => $externalCode, + ':external_id' => isset($data['id']) ? (int)$data['id'] : null, + ':email' => $data['email'] ?? null, + ':token' => $token, + ':createTime' => $data['createTime'] ?? null, + ':lastTokenTime' => $data['lastTokenTime'] ?? null, + ':status' => isset($data['status']) ? (int)$data['status'] : null, + ':deviceCode' => $data['deviceCode'] ?? null, + ':activationCode' => $data['activationCode'] ?? null, + ':useTime' => $data['useTime'] ?? null, + ':lastId' => isset($data['lastId']) ? (int)$data['lastId'] : null, + ':deleted' => isset($data['deleted']) ? (int)$data['deleted'] : null, + ':emailLastStatus' => isset($data['emailLastStatus']) ? (int)$data['emailLastStatus'] : null, + ':useCount' => isset($data['useCount']) ? (int)$data['useCount'] : null, + ':pwd' => $data['pwd'] ?? null, + ':type' => isset($data['type']) ? (int)$data['type'] : null, + ':updateTime' => $data['updateTime'] ?? null, + ':banName' => $data['banName'] ?? null, + ':webToken' => $data['webToken'] ?? null, + ':cpName' => $data['cpName'] ?? null, + ':comeStatus' => isset($data['comeStatus']) ? (int)$data['comeStatus'] : null, + ':comePushTime' => $data['comePushTime'] ?? null, + ':freeSevenStatus' => isset($data['freeSevenStatus']) ? (int)$data['freeSevenStatus'] : null, + ':windsurfUseStatus' => isset($data['windsurfUseStatus']) ? (int)$data['windsurfUseStatus'] : null, + ':windsurfStatus' => isset($data['windsurfStatus']) ? (int)$data['windsurfStatus'] : null, + ':windsurfToken' => $data['windsurfToken'] ?? null, + ':windsurfPwd' => $data['windsurfPwd'] ?? null, + ':windsurfUseTime' => $data['windsurfUseTime'] ?? null, + ':raw_json' => json_encode($json, JSON_UNESCAPED_UNICODE), + ]); + + if ($token === null || $token === '') { + http_response_code(502); + echo json_encode(['error' => 'External response missing token', 'external_http_status' => $httpStatus], JSON_UNESCAPED_UNICODE); + exit; + } + + // 只返回 token 给请求端 + echo $token; +} catch (Throwable $e) { + http_response_code(502); + echo json_encode(['error' => 'Bad Gateway', 'detail' => $e->getMessage()], JSON_UNESCAPED_UNICODE); + exit; +} + diff --git a/api/getcard.php-bak b/api/getcard.php-bak new file mode 100644 index 0000000..2dca18a --- /dev/null +++ b/api/getcard.php-bak @@ -0,0 +1,230 @@ + 'Method Not Allowed'], JSON_UNESCAPED_UNICODE); + + exit; + +} + + +// 只有在携带 type=xianyu 参数时才允许返回 + +$reqType = $_GET['type'] ?? null; + +if ($reqType !== 'xianyu') { + + http_response_code(400); + + echo json_encode(['error' => 'Invalid request parameter', 'need_type' => 'xianyu'], JSON_UNESCAPED_UNICODE); + + exit; + +} + + +require_once __DIR__ . '/../lib/db.php'; + +require_once __DIR__ . '/../lib/external.php'; + + +$cfg = require __DIR__ . '/../config.php'; + + +$externalBase = $cfg['external_base_url'] ?? ''; + +$deviceCode = $cfg['device_code'] ?? ''; + +$deviceCodeMd5 = $cfg['device_code_md5'] ?? ''; + +$sqlitePath = $cfg['sqlite_path'] ?? (__DIR__ . '/../data/sendcard.sqlite'); + + +if ($externalBase === '' || $deviceCode === '' || $deviceCodeMd5 === '') { + + http_response_code(500); + + echo json_encode(['error' => 'Config missing'], JSON_UNESCAPED_UNICODE); + + exit; + +} + + +$externalUrl = $externalBase . '?device_code=' . rawurlencode($deviceCode) . '&device_code_md5=' . rawurlencode($deviceCodeMd5); + + +try { + + $resp = sendcard_fetch_credentials($externalUrl); + + $httpStatus = $resp['http_status']; + + $json = $resp['json']; + + + $externalMsg = isset($json['msg']) ? (string)$json['msg'] : null; + + $externalCode = isset($json['code']) ? (string)$json['code'] : null; + + + $data = is_array($json['data'] ?? null) ? $json['data'] : null; + + if ($data === null) { + + http_response_code(502); + + echo json_encode(['error' => 'External response missing data'], JSON_UNESCAPED_UNICODE); + + exit; + + } + + + // 仅给请求端返回 token;其它字段仅用于 SQLite 备档 + + $token = isset($data['token']) ? (string)$data['token'] : null; + + + $pdo = sendcard_get_pdo($sqlitePath); + + sendcard_init_db($pdo); + + + $stmt = $pdo->prepare( + + 'INSERT INTO cursor_login_backups ( + + external_msg, external_code, + + external_id, email, token, createTime, lastTokenTime, status, + + deviceCode, activationCode, useTime, lastId, deleted, emailLastStatus, + + useCount, pwd, type, updateTime, banName, + + webToken, cpName, comeStatus, comePushTime, + + freeSevenStatus, windsurfUseStatus, windsurfStatus, windsurfToken, + + windsurfPwd, windsurfUseTime, raw_json + + ) VALUES ( + + :external_msg, :external_code, + + :external_id, :email, :token, :createTime, :lastTokenTime, :status, + + :deviceCode, :activationCode, :useTime, :lastId, :deleted, :emailLastStatus, + + :useCount, :pwd, :type, :updateTime, :banName, + + :webToken, :cpName, :comeStatus, :comePushTime, + + :freeSevenStatus, :windsurfUseStatus, :windsurfStatus, :windsurfToken, + + :windsurfPwd, :windsurfUseTime, :raw_json + + )' + + ); + + + // 一次回调:把 external data 的字段拆出来逐列存储 + + $stmt->execute([ + + ':external_msg' => $externalMsg, + + ':external_code' => $externalCode, + + ':external_id' => isset($data['id']) ? (int)$data['id'] : null, + + ':email' => $data['email'] ?? null, + + ':token' => $token, + + ':createTime' => $data['createTime'] ?? null, + + ':lastTokenTime' => $data['lastTokenTime'] ?? null, + + ':status' => isset($data['status']) ? (int)$data['status'] : null, + + ':deviceCode' => $data['deviceCode'] ?? null, + + ':activationCode' => $data['activationCode'] ?? null, + + ':useTime' => $data['useTime'] ?? null, + + ':lastId' => isset($data['lastId']) ? (int)$data['lastId'] : null, + + ':deleted' => isset($data['deleted']) ? (int)$data['deleted'] : null, + + ':emailLastStatus' => isset($data['emailLastStatus']) ? (int)$data['emailLastStatus'] : null, + + ':useCount' => isset($data['useCount']) ? (int)$data['useCount'] : null, + + ':pwd' => $data['pwd'] ?? null, + + ':type' => isset($data['type']) ? (int)$data['type'] : null, + + ':updateTime' => $data['updateTime'] ?? null, + + ':banName' => $data['banName'] ?? null, + + ':webToken' => $data['webToken'] ?? null, + + ':cpName' => $data['cpName'] ?? null, + + ':comeStatus' => isset($data['comeStatus']) ? (int)$data['comeStatus'] : null, + + ':comePushTime' => $data['comePushTime'] ?? null, + + ':freeSevenStatus' => isset($data['freeSevenStatus']) ? (int)$data['freeSevenStatus'] : null, + + ':windsurfUseStatus' => isset($data['windsurfUseStatus']) ? (int)$data['windsurfUseStatus'] : null, + + ':windsurfStatus' => isset($data['windsurfStatus']) ? (int)$data['windsurfStatus'] : null, + + ':windsurfToken' => $data['windsurfToken'] ?? null, + + ':windsurfPwd' => $data['windsurfPwd'] ?? null, + + ':windsurfUseTime' => $data['windsurfUseTime'] ?? null, + + ':raw_json' => json_encode($json, JSON_UNESCAPED_UNICODE), + + ]); + + + if ($token === null || $token === '') { + + http_response_code(502); + + echo json_encode(['error' => 'External response missing token', 'external_http_status' => $httpStatus], JSON_UNESCAPED_UNICODE); + + exit; + + } + + + // 只返回 token 给请求端 + + echo json_encode(['token' => $token], JSON_UNESCAPED_UNICODE); + +} catch (Throwable $e) { + + http_response_code(502); + + echo json_encode(['error' => 'Bad Gateway', 'detail' => $e->getMessage()], JSON_UNESCAPED_UNICODE); + + exit; + +} \ No newline at end of file diff --git a/api/getcard_poll.php b/api/getcard_poll.php new file mode 100644 index 0000000..89a9ef4 --- /dev/null +++ b/api/getcard_poll.php @@ -0,0 +1,156 @@ +>/www/wwwroot/你的域名/data/getcard_poll_cron.log 2>&1 + */ + +$cfg = require __DIR__ . '/../config.php'; + +$isCli = PHP_SAPI === 'cli'; +$cronKey = isset($cfg['poll_cron_key']) ? (string)$cfg['poll_cron_key'] : ''; +if (!$isCli) { + if ($cronKey === '' || (($_GET['key'] ?? '') !== $cronKey)) { + http_response_code(403); + header('Content-Type: text/plain; charset=utf-8'); + echo 'Forbidden'; + exit; + } + header('Content-Type: text/plain; charset=utf-8'); +} + +$dataDir = __DIR__ . '/../data'; +if (!is_dir($dataDir)) { + if (!@mkdir($dataDir, 0755, true) && !is_dir($dataDir)) { + sendcard_poll_out("Cannot create data directory: {$dataDir}\n"); + exit(1); + } +} + +$statePath = isset($cfg['poll_state_json']) && $cfg['poll_state_json'] !== '' + ? (string)$cfg['poll_state_json'] + : $dataDir . DIRECTORY_SEPARATOR . 'getcard_poll_state.json'; +$logPath = isset($cfg['poll_log_txt']) && $cfg['poll_log_txt'] !== '' + ? (string)$cfg['poll_log_txt'] + : $dataDir . DIRECTORY_SEPARATOR . 'getcard_poll_log.txt'; + +$externalBase = trim((string)($cfg['external_base_url'] ?? '')); +if ($externalBase === '') { + sendcard_poll_out("Config missing: external_base_url\n"); + exit(1); +} + +try { + $externalUrl = sendcard_poll_build_external_url($cfg); +} catch (InvalidArgumentException $e) { + sendcard_poll_out('Config invalid: ' . $e->getMessage() . "\n"); + exit(1); +} + +$now = time(); +$fh = fopen($statePath, 'c+'); +if ($fh === false) { + sendcard_poll_out("Cannot open state file: {$statePath}\n"); + exit(1); +} + +if (!flock($fh, LOCK_EX)) { + fclose($fh); + sendcard_poll_out("Cannot lock state file\n"); + exit(1); +} + +$raw = stream_get_contents($fh); +$state = is_string($raw) && $raw !== '' ? json_decode($raw, true) : null; +if (!is_array($state)) { + $state = []; +} +$nextRunAt = isset($state['next_run_at']) ? (int)$state['next_run_at'] : 0; + +if ($now < $nextRunAt) { + flock($fh, LOCK_UN); + fclose($fh); + $wait = $nextRunAt - $now; + sendcard_poll_out("Skip: next run in {$wait}s (at " . date('Y-m-d H:i:s', $nextRunAt) . ")\n"); + exit(0); +} + +require_once __DIR__ . '/../lib/external.php'; + +$linePrefix = '[' . date('Y-m-d H:i:s') . '] '; +$logBlock = ''; + +try { + $resp = sendcard_fetch_credentials($externalUrl); + $httpStatus = $resp['http_status']; + $json = $resp['json']; + $token = isset($json['data']['token']) ? (string)$json['data']['token'] : null; + $logBlock = $token !== null && $token !== '' + ? $token . "\n" + : $linePrefix . "http={$httpStatus} token missing: " . json_encode($json, JSON_UNESCAPED_UNICODE) . "\n"; +} catch (Throwable $e) { + $logBlock = $linePrefix . 'ERROR ' . $e->getMessage() . "\n"; +} + +// $intervalSec = max(4 * 60, 5 * 60 + random_int(-3 * 60, 3 * 60)); +$intervalSec = random_int(540, 840); +$newNext = $now + $intervalSec; +$state['next_run_at'] = $newNext; +$state['last_run_at'] = $now; +$state['last_interval_sec'] = $intervalSec; + +rewind($fh); +ftruncate($fh, 0); +fwrite($fh, json_encode($state, JSON_UNESCAPED_UNICODE)); +fflush($fh); +flock($fh, LOCK_UN); +fclose($fh); + +if ($logBlock !== '') { + file_put_contents($logPath, $logBlock, FILE_APPEND | LOCK_EX); +} + +sendcard_poll_out( + $logBlock . "Scheduled next run in {$intervalSec}s (at " . date('Y-m-d H:i:s', $newNext) . ")\n" +); +exit(0); + +function sendcard_poll_out(string $msg): void +{ + echo $msg; +} + +/** + * 轮询请求 URL:使用 config['poll'] 下的 device_code、device_code_md5 作为查询参数值(与 getcard 顶层 device_* 分离)。 + * + * @param array $cfg + */ +function sendcard_poll_build_external_url(array $cfg): string +{ + $base = trim((string)($cfg['external_base_url'] ?? '')); + if ($base === '') { + throw new InvalidArgumentException('external_base_url'); + } + + $poll = $cfg['poll'] ?? null; + if (!is_array($poll)) { + throw new InvalidArgumentException("config['poll'] 须为数组且含 device_code、device_code_md5"); + } + $dc = trim((string)($poll['device_code'] ?? '')); + $dm = trim((string)($poll['device_code_md5'] ?? '')); + if ($dc === '' || $dm === '') { + throw new InvalidArgumentException("config['poll']['device_code'] 与 ['device_code_md5'] 勿留空"); + } + + return $base . '?device_code=' . rawurlencode($dc) . '&device_code_md5=' . rawurlencode($dm); +} diff --git a/config.php b/config.php new file mode 100644 index 0000000..af31f1b --- /dev/null +++ b/config.php @@ -0,0 +1,24 @@ + 'http://82.157.20.83:9091/api/cursorLoginZs/getCredentials', + + // 机器 A:仅 api/getcard.php 使用(即时取 token,走 Web ?type=xianyu) + 'device_code' => 'BFEBFBFF000A06A4-5210N57MP0004BXP00R2-c84b8af03a6c40e888f72576a5f34a1f', + 'device_code_md5' => 'bc5613415689b537679ba22c2feae68c', + + // 机器 B:仅 api/getcard_poll.php 使用(定时轮询,与 A 设备参数不同) + // 与 A 共用 external_base_url;因上游常对「单设备 / 请求频次」有限制,用 B 分流轮询与即时请求。 + 'poll' => [ + 'device_code' => '178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f', + 'device_code_md5' => 'c6cc6802084015278275058c64bfb943', + ], + + // SQLite 数据库文件路径(相对当前项目目录) + 'sqlite_path' => __DIR__ . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'sendcard.sqlite', + + // getcard_poll 可选:poll_log_txt、poll_state_json;poll_cron_key 非空时允许 Web ?key= 触发(慎用) +]; + diff --git a/data/getcard_poll_cron.log b/data/getcard_poll_cron.log new file mode 100644 index 0000000..344f1a7 --- /dev/null +++ b/data/getcard_poll_cron.log @@ -0,0 +1,410 @@ + +Skip: next run in 180s (at 2026-04-12 14:56:01) +Skip: next run in 120s (at 2026-04-12 14:56:01) +Skip: next run in 60s (at 2026-04-12 14:56:01) +[2026-04-12 14:56:01] http=200 {"msg":"操作成功","code":"200","data":{"id":360474,"email":"ghxidphj2@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczMzBTRkY3Vk5HUkFNWjZSQk1OSFNKIiwidGltZSI6IjE3NzU1NTg5MzciLCJyYW5kb21uZXNzIjoiNDliMDE4ZTQtOTIxOS00YWI0IiwiZXhwIjoxNzgwNzQyOTM3LCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.2Z3y3M-UqNyAt957l94B-Y8FPktLy7VBYyAKN9EXedA","createTime":"2025-05-25 14:45:37","lastTokenTime":"2025-05-25 14:46:35","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 14:56:03","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 14:56:03","banName":"121 948 415(服务器028)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 18:48:58","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 240s (at 2026-04-12 15:00:01) +Skip: next run in 180s (at 2026-04-12 15:00:01) +Skip: next run in 120s (at 2026-04-12 15:00:01) +Skip: next run in 60s (at 2026-04-12 15:00:01) +[2026-04-12 15:00:01] http=200 {"msg":"请勿频繁刷新,请在1分钟后重试","code":"500","data":null} +Scheduled next run in 240s (at 2026-04-12 15:04:01) +Skip: next run in 180s (at 2026-04-12 15:04:01) +Skip: next run in 120s (at 2026-04-12 15:04:01) +Skip: next run in 60s (at 2026-04-12 15:04:01) +[2026-04-12 15:04:01] http=200 {"msg":"操作成功","code":"200","data":{"id":360540,"email":"hykhls97@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczM0FCM0pEUllRMFRLRTNFQ1FTRzNXIiwidGltZSI6IjE3NzU1NTkxMjkiLCJyYW5kb21uZXNzIjoiYzg4ZjgyNzgtNmM5OS00YmQ3IiwiZXhwIjoxNzgwNzQzMTI5LCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.FhjrevelxTRQSULSy9u_jjVGVOURzsPc7HMFElkPggs","createTime":"2025-05-25 14:50:50","lastTokenTime":"2025-05-25 14:51:54","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 15:04:04","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 15:04:04","banName":"777 953 113(服务器010)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 18:52:10","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 682s (at 2026-04-12 15:15:23) +Skip: next run in 622s (at 2026-04-12 15:15:23) +Skip: next run in 562s (at 2026-04-12 15:15:23) +Skip: next run in 502s (at 2026-04-12 15:15:23) +Skip: next run in 442s (at 2026-04-12 15:15:23) +Skip: next run in 382s (at 2026-04-12 15:15:23) +Skip: next run in 322s (at 2026-04-12 15:15:23) +Skip: next run in 262s (at 2026-04-12 15:15:23) +Skip: next run in 202s (at 2026-04-12 15:15:23) +Skip: next run in 142s (at 2026-04-12 15:15:23) +Skip: next run in 82s (at 2026-04-12 15:15:23) +Skip: next run in 22s (at 2026-04-12 15:15:23) +[2026-04-12 15:16:01] http=200 {"msg":"操作成功","code":"200","data":{"id":360636,"email":"xtpijq69@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczM1E4MkpSWEs4UUhERkQwVjIwUjVGIiwidGltZSI6IjE3NzU1NTk0NzQiLCJyYW5kb21uZXNzIjoiZDk1YTZhNzktZjA1Yi00MTBiIiwiZXhwIjoxNzgwNzQzNDc0LCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.veuKIdBap-bLJZbXBHmeozrORS0C5SJITY3bqbJewRk","createTime":"2025-05-25 14:57:54","lastTokenTime":"2025-05-28 03:47:10","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 15:16:03","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 15:16:03","banName":"208 079 807(服务器003)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 18:57:55","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 613s (at 2026-04-12 15:26:14) +Skip: next run in 552s (at 2026-04-12 15:26:14) +Skip: next run in 493s (at 2026-04-12 15:26:14) +Skip: next run in 433s (at 2026-04-12 15:26:14) +Skip: next run in 372s (at 2026-04-12 15:26:14) +Skip: next run in 313s (at 2026-04-12 15:26:14) +Skip: next run in 253s (at 2026-04-12 15:26:14) +Skip: next run in 192s (at 2026-04-12 15:26:14) +Skip: next run in 133s (at 2026-04-12 15:26:14) +Skip: next run in 73s (at 2026-04-12 15:26:14) +Skip: next run in 12s (at 2026-04-12 15:26:14) +[2026-04-12 15:27:01] http=200 {"msg":"操作成功","code":"200","data":{"id":360703,"email":"docfz755@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczNDBIQjBQTTUzMlNHSlM4TTEwWDBIIiwidGltZSI6IjE3NzU1NTk3NDgiLCJyYW5kb21uZXNzIjoiY2FkZTJjNTMtZjMxNi00OTI0IiwiZXhwIjoxNzgwNzQzNzQ4LCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.rOnalBrGmkRg1EvLmwROKkKDZ5BLenHkolA-xDAnk38","createTime":"2025-05-25 15:02:57","lastTokenTime":"2025-05-25 22:12:51","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 15:27:03","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 15:27:03","banName":"286 782 660(服务器023)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 19:02:28","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 678s (at 2026-04-12 15:38:19) +Skip: next run in 618s (at 2026-04-12 15:38:19) +Skip: next run in 558s (at 2026-04-12 15:38:19) +Skip: next run in 498s (at 2026-04-12 15:38:19) +Skip: next run in 438s (at 2026-04-12 15:38:19) +Skip: next run in 378s (at 2026-04-12 15:38:19) +Skip: next run in 318s (at 2026-04-12 15:38:19) +Skip: next run in 258s (at 2026-04-12 15:38:19) +Skip: next run in 198s (at 2026-04-12 15:38:19) +Skip: next run in 138s (at 2026-04-12 15:38:19) +Skip: next run in 78s (at 2026-04-12 15:38:19) +Skip: next run in 18s (at 2026-04-12 15:38:19) +[2026-04-12 15:39:01] http=200 {"msg":"操作成功","code":"200","data":{"id":360799,"email":"lqv323@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczNERTMkNERDhBSjFURVRIMVhTUUQzIiwidGltZSI6IjE3NzU1NjAxMTciLCJyYW5kb21uZXNzIjoiODE3ZWVhMmItZGU1My00OGE0IiwiZXhwIjoxNzgwNzQ0MTE3LCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.zXE8IOUZ-PEvjZG29TrmuoTCc14FaMZ2wgsrCg8E8m8","createTime":"2025-05-25 15:10:11","lastTokenTime":"2025-05-25 22:10:12","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 15:39:04","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 15:39:04","banName":"522 066 181(服务器005)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 19:08:38","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 591s (at 2026-04-12 15:48:52) +Skip: next run in 531s (at 2026-04-12 15:48:52) +Skip: next run in 471s (at 2026-04-12 15:48:52) +Skip: next run in 411s (at 2026-04-12 15:48:52) +Skip: next run in 351s (at 2026-04-12 15:48:52) +Skip: next run in 291s (at 2026-04-12 15:48:52) +Skip: next run in 231s (at 2026-04-12 15:48:52) +Skip: next run in 171s (at 2026-04-12 15:48:52) +Skip: next run in 111s (at 2026-04-12 15:48:52) +Skip: next run in 51s (at 2026-04-12 15:48:52) +[2026-04-12 15:49:01] http=200 {"msg":"操作成功","code":"200","data":{"id":360903,"email":"p916306@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczNFc1MVY2MVJRQkdIUTg0VlBUQ1lBIiwidGltZSI6IjE3NzU1NjA0ODAiLCJyYW5kb21uZXNzIjoiOTgwMzE4OWEtNmUxNi00MTA5IiwiZXhwIjoxNzgwNzQ0NDgwLCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.nWaOG6r1j4fF6qTy-ToDbM8wz4GUpDiji0KbzWbH4d8","createTime":"2025-05-25 15:18:02","lastTokenTime":"2025-05-28 03:51:10","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 15:49:03","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 15:49:03","banName":"363 454 639(服务器029)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 19:14:41","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 645s (at 2026-04-12 15:59:46) +Skip: next run in 585s (at 2026-04-12 15:59:46) +Skip: next run in 525s (at 2026-04-12 15:59:46) +Skip: next run in 465s (at 2026-04-12 15:59:46) +Skip: next run in 405s (at 2026-04-12 15:59:46) +Skip: next run in 345s (at 2026-04-12 15:59:46) +Skip: next run in 285s (at 2026-04-12 15:59:46) +Skip: next run in 225s (at 2026-04-12 15:59:46) +Skip: next run in 165s (at 2026-04-12 15:59:46) +Skip: next run in 105s (at 2026-04-12 15:59:46) +Skip: next run in 45s (at 2026-04-12 15:59:46) +[2026-04-12 16:00:01] http=200 {"msg":"操作成功","code":"200","data":{"id":360990,"email":"lbh18419@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczNTdOTVhaMUU3WjNOTTJaMllFUFJWIiwidGltZSI6IjE3NzU1NjA4MTQiLCJyYW5kb21uZXNzIjoiZTM5NTlkNWItODY3MS00NjQ0IiwiZXhwIjoxNzgwNzQ0ODE0LCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.kMOnWvXxGevb5k9VCnltzjvRRvkeoCycaSRVXzColdI","createTime":"2025-05-25 15:24:20","lastTokenTime":"2025-05-25 15:25:18","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 16:00:03","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 16:00:03","banName":"363 454 639(服务器029)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 19:20:15","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 575s (at 2026-04-12 16:09:36) +Skip: next run in 515s (at 2026-04-12 16:09:36) +Skip: next run in 455s (at 2026-04-12 16:09:36) +Skip: next run in 395s (at 2026-04-12 16:09:36) +Skip: next run in 335s (at 2026-04-12 16:09:36) +Skip: next run in 275s (at 2026-04-12 16:09:36) +Skip: next run in 215s (at 2026-04-12 16:09:36) +Skip: next run in 155s (at 2026-04-12 16:09:36) +Skip: next run in 95s (at 2026-04-12 16:09:36) +Skip: next run in 35s (at 2026-04-12 16:09:36) +[2026-04-12 16:10:01] http=200 {"msg":"操作成功","code":"200","data":{"id":361080,"email":"lkpro92@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczNU0zWllKSkFaUVdaRFJETVlDU1I5IiwidGltZSI6IjE3NzU1NjExOTYiLCJyYW5kb21uZXNzIjoiZDMyYmM3ODMtOTQxNy00YzEyIiwiZXhwIjoxNzgwNzQ1MTk2LCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9._Gijq-Es_b130YmbJ4G0aUuiVMu6AmBKBmyqy4y8jAQ","createTime":"2025-05-25 15:31:08","lastTokenTime":"2025-05-25 15:31:55","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 16:10:03","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 16:10:03","banName":"150 302 859(服务器027)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 19:26:37","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 548s (at 2026-04-12 16:19:09) +Skip: next run in 488s (at 2026-04-12 16:19:09) +Skip: next run in 428s (at 2026-04-12 16:19:09) +Skip: next run in 368s (at 2026-04-12 16:19:09) +Skip: next run in 308s (at 2026-04-12 16:19:09) +Skip: next run in 248s (at 2026-04-12 16:19:09) +Skip: next run in 188s (at 2026-04-12 16:19:09) +Skip: next run in 128s (at 2026-04-12 16:19:09) +Skip: next run in 68s (at 2026-04-12 16:19:09) +Skip: next run in 8s (at 2026-04-12 16:19:09) +[2026-04-12 16:20:01] http=200 {"msg":"操作成功","code":"200","data":{"id":361164,"email":"ibd175@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczNVo3RzJGQVdQUTBSQ1JSSDRTUllSIiwidGltZSI6IjE3NzU1NjE1MTQiLCJyYW5kb21uZXNzIjoiNDY0NjRlZjEtMWE5Yi00OTY1IiwiZXhwIjoxNzgwNzQ1NTE0LCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.YJ8xQ7aW4smReVv9v-apkB0T5TYlDBZIh7lJIyZflDM","createTime":"2025-05-25 15:37:12","lastTokenTime":"2025-05-25 22:00:15","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 16:20:03","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 16:20:03","banName":"363 454 639(服务器029)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 19:31:55","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 584s (at 2026-04-12 16:29:45) +Skip: next run in 523s (at 2026-04-12 16:29:45) +Skip: next run in 464s (at 2026-04-12 16:29:45) +Skip: next run in 404s (at 2026-04-12 16:29:45) +Skip: next run in 344s (at 2026-04-12 16:29:45) +Skip: next run in 284s (at 2026-04-12 16:29:45) +Skip: next run in 224s (at 2026-04-12 16:29:45) +Skip: next run in 164s (at 2026-04-12 16:29:45) +Skip: next run in 104s (at 2026-04-12 16:29:45) +Skip: next run in 44s (at 2026-04-12 16:29:45) +[2026-04-12 16:30:02] http=200 {"msg":"操作成功","code":"200","data":{"id":361244,"email":"pmol496338@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczNjlETVI4QzEzSzhQQTlXNVdKUTZCIiwidGltZSI6IjE3NzU1NjE4NzUiLCJyYW5kb21uZXNzIjoiZDAzMTNjZTYtMjFlOC00Y2JiIiwiZXhwIjoxNzgwNzQ1ODc1LCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.ragaojnQjNmGaerTkSBB0iEgGlxxuHrqZ4GO15FlG6A","createTime":"2025-05-25 15:42:45","lastTokenTime":"2025-05-25 21:57:58","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 16:30:04","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 16:30:04","banName":"470 126 354(服务器007)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 19:37:56","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 515s (at 2026-04-12 16:38:37) +Skip: next run in 456s (at 2026-04-12 16:38:37) +Skip: next run in 395s (at 2026-04-12 16:38:37) +Skip: next run in 336s (at 2026-04-12 16:38:37) +Skip: next run in 276s (at 2026-04-12 16:38:37) +Skip: next run in 216s (at 2026-04-12 16:38:37) +Skip: next run in 156s (at 2026-04-12 16:38:37) +Skip: next run in 96s (at 2026-04-12 16:38:37) +Skip: next run in 36s (at 2026-04-12 16:38:37) +[2026-04-12 16:39:01] http=200 {"msg":"操作成功","code":"200","data":{"id":361325,"email":"ylrphzen1@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczNk1DSDJCVlhXNllSMjFQSjNOMEFQIiwidGltZSI6IjE3NzU1NjIxNjciLCJyYW5kb21uZXNzIjoiNDQ2NTQxMGMtMDlkYi00ODJiIiwiZXhwIjoxNzgwNzQ2MTY3LCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.2IgMoNGPnau-hNKDgKLh4LnB3FLZBg0-dlRsti8c3fY","createTime":"2025-05-25 15:48:45","lastTokenTime":"2025-05-28 03:58:25","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 16:39:03","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 16:39:03","banName":"271 784 049(服务器004)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 19:42:48","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 576s (at 2026-04-12 16:48:37) +Skip: next run in 516s (at 2026-04-12 16:48:37) +Skip: next run in 456s (at 2026-04-12 16:48:37) +Skip: next run in 396s (at 2026-04-12 16:48:37) +Skip: next run in 336s (at 2026-04-12 16:48:37) +Skip: next run in 276s (at 2026-04-12 16:48:37) +Skip: next run in 216s (at 2026-04-12 16:48:37) +Skip: next run in 156s (at 2026-04-12 16:48:37) +Skip: next run in 96s (at 2026-04-12 16:48:37) +Skip: next run in 36s (at 2026-04-12 16:48:37) +[2026-04-12 16:49:01] http=200 {"msg":"操作成功","code":"200","data":{"id":361411,"email":"by0375@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczNlpKQTM1SDQ4NlE2RUVYTjRaMk00IiwidGltZSI6IjE3NzU1NjI0MTAiLCJyYW5kb21uZXNzIjoiOTJlYWI0MDItNDc0NC00NmE4IiwiZXhwIjoxNzgwNzQ2NDEwLCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.MIQ1PwuAyslWfj4mbhczeC7mkbkFTgi3jUvE8PhFqYM","createTime":"2025-05-25 15:54:51","lastTokenTime":"2025-05-28 04:00:26","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 16:49:04","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 16:49:04","banName":"548 867 904(服务器030)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 19:46:51","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 708s (at 2026-04-12 17:00:49) +Skip: next run in 648s (at 2026-04-12 17:00:49) +Skip: next run in 588s (at 2026-04-12 17:00:49) +Skip: next run in 528s (at 2026-04-12 17:00:49) +Skip: next run in 468s (at 2026-04-12 17:00:49) +Skip: next run in 408s (at 2026-04-12 17:00:49) +Skip: next run in 348s (at 2026-04-12 17:00:49) +Skip: next run in 288s (at 2026-04-12 17:00:49) +Skip: next run in 228s (at 2026-04-12 17:00:49) +Skip: next run in 168s (at 2026-04-12 17:00:49) +Skip: next run in 108s (at 2026-04-12 17:00:49) +Skip: next run in 48s (at 2026-04-12 17:00:49) +[2026-04-12 17:01:01] http=200 {"msg":"操作成功","code":"200","data":{"id":361507,"email":"wolts659@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczN0MySlpSRlgzTUZIMFlHNUpOV0JQIiwidGltZSI6IjE3NzU1NjI3MjUiLCJyYW5kb21uZXNzIjoiMDY2OGMzZjMtMjI1Yy00NTQzIiwiZXhwIjoxNzgwNzQ2NzI1LCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.FBvmLdgjJT_l-WFnGATbEToCZN7DIJyWqytux7fn-NE","createTime":"2025-05-25 16:01:41","lastTokenTime":"2025-05-25 16:02:36","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 17:01:03","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 17:01:03","banName":"150 302 859(服务器027)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 19:52:06","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 667s (at 2026-04-12 17:12:08) +Skip: next run in 607s (at 2026-04-12 17:12:08) +Skip: next run in 547s (at 2026-04-12 17:12:08) +Skip: next run in 487s (at 2026-04-12 17:12:08) +Skip: next run in 427s (at 2026-04-12 17:12:08) +Skip: next run in 367s (at 2026-04-12 17:12:08) +Skip: next run in 307s (at 2026-04-12 17:12:08) +Skip: next run in 247s (at 2026-04-12 17:12:08) +Skip: next run in 187s (at 2026-04-12 17:12:08) +Skip: next run in 127s (at 2026-04-12 17:12:08) +Skip: next run in 67s (at 2026-04-12 17:12:08) +Skip: next run in 7s (at 2026-04-12 17:12:08) +[2026-04-12 17:13:01] http=200 {"msg":"操作成功","code":"200","data":{"id":361605,"email":"wxt5@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczN1M0RTQ2SFdWUlRZQlk2MFpBN1o4IiwidGltZSI6IjE3NzU1NjMxMTIiLCJyYW5kb21uZXNzIjoiOGM5ODFkY2QtMDk5Zi00OWI3IiwiZXhwIjoxNzgwNzQ3MTEyLCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.h47MYTyPCajxtXbrSBeH4pgND2jFw0mMV2LvwH8xKT8","createTime":"2025-05-25 16:08:49","lastTokenTime":"2025-05-25 16:09:57","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 17:13:04","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 17:13:04","banName":"845 050 108(服务器026)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 19:58:33","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 667s (at 2026-04-12 17:24:08) +Skip: next run in 607s (at 2026-04-12 17:24:08) +Skip: next run in 547s (at 2026-04-12 17:24:08) +Skip: next run in 487s (at 2026-04-12 17:24:08) +Skip: next run in 427s (at 2026-04-12 17:24:08) +Skip: next run in 367s (at 2026-04-12 17:24:08) +Skip: next run in 307s (at 2026-04-12 17:24:08) +Skip: next run in 247s (at 2026-04-12 17:24:08) +Skip: next run in 187s (at 2026-04-12 17:24:08) +Skip: next run in 127s (at 2026-04-12 17:24:08) +Skip: next run in 67s (at 2026-04-12 17:24:08) +Skip: next run in 7s (at 2026-04-12 17:24:08) +[2026-04-12 17:25:01] http=200 {"msg":"操作成功","code":"200","data":{"id":361694,"email":"fv514121@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczODRXUEU4U1FKNVZGQ05YWEdaUTRLIiwidGltZSI6IjE3NzU1NjM0NDIiLCJyYW5kb21uZXNzIjoiZmNiOWY4Y2QtYmNmMy00MzczIiwiZXhwIjoxNzgwNzQ3NDQyLCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.fl2Vg4tnOSi8_smibIIcF8aI7tqX6-twYcXNrbfqbxQ","createTime":"2025-05-25 16:15:14","lastTokenTime":"2025-05-28 04:05:53","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 17:25:03","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 17:25:03","banName":"845 050 108(服务器026)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 20:04:03","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 677s (at 2026-04-12 17:36:18) +Skip: next run in 617s (at 2026-04-12 17:36:18) +Skip: next run in 557s (at 2026-04-12 17:36:18) +Skip: next run in 497s (at 2026-04-12 17:36:18) +Skip: next run in 437s (at 2026-04-12 17:36:18) +Skip: next run in 377s (at 2026-04-12 17:36:18) +Skip: next run in 317s (at 2026-04-12 17:36:18) +Skip: next run in 257s (at 2026-04-12 17:36:18) +Skip: next run in 197s (at 2026-04-12 17:36:18) +Skip: next run in 137s (at 2026-04-12 17:36:18) +Skip: next run in 77s (at 2026-04-12 17:36:18) +Skip: next run in 17s (at 2026-04-12 17:36:18) +[2026-04-12 17:37:01] http=200 {"msg":"操作成功","code":"200","data":{"id":361805,"email":"eu75@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczOEtQTVdRNlcxNURTUlYzSlpXMUNRIiwidGltZSI6IjE3NzU1NjM4NDkiLCJyYW5kb21uZXNzIjoiY2VmYWFmZDctYjlhYy00OWRkIiwiZXhwIjoxNzgwNzQ3ODQ5LCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.2-W-Mr6IGPjqa-v0IUQRrjelW0XdhHcBeSwzHZ8zcbo","createTime":"2025-05-25 16:23:19","lastTokenTime":"2025-05-25 16:24:14","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 17:37:04","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 17:37:04","banName":"845 050 108(服务器026)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 20:10:50","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 522s (at 2026-04-12 17:45:43) +Skip: next run in 462s (at 2026-04-12 17:45:43) +Skip: next run in 402s (at 2026-04-12 17:45:43) +Skip: next run in 342s (at 2026-04-12 17:45:43) +Skip: next run in 282s (at 2026-04-12 17:45:43) +Skip: next run in 222s (at 2026-04-12 17:45:43) +Skip: next run in 162s (at 2026-04-12 17:45:43) +Skip: next run in 102s (at 2026-04-12 17:45:43) +Skip: next run in 42s (at 2026-04-12 17:45:43) +[2026-04-12 17:46:01] http=200 {"msg":"操作成功","code":"200","data":{"id":361881,"email":"cwbbec553623@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczOFhSR1lQRzEzRlNCUDgyR0RIUFFEIiwidGltZSI6IjE3NzU1NjQxODEiLCJyYW5kb21uZXNzIjoiYmJhNWJkM2ItYmE3Mi00ZmQ2IiwiZXhwIjoxNzgwNzQ4MTgxLCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.6zC5LXuJTpO74dMlcMRQCQgO5sS-oaIRPQHl5531QJg","createTime":"2025-05-25 16:28:49","lastTokenTime":"2025-05-25 16:29:40","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 17:46:04","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 17:46:04","banName":"331 152 856(服务器001)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 20:16:22","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 661s (at 2026-04-12 17:57:02) +Skip: next run in 601s (at 2026-04-12 17:57:02) +Skip: next run in 541s (at 2026-04-12 17:57:02) +Skip: next run in 481s (at 2026-04-12 17:57:02) +Skip: next run in 421s (at 2026-04-12 17:57:02) +Skip: next run in 361s (at 2026-04-12 17:57:02) +Skip: next run in 301s (at 2026-04-12 17:57:02) +Skip: next run in 241s (at 2026-04-12 17:57:02) +Skip: next run in 181s (at 2026-04-12 17:57:02) +Skip: next run in 121s (at 2026-04-12 17:57:02) +Skip: next run in 61s (at 2026-04-12 17:57:02) +Skip: next run in 1s (at 2026-04-12 17:57:02) +[2026-04-12 17:58:01] http=200 {"msg":"操作成功","code":"200","data":{"id":361971,"email":"f6191@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczOTlNOVYwNzk4WDBZRzdRVkhBQ01RIiwidGltZSI6IjE3NzU1NjQ0ODkiLCJyYW5kb21uZXNzIjoiY2Q3OGExYTEtNjBkZi00ZjY0IiwiZXhwIjoxNzgwNzQ4NDg5LCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.5EvjRKUGLBgG5TfRX-KFn2wws3hy-kuNLZ0cyCHiBXc","createTime":"2025-05-25 16:35:18","lastTokenTime":"2025-05-25 16:36:14","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 17:58:03","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 17:58:03","banName":"792 818 793(服务器002)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 20:21:30","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 646s (at 2026-04-12 18:08:47) +Skip: next run in 586s (at 2026-04-12 18:08:47) +Skip: next run in 526s (at 2026-04-12 18:08:47) +Skip: next run in 466s (at 2026-04-12 18:08:47) +Skip: next run in 406s (at 2026-04-12 18:08:47) +Skip: next run in 346s (at 2026-04-12 18:08:47) +Skip: next run in 286s (at 2026-04-12 18:08:47) +Skip: next run in 226s (at 2026-04-12 18:08:47) +Skip: next run in 166s (at 2026-04-12 18:08:47) +Skip: next run in 106s (at 2026-04-12 18:08:47) +Skip: next run in 46s (at 2026-04-12 18:08:47) +[2026-04-12 18:09:01] http=200 {"msg":"操作成功","code":"200","data":{"id":362104,"email":"jazozz6483@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczOVRXRlpGVzVYRThQMTlYNzY1M00xIiwidGltZSI6IjE3NzU1NjQ3OTgiLCJyYW5kb21uZXNzIjoiYWRiZTg0NDAtZmYxOS00OTYxIiwiZXhwIjoxNzgwNzQ4Nzk4LCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.7BCDnL6G26zmomtMdJ5KNCrQ5VhU_07Sheek2NN0vCw","createTime":"2025-05-25 16:44:43","lastTokenTime":"2025-05-28 04:11:57","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 18:09:03","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 18:09:03","banName":"845 050 108(服务器026)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 20:26:39","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 640s (at 2026-04-12 18:19:41) +Skip: next run in 580s (at 2026-04-12 18:19:41) +Skip: next run in 520s (at 2026-04-12 18:19:41) +Skip: next run in 460s (at 2026-04-12 18:19:41) +Skip: next run in 400s (at 2026-04-12 18:19:41) +Skip: next run in 340s (at 2026-04-12 18:19:41) +Skip: next run in 280s (at 2026-04-12 18:19:41) +Skip: next run in 220s (at 2026-04-12 18:19:41) +Skip: next run in 160s (at 2026-04-12 18:19:41) +Skip: next run in 100s (at 2026-04-12 18:19:41) +Skip: next run in 40s (at 2026-04-12 18:19:41) +[2026-04-12 18:20:01] http=200 {"msg":"操作成功","code":"200","data":{"id":362231,"email":"mtyda1417@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczQUJWRFRHSDk3UjZORFFCTkU2OEg0IiwidGltZSI6IjE3NzU1NjUwNzMiLCJyYW5kb21uZXNzIjoiZmVjZjhjYjgtNjIzNC00ZGQ1IiwiZXhwIjoxNzgwNzQ5MDczLCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.SK0oovswVpp9Bzhds1VAfN-3kwHOWiTGftmw9TalEMU","createTime":"2025-05-25 16:54:00","lastTokenTime":"2025-05-25 16:54:50","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 18:20:03","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 18:20:03","banName":"784 730 890(服务器020)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 20:31:14","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 543s (at 2026-04-12 18:29:04) +Skip: next run in 483s (at 2026-04-12 18:29:04) +Skip: next run in 423s (at 2026-04-12 18:29:04) +Skip: next run in 363s (at 2026-04-12 18:29:04) +Skip: next run in 303s (at 2026-04-12 18:29:04) +Skip: next run in 243s (at 2026-04-12 18:29:04) +Skip: next run in 183s (at 2026-04-12 18:29:04) +Skip: next run in 123s (at 2026-04-12 18:29:04) +Skip: next run in 63s (at 2026-04-12 18:29:04) +Skip: next run in 3s (at 2026-04-12 18:29:04) +[2026-04-12 18:30:01] http=200 {"msg":"操作成功","code":"200","data":{"id":362365,"email":"zzwv139650@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczQVhHRVo1OEM3UVNIVjk3Wlo3RUNSIiwidGltZSI6IjE3NzU1NjU0NzUiLCJyYW5kb21uZXNzIjoiMjBjODIwMGYtMGU2ZC00ZTdiIiwiZXhwIjoxNzgwNzQ5NDc1LCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.Nr5yL0QK9nOv7SN4q2cTfSeE_X-hknv9NVCYwEw1mY0","createTime":"2025-05-25 17:03:38","lastTokenTime":"2025-05-25 17:05:36","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 18:30:03","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 18:30:03","banName":"575 674 474(服务器021)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 20:37:56","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 693s (at 2026-04-12 18:41:34) +Skip: next run in 633s (at 2026-04-12 18:41:34) +Skip: next run in 573s (at 2026-04-12 18:41:34) +Skip: next run in 513s (at 2026-04-12 18:41:34) +Skip: next run in 453s (at 2026-04-12 18:41:34) +Skip: next run in 393s (at 2026-04-12 18:41:34) +Skip: next run in 333s (at 2026-04-12 18:41:34) +Skip: next run in 273s (at 2026-04-12 18:41:34) +Skip: next run in 213s (at 2026-04-12 18:41:34) +Skip: next run in 153s (at 2026-04-12 18:41:34) +Skip: next run in 93s (at 2026-04-12 18:41:34) +Skip: next run in 33s (at 2026-04-12 18:41:34) +[2026-04-12 18:42:01] http=200 {"msg":"操作成功","code":"200","data":{"id":362472,"email":"vojzngwe29857@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczQkNLQjJBTVNYRDJIVDBaS1IxWjJZIiwidGltZSI6IjE3NzU1NjU4MzAiLCJyYW5kb21uZXNzIjoiZWQ4NDNmOTYtZTc5MS00MzcwIiwiZXhwIjoxNzgwNzQ5ODMwLCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.rkmV272BxiZLBXz0T5gtZmb9MQFszLkq5CTV_I9ggYk","createTime":"2025-05-25 17:11:53","lastTokenTime":"2025-05-28 04:16:39","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 18:42:03","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 18:42:03","banName":"208 079 807(服务器003)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 20:43:51","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 511s (at 2026-04-12 18:50:32) +Skip: next run in 451s (at 2026-04-12 18:50:32) +Skip: next run in 391s (at 2026-04-12 18:50:32) +Skip: next run in 330s (at 2026-04-12 18:50:32) +Skip: next run in 271s (at 2026-04-12 18:50:32) +Skip: next run in 211s (at 2026-04-12 18:50:32) +Skip: next run in 150s (at 2026-04-12 18:50:32) +Skip: next run in 91s (at 2026-04-12 18:50:32) +Skip: next run in 31s (at 2026-04-12 18:50:32) +[2026-04-12 18:51:02] http=200 {"msg":"操作成功","code":"200","data":{"id":362551,"email":"oejx86@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczQlE2Nk5YRjdNMUcwQjhXMDZURkQyIiwidGltZSI6IjE3NzU1NjYwMzQiLCJyYW5kb21uZXNzIjoiZTc1OTBmMWMtYjliMS00OTNiIiwiZXhwIjoxNzgwNzUwMDM0LCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.fgRcqDErrn3_CEDSvn6P1uud71ToBV-zBz1tUq539Ls","createTime":"2025-05-25 17:17:40","lastTokenTime":"2025-05-25 17:18:42","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 18:51:04","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 18:51:04","banName":"777 953 113(服务器010)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 20:47:15","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 586s (at 2026-04-12 19:00:48) +Skip: next run in 527s (at 2026-04-12 19:00:48) +Skip: next run in 466s (at 2026-04-12 19:00:48) +Skip: next run in 407s (at 2026-04-12 19:00:48) +Skip: next run in 347s (at 2026-04-12 19:00:48) +Skip: next run in 287s (at 2026-04-12 19:00:48) +Skip: next run in 227s (at 2026-04-12 19:00:48) +Skip: next run in 167s (at 2026-04-12 19:00:48) +Skip: next run in 107s (at 2026-04-12 19:00:48) +Skip: next run in 47s (at 2026-04-12 19:00:48) +[2026-04-12 19:01:01] http=200 {"msg":"操作成功","code":"200","data":{"id":362615,"email":"bywjv73427@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczQlo5V0s1VjQyTTNRTk5YMlJLVE1EIiwidGltZSI6IjE3NzU1NjYyNjQiLCJyYW5kb21uZXNzIjoiYWE0NjE3NjEtNjVmZC00ZGMzIiwiZXhwIjoxNzgwNzUwMjY0LCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.8snD6f1hN7OIojiLbu7rJkCMorbLj9W5juLUDbnfMIU","createTime":"2025-05-25 17:22:06","lastTokenTime":"2025-05-25 17:22:52","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 19:01:04","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 19:01:04","banName":"208 079 807(服务器003)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 20:51:05","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 530s (at 2026-04-12 19:09:51) +Skip: next run in 470s (at 2026-04-12 19:09:51) +Skip: next run in 410s (at 2026-04-12 19:09:51) +Skip: next run in 350s (at 2026-04-12 19:09:51) +Skip: next run in 290s (at 2026-04-12 19:09:51) +Skip: next run in 230s (at 2026-04-12 19:09:51) +Skip: next run in 170s (at 2026-04-12 19:09:51) +Skip: next run in 110s (at 2026-04-12 19:09:51) +Skip: next run in 50s (at 2026-04-12 19:09:51) +[2026-04-12 19:10:01] http=200 {"msg":"操作成功","code":"200","data":{"id":362672,"email":"hlalek5987@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczQzczV0VGSDRFVzI0QzY5R0YwREVRIiwidGltZSI6IjE3NzU1NjY0ODkiLCJyYW5kb21uZXNzIjoiYjFkYjE1N2YtMjQxNS00ZjA2IiwiZXhwIjoxNzgwNzUwNDg5LCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.2IFG0d9nJSHgyDODrYAIiPauQFDJaXCRa9hX6KMuUTE","createTime":"2025-05-25 17:26:21","lastTokenTime":"2025-05-25 17:27:29","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 19:10:03","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 19:10:03","banName":"777 953 113(服务器010)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 20:54:50","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 602s (at 2026-04-12 19:20:03) +Skip: next run in 542s (at 2026-04-12 19:20:03) +Skip: next run in 482s (at 2026-04-12 19:20:03) +Skip: next run in 422s (at 2026-04-12 19:20:03) +Skip: next run in 362s (at 2026-04-12 19:20:03) +Skip: next run in 302s (at 2026-04-12 19:20:03) +Skip: next run in 242s (at 2026-04-12 19:20:03) +Skip: next run in 182s (at 2026-04-12 19:20:03) +Skip: next run in 122s (at 2026-04-12 19:20:03) +Skip: next run in 62s (at 2026-04-12 19:20:03) +Skip: next run in 2s (at 2026-04-12 19:20:03) +[2026-04-12 19:21:01] http=200 {"msg":"操作成功","code":"200","data":{"id":362755,"email":"tvxfgkkp0@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczQ0ozVFcwVzBHQjk4NUdWNU0yRUpEIiwidGltZSI6IjE3NzU1NjY3NzIiLCJyYW5kb21uZXNzIjoiMDllNDQ3NTYtMDlmMS00NzA1IiwiZXhwIjoxNzgwNzUwNzcyLCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.SXs9Oo9RWeLyCv-oQfg2Gd84PkaFxF3ZqByZtkJz434","createTime":"2025-05-25 17:32:22","lastTokenTime":"2025-05-25 21:22:58","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 19:21:03","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 19:21:03","banName":"284 966 873(服务器011)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 20:59:33","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 645s (at 2026-04-12 19:31:46) +Skip: next run in 585s (at 2026-04-12 19:31:46) +Skip: next run in 525s (at 2026-04-12 19:31:46) +Skip: next run in 465s (at 2026-04-12 19:31:46) +Skip: next run in 405s (at 2026-04-12 19:31:46) +Skip: next run in 345s (at 2026-04-12 19:31:46) +Skip: next run in 285s (at 2026-04-12 19:31:46) +Skip: next run in 225s (at 2026-04-12 19:31:46) +Skip: next run in 165s (at 2026-04-12 19:31:46) +Skip: next run in 105s (at 2026-04-12 19:31:46) +Skip: next run in 45s (at 2026-04-12 19:31:46) +[2026-04-12 19:32:01] http=200 {"msg":"操作成功","code":"200","data":{"id":362845,"email":"g473197@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlczQ1hONUs1VlBIMTFQRFQ2V0NLTVI2IiwidGltZSI6IjE3NzU1NjcwODUiLCJyYW5kb21uZXNzIjoiZDk2Y2Q1MWMtNmQ3Ni00ZGZjIiwiZXhwIjoxNzgwNzUxMDg1LCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.gkDYgizxnBCGw5rHcfenRC0JnNzJNo5eAlPZ_Gcn0_I","createTime":"2025-05-25 17:38:41","lastTokenTime":"2025-05-25 17:39:54","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-12 19:32:03","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-12 19:32:03","banName":"845 050 108(服务器026)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-07 21:04:45","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 600s (at 2026-04-12 19:42:01) +Skip: next run in 540s (at 2026-04-12 19:42:01) +Skip: next run in 480s (at 2026-04-12 19:42:01) +Skip: next run in 420s (at 2026-04-12 19:42:01) +Skip: next run in 360s (at 2026-04-12 19:42:01) +Skip: next run in 300s (at 2026-04-12 19:42:01) +Skip: next run in 240s (at 2026-04-12 19:42:01) +Skip: next run in 180s (at 2026-04-12 19:42:01) +Skip: next run in 120s (at 2026-04-12 19:42:01) +Skip: next run in 60s (at 2026-04-12 19:42:01) +[2026-04-12 19:42:01] http=200 {"msg":"今天账号已获取完,请明天再来","code":"500","data":null} +Scheduled next run in 611s (at 2026-04-12 19:52:12) +Skip: next run in 551s (at 2026-04-12 19:52:12) +Skip: next run in 491s (at 2026-04-12 19:52:12) +Skip: next run in 431s (at 2026-04-12 19:52:12) +Skip: next run in 371s (at 2026-04-12 19:52:12) +Skip: next run in 311s (at 2026-04-12 19:52:12) +Skip: next run in 251s (at 2026-04-12 19:52:12) +Skip: next run in 191s (at 2026-04-12 19:52:12) +Skip: next run in 131s (at 2026-04-12 19:52:12) +Skip: next run in 71s (at 2026-04-12 19:52:12) +Skip: next run in 11s (at 2026-04-12 19:52:12) +[2026-04-12 19:53:01] http=200 {"msg":"今天账号已获取完,请明天再来","code":"500","data":null} +Scheduled next run in 605s (at 2026-04-12 20:03:06) +Skip: next run in 545s (at 2026-04-12 20:03:06) +Skip: next run in 485s (at 2026-04-12 20:03:06) +Skip: next run in 425s (at 2026-04-12 20:03:06) +Skip: next run in 365s (at 2026-04-12 20:03:06) +Skip: next run in 305s (at 2026-04-12 20:03:06) +Skip: next run in 245s (at 2026-04-12 20:03:06) +Skip: next run in 185s (at 2026-04-12 20:03:06) +Skip: next run in 125s (at 2026-04-12 20:03:06) +Skip: next run in 65s (at 2026-04-12 20:03:06) +Skip: next run in 4s (at 2026-04-12 20:03:06) +[2026-04-12 20:04:01] http=200 {"msg":"今天账号已获取完,请明天再来","code":"500","data":null} +Scheduled next run in 717s (at 2026-04-12 20:15:58) +Skip: next run in 657s (at 2026-04-12 20:15:58) +Skip: next run in 597s (at 2026-04-12 20:15:58) +Skip: next run in 536s (at 2026-04-12 20:15:58) +Skip: next run in 477s (at 2026-04-12 20:15:58) +Skip: next run in 417s (at 2026-04-12 20:15:58) +Skip: next run in 356s (at 2026-04-12 20:15:58) +Skip: next run in 297s (at 2026-04-12 20:15:58) +Skip: next run in 237s (at 2026-04-12 20:15:58) +Skip: next run in 176s (at 2026-04-12 20:15:58) +Skip: next run in 117s (at 2026-04-12 20:15:58) +Skip: next run in 57s (at 2026-04-12 20:15:58) +[2026-04-12 20:16:01] http=200 {"msg":"今天账号已获取完,请明天再来","code":"500","data":null} +Scheduled next run in 612s (at 2026-04-12 20:26:13) +Skip: next run in 552s (at 2026-04-12 20:26:13) +Skip: next run in 492s (at 2026-04-12 20:26:13) +Skip: next run in 432s (at 2026-04-12 20:26:13) +Skip: next run in 372s (at 2026-04-12 20:26:13) +Skip: next run in 312s (at 2026-04-12 20:26:13) +Skip: next run in 252s (at 2026-04-12 20:26:13) +Skip: next run in 192s (at 2026-04-12 20:26:13) +Skip: next run in 132s (at 2026-04-12 20:26:13) +Skip: next run in 72s (at 2026-04-12 20:26:13) +Skip: next run in 12s (at 2026-04-12 20:26:13) +[2026-04-12 20:27:01] http=200 {"msg":"今天账号已获取完,请明天再来","code":"500","data":null} +Scheduled next run in 623s (at 2026-04-12 20:37:24) +Skip: next run in 563s (at 2026-04-12 20:37:24) +Skip: next run in 503s (at 2026-04-12 20:37:24) +Skip: next run in 443s (at 2026-04-12 20:37:24) +Skip: next run in 383s (at 2026-04-12 20:37:24) +Skip: next run in 323s (at 2026-04-12 20:37:24) +Skip: next run in 263s (at 2026-04-12 20:37:24) +Skip: next run in 203s (at 2026-04-12 20:37:24) +Skip: next run in 143s (at 2026-04-12 20:37:24) +Skip: next run in 83s (at 2026-04-12 20:37:24) +Skip: next run in 23s (at 2026-04-12 20:37:24) +[2026-04-12 20:38:01] http=200 {"msg":"今天账号已获取完,请明天再来","code":"500","data":null} +Scheduled next run in 521s (at 2026-04-12 20:46:42) +Skip: next run in 461s (at 2026-04-12 20:46:42) +Skip: next run in 401s (at 2026-04-12 20:46:42) +Skip: next run in 341s (at 2026-04-12 20:46:42) +Skip: next run in 281s (at 2026-04-12 20:46:42) +Skip: next run in 221s (at 2026-04-12 20:46:42) +Skip: next run in 161s (at 2026-04-12 20:46:42) +Skip: next run in 101s (at 2026-04-12 20:46:42) +Skip: next run in 41s (at 2026-04-12 20:46:42) +[2026-04-12 20:47:01] http=200 {"msg":"今天账号已获取完,请明天再来","code":"500","data":null} +Scheduled next run in 605s (at 2026-04-12 20:57:06) +Skip: next run in 545s (at 2026-04-12 20:57:06) +Skip: next run in 484s (at 2026-04-12 20:57:06) +Skip: next run in 425s (at 2026-04-12 20:57:06) +Skip: next run in 365s (at 2026-04-12 20:57:06) +Skip: next run in 304s (at 2026-04-12 20:57:06) +Skip: next run in 245s (at 2026-04-12 20:57:06) +Skip: next run in 185s (at 2026-04-12 20:57:06) +Skip: next run in 125s (at 2026-04-12 20:57:06) +Skip: next run in 65s (at 2026-04-12 20:57:06) +Skip: next run in 5s (at 2026-04-12 20:57:06) +[2026-04-12 20:58:02] http=200 {"msg":"今天账号已获取完,请明天再来","code":"500","data":null} +Scheduled next run in 518s (at 2026-04-12 21:06:40) +Skip: next run in 459s (at 2026-04-12 21:06:40) +Skip: next run in 399s (at 2026-04-12 21:06:40) +Skip: next run in 339s (at 2026-04-12 21:06:40) +Skip: next run in 279s (at 2026-04-12 21:06:40) +Skip: next run in 219s (at 2026-04-12 21:06:40) +[2026-04-13 08:32:01] http=200 {"msg":"操作成功","code":"200","data":{"id":365859,"email":"qouko42@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlc2Nk0wOTFCMzQ0SFFWQVFaSkY5NFpFIiwidGltZSI6IjE3NzU2MTYyMTUiLCJyYW5kb21uZXNzIjoiYzAwNjdjMDAtNTE3MC00MTQ3IiwiZXhwIjoxNzgwODAwMjE1LCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.5ib1UHn0ZrTA_0c0XmNYWmSyvZ8PXIUDjtMaYI9wgkA","createTime":"2025-05-26 19:46:15","lastTokenTime":"2025-05-26 19:47:16","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-13 08:32:03","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-13 08:32:03","banName":"792 818 793(服务器002)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-08 10:43:36","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} +Scheduled next run in 712s (at 2026-04-13 08:43:53) diff --git a/data/getcard_poll_log.txt b/data/getcard_poll_log.txt new file mode 100644 index 0000000..1036a51 --- /dev/null +++ b/data/getcard_poll_log.txt @@ -0,0 +1 @@ +[2026-04-13 08:32:01] http=200 {"msg":"操作成功","code":"200","data":{"id":365859,"email":"qouko42@cursor.com","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhdXRoMHx1c2VyXzAxSlc2Nk0wOTFCMzQ0SFFWQVFaSkY5NFpFIiwidGltZSI6IjE3NzU2MTYyMTUiLCJyYW5kb21uZXNzIjoiYzAwNjdjMDAtNTE3MC00MTQ3IiwiZXhwIjoxNzgwODAwMjE1LCJpc3MiOiJodHRwczovL2F1dGhlbnRpY2F0aW9uLmN1cnNvci5zaCIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MiLCJhdWQiOiJodHRwczovL2N1cnNvci5jb20iLCJ0eXBlIjoic2Vzc2lvbiJ9.5ib1UHn0ZrTA_0c0XmNYWmSyvZ8PXIUDjtMaYI9wgkA","createTime":"2025-05-26 19:46:15","lastTokenTime":"2025-05-26 19:47:16","status":1,"deviceCode":"178BFBFF00A20F10-190449138600155-c84b8af03a6c40e888f72576a5f34a1f","activationCode":"cl0436a5348e904dc9b9b2a3fdd0a13c24","useTime":"2026-04-13 08:32:03","lastId":30,"deleted":0,"emailLastStatus":0,"useCount":0,"pwd":"cursorLogin","type":3,"updateTime":"2026-04-13 08:32:03","banName":"792 818 793(服务器002)","webToken":null,"cpName":null,"comeStatus":1,"comePushTime":"2026-04-08 10:43:36","freeSevenStatus":null,"windsurfUseStatus":88,"windsurfStatus":88,"windsurfToken":null,"windsurfPwd":null,"windsurfUseTime":null}} diff --git a/data/getcard_poll_state.json b/data/getcard_poll_state.json new file mode 100644 index 0000000..17970b8 --- /dev/null +++ b/data/getcard_poll_state.json @@ -0,0 +1 @@ +{"next_run_at":1776041033,"last_run_at":1776040321,"last_interval_sec":712} \ No newline at end of file diff --git a/data/sendcard.sqlite b/data/sendcard.sqlite new file mode 100644 index 0000000..b67024e Binary files /dev/null and b/data/sendcard.sqlite differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..86aeca2 --- /dev/null +++ b/index.html @@ -0,0 +1,39 @@ + + + + + 恭喜,站点创建成功! + + + +
+

恭喜, 站点创建成功!

+

这是默认index.html,本页面由系统自动生成

+ +
+ + \ No newline at end of file diff --git a/lib/db.php b/lib/db.php new file mode 100644 index 0000000..facbe78 --- /dev/null +++ b/lib/db.php @@ -0,0 +1,61 @@ + PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + ]); + + return $pdo; +} + +function sendcard_init_db(PDO $pdo): void +{ + // 备档表:每次回调把外部接口 data 全量字段写入(token 不会返回给前端以外,只会返回给请求端) + $pdo->exec( + 'CREATE TABLE IF NOT EXISTS cursor_login_backups ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + fetched_at TEXT DEFAULT CURRENT_TIMESTAMP, + external_msg TEXT, + external_code TEXT, + -- external data fields + external_id INTEGER, + email TEXT, + token TEXT, + createTime TEXT, + lastTokenTime TEXT, + status INTEGER, + deviceCode TEXT, + activationCode TEXT, + useTime TEXT, + lastId INTEGER, + deleted INTEGER, + emailLastStatus INTEGER, + useCount INTEGER, + pwd TEXT, + type INTEGER, + updateTime TEXT, + banName TEXT, + webToken TEXT, + cpName TEXT, + comeStatus INTEGER, + comePushTime TEXT, + freeSevenStatus INTEGER, + windsurfUseStatus INTEGER, + windsurfStatus INTEGER, + windsurfToken TEXT, + windsurfPwd TEXT, + windsurfUseTime TEXT, + raw_json TEXT + )' + ); +} + diff --git a/lib/external.php b/lib/external.php new file mode 100644 index 0000000..28d129f --- /dev/null +++ b/lib/external.php @@ -0,0 +1,47 @@ + $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_CONNECTTIMEOUT => min(10, $timeoutSeconds), + CURLOPT_TIMEOUT => $timeoutSeconds, + CURLOPT_HTTPHEADER => [ + 'Accept: application/json', + 'User-Agent: sendcard-php/1.0', + ], + // 外部是 http,通常不需要证书校验;若换成 https,可再调整。 + ]); + + $body = curl_exec($ch); + if ($body === false) { + $err = curl_error($ch); + curl_close($ch); + throw new RuntimeException('External request failed: ' . $err); + } + + $statusCode = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + $json = json_decode($body, true); + if (!is_array($json)) { + throw new RuntimeException('External response is not valid JSON'); + } + + // 返回:包含 HTTP 状态码与解析后的 JSON + return [ + 'http_status' => $statusCode, + 'json' => $json, + ]; +} + diff --git a/scripts/get_device_info.bat b/scripts/get_device_info.bat new file mode 100644 index 0000000..965d4d4 --- /dev/null +++ b/scripts/get_device_info.bat @@ -0,0 +1,101 @@ +@echo off +REM ASCII-only so cmd parses correctly on any system code page. Chinese labels: see README. +setlocal EnableDelayedExpansion +chcp 65001 >nul 2>&1 +title device_code helper + +set "CPU=" +set "BOARD=" +set "BIOSSN=" +set "MGUID=" +set "MGFLAT=" + +where wmic >nul 2>&1 +if errorlevel 1 goto NO_WMIC + +for /f "tokens=1* delims==" %%a in ('wmic cpu get ProcessorId /value 2^>nul ^| findstr /i /c:"ProcessorId="') do set "CPU=%%b" +for /f "tokens=* delims= " %%z in ("!CPU!") do set "CPU=%%z" + +for /f "tokens=1* delims==" %%a in ('wmic baseboard get SerialNumber /value 2^>nul ^| findstr /i /c:"SerialNumber="') do set "BOARD=%%b" +for /f "tokens=* delims= " %%z in ("!BOARD!") do set "BOARD=%%z" + +for /f "tokens=1* delims==" %%a in ('wmic bios get SerialNumber /value 2^>nul ^| findstr /i /c:"SerialNumber="') do set "BIOSSN=%%b" +for /f "tokens=* delims= " %%z in ("!BIOSSN!") do set "BIOSSN=%%z" + +goto READ_REG + +:NO_WMIC +echo [Note] wmic not found. CPU and board lines may be empty; registry GUID is still read. +echo. + +:READ_REG +for /f "tokens=3" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Cryptography" /v MachineGuid 2^>nul ^| findstr /i "MachineGuid"') do set "MGUID=%%a" +for /f "tokens=* delims= " %%z in ("!MGUID!") do set "MGUID=%%z" + +if not defined MGUID goto SHOW +set "MGFLAT=!MGUID:{=!" +set "MGFLAT=!MGFLAT:}=!" +set "MGFLAT=!MGFLAT:-=!" + +:SHOW +cls +echo ============================================================ +echo Device info - three segments for device_code - see README +echo [1] ProcessorId [2] BaseBoard serial [3] MachineGuid flat +echo ============================================================ +echo. + +echo [1] CPU ProcessorId - Win32_Processor +if defined CPU goto OUT_CPU +echo [not read] +goto OUT_CPU_X +:OUT_CPU +echo !CPU! +:OUT_CPU_X +echo. + +echo [2] BaseBoard SerialNumber - Win32_BaseBoard +if defined BOARD goto OUT_BR +echo [not read] +goto OUT_BR_X +:OUT_BR +echo !BOARD! +:OUT_BR_X +echo. + +echo [2-alt] BIOS SerialNumber - Win32_BIOS optional +if defined BIOSSN goto OUT_BS +echo [not read] +goto OUT_BS_X +:OUT_BS +echo !BIOSSN! +:OUT_BS_X +echo. + +echo [3] MachineGuid - HKLM\SOFTWARE\Microsoft\Cryptography +if defined MGUID goto OUT_MG +echo [not read] +goto OUT_MG_X +:OUT_MG +echo !MGUID! +echo Flat no braces hyphens - often segment 3: +echo !MGFLAT! +:OUT_MG_X +echo. + +echo ------------------------------------------------------------ +echo Suggested device_code: ProcessorId-BaseBoard-MachineGuidFlat +echo ------------------------------------------------------------ +if not defined CPU goto JOIN_BAD +if not defined BOARD goto JOIN_BAD +if not defined MGFLAT goto JOIN_BAD +echo !CPU!-!BOARD!-!MGFLAT! +goto JOIN_OK +:JOIN_BAD +echo [incomplete] Copy values above and join with ASCII hyphen. +:JOIN_OK +echo. +echo Note: Final device_code depends on your upstream collector. +echo. +pause +endlocal