Files
vps-management-bot/scripts/nodeseek-checkin.cron.mjs

153 lines
3.9 KiB
JavaScript
Raw Normal View History

2026-03-21 01:10:53 +08:00
import WebSocket from 'ws';
import { appendFileSync } from 'fs';
const CDP_BASE = 'http://127.0.0.1:18800';
const COOKIE = 'dc4d1551406351a93c09082ea08e2d2e';
const TARGET_URL = 'https://www.nodeseek.com';
const LOG_FILE = process.env.HOME + '/.openclaw/workspace/scripts/checkin.log';
let ws;
let msgId = 0;
let pending = new Map();
let targetId;
let sessionId;
function log(msg) {
const timestamp = new Date().toISOString();
const line = `[${timestamp}] ${msg}\n`;
console.log(line.trim());
appendFileSync(LOG_FILE, line);
}
async function getBrowserWsUrl() {
const resp = await fetch(`${CDP_BASE}/json/version`);
const data = await resp.json();
return data.webSocketDebuggerUrl;
}
function send(method, params = {}) {
return new Promise((resolve, reject) => {
const id = ++msgId;
const msg = { id, method, params };
if (sessionId) msg.sessionId = sessionId;
pending.set(id, { resolve, reject });
ws.send(JSON.stringify(msg));
// 10秒超时
setTimeout(() => {
if (pending.has(id)) {
pending.delete(id);
reject(new Error(`Timeout waiting for ${method}`));
}
}, 10000);
});
}
async function main() {
try {
log('开始 NodeSeek 朦胧账号签到...');
// 获取 CDP WebSocket URL
const wsUrl = await getBrowserWsUrl();
log(`CDP URL: ${wsUrl}`);
// 连接 CDP
ws = new WebSocket(wsUrl);
// 处理所有消息
ws.on('message', (data) => {
const msg = JSON.parse(data);
// 处理命令响应
if (msg.id !== undefined && pending.has(msg.id)) {
const { resolve, reject } = pending.get(msg.id);
pending.delete(msg.id);
if (msg.error) reject(msg.error);
else resolve(msg.result);
}
});
await new Promise((resolve, reject) => {
ws.on('open', resolve);
ws.on('error', reject);
});
log('CDP 连接成功');
// 创建新标签页
const target = await send('Target.createTarget', { url: 'about:blank' });
targetId = target.targetId;
log(`创建标签页: ${targetId}`);
// 附着到标签页
const session = await send('Target.attachToTarget', { targetId, flatten: true });
sessionId = session.sessionId;
log(`附着到会话: ${sessionId}`);
// 启用必要域
await send('Page.enable');
await send('Runtime.enable');
await send('Network.enable');
log('启用域成功');
// 设置 cookie
await send('Network.setCookie', {
name: '_nk',
value: COOKIE,
domain: '.nodeseek.com',
path: '/'
});
log('Cookie 设置成功');
// 设置页面加载监听
const loadPromise = new Promise(resolve => {
ws.on('message', (data) => {
const msg = JSON.parse(data);
if (msg.method === 'Page.loadEventFired') {
resolve();
}
});
});
// 导航
await send('Page.navigate', { url: TARGET_URL });
log(`导航到 ${TARGET_URL}`);
await loadPromise;
log('页面加载完成');
// 等待 8 秒
await new Promise(r => setTimeout(r, 8000));
log('等待 8 秒完成');
// 执行签到
const result = await send('Runtime.evaluate', {
expression: `fetch('/api/attendance',{
method:'POST',
headers:{'Content-Type':'application/json'},
body:JSON.stringify({random:true})
}).then(r=>r.json()).catch(e=>({error:e.message}))`,
returnByValue: true,
awaitPromise: true
});
const signResult = result.result?.value;
log(`签到结果: ${JSON.stringify(signResult)}`);
// 关闭标签页
await send('Target.closeTarget', { targetId });
log('标签页已关闭');
ws.close();
log('签到完成');
return signResult;
} catch (err) {
log(`错误: ${err.message}`);
if (ws) ws.close();
throw err;
}
}
main().catch(() => process.exit(1));