102 lines
3.0 KiB
JavaScript
102 lines
3.0 KiB
JavaScript
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);
|
|
}
|
|
})();
|