153 lines
3.9 KiB
JavaScript
153 lines
3.9 KiB
JavaScript
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));
|