| const puppeteer = require('puppeteer');
|
| const axios = require('axios');
|
|
|
|
|
| let telegramConfig;
|
| try {
|
| telegramConfig = JSON.parse(process.env.TELEGRAM_JSON || '{}');
|
| } catch (error) {
|
| console.error('Error parsing TELEGRAM_JSON:', error);
|
| }
|
|
|
| function formatToISO(date) {
|
| return date.toISOString().replace('T', ' ').replace('Z', '').replace(/\.\d{3}Z/, '');
|
| }
|
|
|
| async function delayTime(ms) {
|
| return new Promise(resolve => setTimeout(resolve, ms));
|
| }
|
|
|
| async function sendTelegramMessage(message) {
|
| if (!telegramConfig || !telegramConfig.cloudflareWorkerUrl || !telegramConfig.telegramBotToken || !telegramConfig.telegramBotUserId || !telegramConfig.customAuthKey) {
|
| console.log('Telegram configuration not set or incomplete, skipping notification');
|
| return;
|
| }
|
|
|
| console.log('Attempting to send Telegram message...');
|
| const url = `${telegramConfig.cloudflareWorkerUrl}/${telegramConfig.telegramBotToken}/sendMessage`;
|
| try {
|
| const response = await axios.post(url, {
|
| chat_id: telegramConfig.telegramBotUserId,
|
| text: message
|
| }, {
|
| headers: {
|
| 'X-Custom-Auth': telegramConfig.customAuthKey
|
| }
|
| });
|
| console.log('Telegram notification sent successfully');
|
| } catch (error) {
|
| console.error('Error sending Telegram notification:', error.response ? error.response.data : error.message);
|
| }
|
| }
|
|
|
| async function loginAccount(account, browser) {
|
| const { username, password, panelnum, type } = account;
|
| const page = await browser.newPage();
|
|
|
| let url = type === 'ct8'
|
| ? 'https://panel.ct8.pl/login/?next=/'
|
| : `https://panel${panelnum}.serv00.com/login/?next=/`;
|
|
|
| try {
|
|
|
| await page.setExtraHTTPHeaders({
|
| 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
|
| 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
|
| 'Accept-Language': 'en-US,en;q=0.5',
|
| 'Accept-Encoding': 'gzip, deflate, br',
|
| 'Connection': 'keep-alive',
|
| 'Upgrade-Insecure-Requests': '1',
|
| 'Sec-Fetch-Dest': 'document',
|
| 'Sec-Fetch-Mode': 'navigate',
|
| 'Sec-Fetch-Site': 'none',
|
| 'Sec-Fetch-User': '?1',
|
| 'Cache-Control': 'max-age=0',
|
| });
|
|
|
| await page.goto(url, { waitUntil: 'networkidle0' });
|
|
|
| const usernameInput = await page.$('#id_username');
|
| if (usernameInput) {
|
| await usernameInput.click({ clickCount: 3 });
|
| await usernameInput.press('Backspace');
|
| }
|
|
|
| await page.type('#id_username', username);
|
| await page.type('#id_password', password);
|
|
|
| const loginButton = await page.$('#submit');
|
| if (loginButton) {
|
| await loginButton.click();
|
| } else {
|
| throw new Error('无法找到登录按钮');
|
| }
|
|
|
| await page.waitForNavigation({ timeout: 30000 });
|
|
|
| const isLoggedIn = await page.evaluate(() => {
|
| const logoutButton = document.querySelector('a[href="/logout/"]');
|
| return logoutButton !== null;
|
| });
|
|
|
| const nowUtc = formatToISO(new Date());
|
| const nowBeijing = formatToISO(new Date(new Date().getTime() + 8 * 60 * 60 * 1000));
|
|
|
| if (isLoggedIn) {
|
| const message = `账号 ${username} (${type}) 于北京时间 ${nowBeijing}(UTC时间 ${nowUtc})登录成功!`;
|
| console.log(message);
|
| await sendTelegramMessage(`${type}, [${nowBeijing.split(' ')[1].split('.')[0]}]\n${message}`);
|
| return { success: true, message };
|
| } else {
|
| const message = `账号 ${username} (${type}) 登录失败,请检查账号和密码是否正确。`;
|
| console.error(message);
|
| await sendTelegramMessage(`${type}, [${nowBeijing.split(' ')[1].split('.')[0]}]\n${message}`);
|
| return { success: false, message };
|
| }
|
| } catch (error) {
|
| const message = `账号 ${username} (${type}) 登录时出现错误: ${error}`;
|
| console.error(message);
|
| await sendTelegramMessage(`${type}, [${formatToISO(new Date()).split(' ')[1].split('.')[0]}]\n${message}`);
|
| return { success: false, message };
|
| } finally {
|
| await page.close();
|
| }
|
| }
|
|
|
| (async () => {
|
| const accountsJson = process.env.ACCOUNTS_JSON;
|
| const accounts = JSON.parse(accountsJson);
|
|
|
| const browser = await puppeteer.launch({
|
| headless: true,
|
| args: ['--no-sandbox', '--disable-setuid-sandbox'],
|
| executablePath: '/usr/bin/google-chrome-stable'
|
| });
|
|
|
| const results = [];
|
| for (const account of accounts) {
|
| const result = await loginAccount(account, browser);
|
| results.push({ ...account, ...result });
|
|
|
| const delay = Math.floor(Math.random() * 8000) + 1000;
|
| await delayTime(delay);
|
| }
|
|
|
| await browser.close();
|
|
|
| const successfulLogins = results.filter(r => r.success);
|
| const failedLogins = results.filter(r => !r.success);
|
|
|
|
|
| console.log('\n登录结果汇总:');
|
| console.log('| 账号 | 类型 | 状态 | 消息 |');
|
| console.log('|------|------|------|------|');
|
| results.forEach(({ username, type, success, message }) => {
|
| console.log(`| ${username} | ${type} | ${success ? '成功' : '失败'} | ${message} |`);
|
| });
|
|
|
| let summaryMessage = '\n登录结果统计:\n';
|
| summaryMessage += `成功登录的账号:${successfulLogins.length}\n`;
|
| summaryMessage += `登录失败的账号:${failedLogins.length}\n`;
|
|
|
| if (failedLogins.length > 0) {
|
| summaryMessage += '\n登录失败的账号列表:\n';
|
| failedLogins.forEach(({ username, type }) => {
|
| summaryMessage += `- ${username} (${type})\n`;
|
| });
|
| }
|
|
|
| console.log(summaryMessage);
|
| await sendTelegramMessage(`${accounts[0].type}, [${formatToISO(new Date()).split(' ')[1].split('.')[0]}]\n${summaryMessage}`);
|
| })(); |