Files
vps-management-bot/scripts/checkin-cdp.mjs

102 lines
3.0 KiB
JavaScript
Raw Normal View History

2026-03-21 01:10:53 +08:00
import fs from 'fs';
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
const WebSocket = require('ws');
const LOG = '/Users/jianzhang/.openclaw/workspace/scripts/checkin.log';
const ts = new Date().toISOString();
(async () => {
try {
const verRes = await fetch('http://127.0.0.1:18800/json/version');
const ver = await verRes.json();
const wsUrl = ver.webSocketDebuggerUrl;
if (!wsUrl) throw new Error('No webSocketDebuggerUrl');
const ws = new WebSocket(wsUrl);
let id = 1;
const pending = new Map();
ws.on('message', d => {
const m = JSON.parse(d);
if (m.id && pending.has(m.id)) { pending.get(m.id)(m); pending.delete(m.id); }
});
const send = (method, params = {}) => new Promise(r => {
const i = id++;
pending.set(i, r);
ws.send(JSON.stringify({ id: i, method, params }));
});
await new Promise(r => ws.on('open', r));
// Create new tab
const target = await send('Target.createTarget', { url: 'about:blank' });
const targetId = target.result.targetId;
// Attach
const sess = await send('Target.attachToTarget', { targetId, flatten: true });
const sessionId = sess.result.sessionId;
const sendS = (method, params = {}) => new Promise(r => {
const i = id++;
pending.set(i, r);
ws.send(JSON.stringify({ id: i, method, params, sessionId }));
});
await sendS('Network.enable');
await sendS('Page.enable');
// Set cookie
await sendS('Network.setCookie', {
name: '_nk',
value: 'dc4d1551406351a93c09082ea08e2d2e',
domain: '.nodeseek.com',
path: '/',
httpOnly: true,
secure: true
});
// Navigate
await sendS('Page.navigate', { url: 'https://www.nodeseek.com' });
// Wait for page load
await new Promise(r => {
const handler = d => {
const m = JSON.parse(d);
if (m.method === 'Page.loadEventFired') { ws.removeListener('message', handler); r(); }
};
ws.on('message', handler);
});
// Wait 8s
await new Promise(r => setTimeout(r, 8000));
// Call attendance API
await sendS('Runtime.enable');
const result = await sendS('Runtime.evaluate', {
expression: `(async () => {
const res = await fetch('/api/attendance', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ random: true })
});
return await res.text();
})()`,
awaitPromise: true,
returnByValue: true
});
const val = result.result?.result?.value || JSON.stringify(result.result);
const logMsg = `[${ts}] NodeSeek 签到: ${val}\n`;
fs.appendFileSync(LOG, logMsg);
console.log('签到结果:', val);
// Close tab
await send('Target.closeTarget', { targetId });
ws.close();
} catch (e) {
const logMsg = `[${ts}] 签到失败: ${e.message}\n`;
fs.appendFileSync(LOG, logMsg);
console.error('失败:', e.message);
}
})();