Files
vps-management-bot/scripts/nodeseek-checkin.js
2026-03-21 01:10:53 +08:00

160 lines
4.2 KiB
JavaScript

#!/usr/bin/env node
const WebSocket = require('ws');
const fs = require('fs');
const path = require('path');
const CDP_URL = 'ws://127.0.0.1:18800/devtools/browser/61ae08b1-1fab-420a-a3df-c5635446065e';
const COOKIE = '_nk=dc4d1551406351a93c09082ea08e2d2e';
const TARGET_URL = 'https://www.nodeseek.com';
const LOG_FILE = path.join(__dirname, 'checkin.log');
let ws;
let sessionId;
let targetId;
let messageId = 1;
function log(msg) {
const timestamp = new Date().toISOString();
const logMsg = `[${timestamp}] ${msg}\n`;
console.log(logMsg.trim());
fs.appendFileSync(LOG_FILE, logMsg);
}
function send(method, params = {}) {
const id = messageId++;
const message = JSON.stringify({ id, method, params, sessionId });
ws.send(message);
return id;
}
function waitForMessage(id) {
return new Promise((resolve) => {
const handler = (data) => {
const msg = JSON.parse(data);
if (msg.id === id) {
ws.removeListener('message', handler);
resolve(msg);
}
};
ws.on('message', handler);
});
}
async function main() {
try {
log('开始 NodeSeek 朦胧签到');
// Connect to CDP
ws = new WebSocket(CDP_URL);
await new Promise((resolve, reject) => {
ws.on('open', resolve);
ws.on('error', reject);
});
log('已连接到 Chrome CDP');
// Create new tab
const createId = send('Target.createTarget', { url: 'about:blank' });
const createResp = await waitForMessage(createId);
targetId = createResp.result.targetId;
log(`创建标签页: ${targetId}`);
// Attach to target
const attachId = send('Target.attachToTarget', { targetId, flatten: true });
const attachResp = await waitForMessage(attachId);
sessionId = attachResp.result.sessionId;
log(`附加到会话: ${sessionId}`);
// Enable necessary domains
send('Network.enable');
send('Page.enable');
send('Runtime.enable');
// Set cookie
const cookieId = send('Network.setCookie', {
name: '_nk',
value: 'dc4d1551406351a93c09082ea08e2d2e',
domain: '.nodeseek.com',
path: '/',
secure: true,
httpOnly: true,
sameSite: 'Lax'
});
await waitForMessage(cookieId);
log('已设置 cookie');
// Navigate to NodeSeek
const navId = send('Page.navigate', { url: TARGET_URL });
await waitForMessage(navId);
log(`导航到 ${TARGET_URL}`);
// Wait for page load
await new Promise((resolve) => {
const handler = (data) => {
const msg = JSON.parse(data);
if (msg.method === 'Page.loadEventFired') {
ws.removeListener('message', handler);
resolve();
}
};
ws.on('message', handler);
});
log('页面加载完成');
// Wait 8 seconds
await new Promise(resolve => setTimeout(resolve, 8000));
log('等待 8 秒后执行签到');
// Execute check-in
const evalId = send('Runtime.evaluate', {
expression: `
fetch('/api/attendance', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ random: true })
})
.then(async r => {
const text = await r.text();
try {
return JSON.stringify(JSON.parse(text));
} catch {
return JSON.stringify({ status: r.status, body: text.substring(0, 200) });
}
})
.catch(e => JSON.stringify({ error: e.message }))
`,
awaitPromise: true,
returnByValue: true
});
const evalResp = await waitForMessage(evalId);
if (evalResp.result && evalResp.result.result) {
const result = evalResp.result.result.value;
log(`签到结果: ${result}`);
} else {
log(`签到失败: ${JSON.stringify(evalResp)}`);
}
// Close tab
const closeId = send('Target.closeTarget', { targetId });
await waitForMessage(closeId);
log('已关闭标签页');
ws.close();
log('NodeSeek 朦胧签到完成');
} catch (error) {
log(`签到出错: ${error.message}`);
if (ws && ws.readyState === WebSocket.OPEN) {
if (targetId) {
send('Target.closeTarget', { targetId });
}
ws.close();
}
process.exit(1);
}
}
main();