first commit

This commit is contained in:
李志强 2026-04-14 09:47:00 +08:00
commit 56775e85f3
17 changed files with 1369 additions and 0 deletions

0
.gitignore vendored Normal file
View File

5
.htaccess Normal file
View File

@ -0,0 +1,5 @@
RewriteEngine On
# 讓 /api/getcard 直接對應到 api/getcard.php避免漏寫 .php
RewriteRule ^api/getcard/?$ api/getcard.php [L]

1
.user.ini Normal file
View File

@ -0,0 +1 @@
open_basedir=/www/wwwroot/sendcard.yunzer.cn/:/tmp/

7
404.html Normal file
View File

@ -0,0 +1,7 @@
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

154
README.md Normal file
View File

@ -0,0 +1,154 @@
<!-- markdownlint-disable MD047 -->
# 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 ProcessorIdwmic 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 位十六进制)
很像 去掉连字符的 UUID128 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))`,即 **48 分钟** 之间随机。
若你希望轮询成功时也像 `getcard.php` 一样写入 SQLite可以再说一下我可以把那段插入逻辑复用到 `getcard_poll.php` 里。

132
api/getcard.php Normal file
View File

@ -0,0 +1,132 @@
<?php
declare(strict_types=1);
header('Content-Type: text/plain; charset=utf-8');
// 简单允许方法GET
if (($_SERVER['REQUEST_METHOD'] ?? '') !== 'GET') {
http_response_code(405);
echo json_encode(['error' => '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;
}

230
api/getcard.php-bak Normal file
View File

@ -0,0 +1,230 @@
<?php
header('Content-Type: application/json; charset=utf-8');
// 简单允许方法GET
if (($_SERVER['REQUEST_METHOD'] ?? '') !== 'GET') {
http_response_code(405);
echo json_encode(['error' => '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;
}

156
api/getcard_poll.php Normal file
View File

@ -0,0 +1,156 @@
<?php
declare(strict_types=1);
/**
* 定时轮询拉取外部凭证并追加写入本地 txt逻辑与 getcard 调同一 external 接口,仅触发节奏不同)。
*
* 设备:使用 config['poll'] 的机器 B device_code / device_code_md5getcard.php 使用顶层机器 A。
* 原因:上游常对单设备或请求频次有限制,即时请求走 A、定时轮询走 B避免抢同一套额度。
*
* 间隔:基准 5 分钟 ±3 分钟随机,且不少于 4 分钟(由「下次执行时间」控制)。
* 宝塔 / Linux计划任务每分钟执行一次本脚本未到点会直接退出不会请求外部接口。
*
* 示例 crontab把路径改成你的站点根目录下的本文件
* * * * * * /usr/bin/php /www/wwwroot/你的域名/api/getcard_poll.php >>/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<string, mixed> $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);
}

24
config.php Normal file
View File

@ -0,0 +1,24 @@
<?php
// 统一配置(建议改用环境变量/secret 管理,避免硬编码敏感信息)
return [
// 外部接口:获取 credentialsgetcard.php 与 getcard_poll.php 共用地址)
'external_base_url' => '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_jsonpoll_cron_key 非空时允许 Web ?key= 触发(慎用)
];

410
data/getcard_poll_cron.log Normal file
View File

@ -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)

View File

@ -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}}

View File

@ -0,0 +1 @@
{"next_run_at":1776041033,"last_run_at":1776040321,"last_interval_sec":712}

BIN
data/sendcard.sqlite Normal file

Binary file not shown.

39
index.html Normal file
View File

@ -0,0 +1,39 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>恭喜,站点创建成功!</title>
<style>
.container {
width: 60%;
margin: 10% auto 0;
background-color: #f0f0f0;
padding: 2% 5%;
border-radius: 10px
}
ul {
padding-left: 20px;
}
ul li {
line-height: 2.3
}
a {
color: #20a53a
}
</style>
</head>
<body>
<div class="container">
<h1>恭喜, 站点创建成功!</h1>
<h3>这是默认index.html本页面由系统自动生成</h3>
<ul>
<li>本页面在FTP根目录下的index.html</li>
<li>您可以修改、删除或覆盖本页面</li>
<li>FTP相关信息请到“面板系统后台 > FTP” 查看</li>
</ul>
</div>
</body>
</html>

61
lib/db.php Normal file
View File

@ -0,0 +1,61 @@
<?php
declare(strict_types=1);
function sendcard_get_pdo(string $sqlitePath): PDO
{
$dir = dirname($sqlitePath);
if (!is_dir($dir)) {
mkdir($dir, 0777, true);
}
$pdo = new PDO('sqlite:' . $sqlitePath, null, null, [
PDO::ATTR_ERRMODE => 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
)'
);
}

47
lib/external.php Normal file
View File

@ -0,0 +1,47 @@
<?php
declare(strict_types=1);
function sendcard_fetch_credentials(string $url, int $timeoutSeconds = 15): array
{
// 使用 cURL 取外部接口(外部接口返回 JSON
$ch = curl_init();
if ($ch === false) {
throw new RuntimeException('curl_init failed');
}
curl_setopt_array($ch, [
CURLOPT_URL => $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,
];
}

101
scripts/get_device_info.bat Normal file
View File

@ -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