Rename to hkt.sh
This commit is contained in:
159
scripts/nodeseek-checkin.js
Normal file
159
scripts/nodeseek-checkin.js
Normal file
@@ -0,0 +1,159 @@
|
||||
#!/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();
|
||||
Reference in New Issue
Block a user