124 lines
3.2 KiB
JavaScript
124 lines
3.2 KiB
JavaScript
#!/usr/bin/env node
|
|
const WebSocket = require("ws");
|
|
const fs = require("fs");
|
|
|
|
const CDP_URL = process.argv[2];
|
|
const COOKIE_VALUE = "dc4d1551406351a93c09082ea08e2d2e";
|
|
const TARGET_URL = "https://www.nodeseek.com";
|
|
const LOG_FILE = process.env.HOME + "/.openclaw/workspace/scripts/checkin.log";
|
|
|
|
async function sleep(ms) {
|
|
return new Promise(r => setTimeout(r, ms));
|
|
}
|
|
|
|
let msgId = 1;
|
|
function send(ws, method, params = {}, sessionId) {
|
|
return new Promise((resolve, reject) => {
|
|
const id = msgId++;
|
|
const payload = { id, method, params };
|
|
if (sessionId) payload.sessionId = sessionId;
|
|
ws.send(JSON.stringify(payload));
|
|
const handler = (data) => {
|
|
try {
|
|
const msg = JSON.parse(data);
|
|
if (msg.id === id) {
|
|
ws.removeListener("message", handler);
|
|
if (msg.error) reject(msg.error);
|
|
else resolve(msg.result);
|
|
}
|
|
} catch(e) {}
|
|
};
|
|
ws.on("message", handler);
|
|
});
|
|
}
|
|
|
|
async function main() {
|
|
const ws = new WebSocket(CDP_URL);
|
|
|
|
await new Promise((resolve, reject) => {
|
|
ws.on("open", resolve);
|
|
ws.on("error", reject);
|
|
});
|
|
|
|
console.log("Connected to CDP");
|
|
|
|
// 创建新标签页
|
|
const { targetId } = await send(ws, "Target.createTarget", {
|
|
url: "about:blank"
|
|
});
|
|
console.log("Created target:", targetId);
|
|
|
|
// 连接到新标签页
|
|
const { sessionId } = await send(ws, "Target.attachToTarget", {
|
|
targetId,
|
|
flatten: true
|
|
});
|
|
console.log("Attached to target, sessionId:", sessionId);
|
|
|
|
// 设置 cookie
|
|
await send(ws, "Network.setCookie", {
|
|
name: "_nk",
|
|
value: COOKIE_VALUE,
|
|
domain: ".nodeseek.com",
|
|
path: "/"
|
|
}, sessionId);
|
|
console.log("Cookie set");
|
|
|
|
// 启用 Page 域
|
|
await send(ws, "Page.enable", {}, sessionId);
|
|
|
|
// 导航到页面并等待加载
|
|
const loadPromise = new Promise((resolve) => {
|
|
const handler = (data) => {
|
|
try {
|
|
const msg = JSON.parse(data);
|
|
if (msg.method === "Page.loadEventFired") {
|
|
ws.removeListener("message", handler);
|
|
resolve();
|
|
}
|
|
} catch(e) {}
|
|
};
|
|
ws.on("message", handler);
|
|
});
|
|
|
|
await send(ws, "Page.navigate", { url: TARGET_URL }, sessionId);
|
|
console.log("Navigating to:", TARGET_URL);
|
|
|
|
await loadPromise;
|
|
console.log("Page loaded, waiting 8 seconds...");
|
|
|
|
await sleep(8000);
|
|
|
|
// 执行签到
|
|
const result = await send(ws, "Runtime.evaluate", {
|
|
expression: `fetch("/api/attendance", {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify({ random: true })
|
|
}).then(r => r.json())`,
|
|
returnByValue: true,
|
|
awaitPromise: true
|
|
}, sessionId);
|
|
|
|
console.log("Check-in result:", JSON.stringify(result.result?.value || result));
|
|
|
|
// 记录日志
|
|
const logEntry = `[${new Date().toISOString()}] NodeSeek 朦胧签到: ${JSON.stringify(result.result?.value || result)}\n`;
|
|
fs.appendFileSync(LOG_FILE, logEntry);
|
|
console.log("Logged to:", LOG_FILE);
|
|
|
|
// 关闭标签页
|
|
await send(ws, "Target.closeTarget", { targetId });
|
|
console.log("Target closed");
|
|
|
|
ws.close();
|
|
console.log("Done");
|
|
|
|
return result.result?.value || result;
|
|
}
|
|
|
|
main().catch(err => {
|
|
console.error("Error:", err);
|
|
process.exit(1);
|
|
});
|