From 56775e85f383a412c65d34e30287446b71f998f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BF=97=E5=BC=BA?= <357099073@qq.com> Date: Tue, 14 Apr 2026 09:47:00 +0800 Subject: [PATCH] first commit --- .gitignore | 0 .htaccess | 5 + .user.ini | 1 + 404.html | 7 + README.md | 154 +++++++++++++ api/getcard.php | 132 +++++++++++ api/getcard.php-bak | 230 ++++++++++++++++++++ api/getcard_poll.php | 156 +++++++++++++ config.php | 24 ++ data/getcard_poll_cron.log | 410 +++++++++++++++++++++++++++++++++++ data/getcard_poll_log.txt | 1 + data/getcard_poll_state.json | 1 + data/sendcard.sqlite | Bin 0 -> 270336 bytes index.html | 39 ++++ lib/db.php | 61 ++++++ lib/external.php | 47 ++++ scripts/get_device_info.bat | 101 +++++++++ 17 files changed, 1369 insertions(+) create mode 100644 .gitignore create mode 100644 .htaccess create mode 100644 .user.ini create mode 100644 404.html create mode 100644 README.md create mode 100644 api/getcard.php create mode 100644 api/getcard.php-bak create mode 100644 api/getcard_poll.php create mode 100644 config.php create mode 100644 data/getcard_poll_cron.log create mode 100644 data/getcard_poll_log.txt create mode 100644 data/getcard_poll_state.json create mode 100644 data/sendcard.sqlite create mode 100644 index.html create mode 100644 lib/db.php create mode 100644 lib/external.php create mode 100644 scripts/get_device_info.bat 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 0000000000000000000000000000000000000000..b67024ef760d3653a74997491d4c6d245bea39f6 GIT binary patch literal 270336 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 QjLZJ_)E;L%x&8nD0C3PtyZ`_I literal 0 HcmV?d00001 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,本页面由系统自动生成

+
    +
  • 本页面在FTP根目录下的index.html
  • +
  • 您可以修改、删除或覆盖本页面
  • +
  • FTP相关信息,请到“面板系统后台 > FTP” 查看
  • +
+
+ + \ 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