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,本页面由系统自动生成
+
+ - 本页面在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