BOT2 / aternos-starter.js
abdulader's picture
Upload 5 files
55e1213 verified
Raw
History Blame Contribute Delete
9.02 kB
'use strict';
try { require('dotenv').config(); } catch (_) {}
/**
* ╔══════════════════════════════════════════════════════════════════════╗
* aternos-starter.js — v16.0 | تشغيل Aternos تلقائياً
* ╠══════════════════════════════════════════════════════════════════════╣
* يُستدعى من bot-team.js عند DeepSleep (ECONNREFUSED × 3)
*
* متغيرات البيئة:
* ATERNOS_USER — اسم المستخدم
* ATERNOS_PASS — كلمة المرور
* ATERNOS_SERVER — اسم السيرفر (اختياري)
*
* ملاحظة: لا يعمل في HuggingFace (لا يوجد Chrome)
* يعمل على VPS / محلياً
* ╚══════════════════════════════════════════════════════════════════════╝
*/
const ATERNOS_USER = process.env.ATERNOS_USER || '';
const ATERNOS_PASS = process.env.ATERNOS_PASS || '';
const ATERNOS_SERVER = process.env.ATERNOS_SERVER || '';
const TOTAL_TIMEOUT = 9 * 60000;
const ONLINE_TIMEOUT = 6 * 60000;
const sleep = ms => new Promise(r => setTimeout(r, Math.max(0, ms)));
const randInt = (a, b) => Math.floor(Math.random() * (b - a + 1)) + a;
function log(emoji, msg) {
const ts = new Date().toISOString().replace('T', ' ').slice(0, 19);
console.log(`[${ts}] [ATERNOS] ${emoji} ${msg}`);
}
async function humanType(page, selector, text) {
await page.focus(selector);
for (const ch of text) {
await page.keyboard.type(ch, { delay: randInt(60, 180) });
if (Math.random() < 0.08) await sleep(randInt(100, 400));
}
}
async function loadPuppeteer() {
try {
const p = require('puppeteer');
log('📦', 'puppeteer محلي');
return { puppeteer: p };
} catch (_) {}
try {
const p = require('puppeteer-core');
const ch = require('@sparticuz/chromium');
log('📦', 'puppeteer-core + @sparticuz/chromium');
return {
puppeteer: p,
executablePath: await ch.executablePath(),
args: ch.args,
defaultViewport: ch.defaultViewport,
};
} catch (_) {}
return null;
}
async function getServerStatus(page) {
try {
return await page.evaluate(() => {
const sels = [
'.server-status','.status','[class*="status"]',
'#server-status','.statuslabel','.label',
];
for (const sel of sels) {
const el = document.querySelector(sel);
if (el) {
const t = el.textContent?.trim().toLowerCase() || '';
if (t.includes('online')) return 'online';
if (t.includes('offline')) return 'offline';
if (t.includes('starting') || t.includes('loading')) return 'starting';
if (t.includes('stopping')) return 'stopping';
}
}
const btn = document.querySelector('.btn-success, [class*="start"]');
if (btn) return 'offline';
return 'unknown';
});
} catch (_) { return 'unknown'; }
}
async function clickStart(page) {
try {
const btns = [
'.btn-success','.start-btn','[class*="start"]',
'button[class*="start"]','#start',
];
for (const sel of btns) {
const btn = await page.$(sel);
if (btn) { await btn.click(); return true; }
}
return false;
} catch (_) { return false; }
}
async function main() {
if (!ATERNOS_USER || !ATERNOS_PASS) {
log('⚠️', 'ATERNOS_USER / ATERNOS_PASS غير مضبوطان — تخطي');
log('💡', 'أضف ATERNOS_USER و ATERNOS_PASS في Settings → Variables');
process.exit(1);
}
const lib = await loadPuppeteer();
if (!lib) {
log('❌', 'puppeteer غير متاح في هذه البيئة');
log('💡', 'في HuggingFace: شغّل السيرفر يدوياً من لوحة Aternos');
process.exit(1);
}
const { puppeteer, executablePath, args, defaultViewport } = lib;
log('🌐', `تسجيل دخول | مستخدم: ${ATERNOS_USER}`);
let browser = null;
const timer = setTimeout(() => {
log('⏱️', 'انتهت المهلة الإجمالية (9 دقائق)');
try { browser?.close(); } catch (_) {}
process.exit(2);
}, TOTAL_TIMEOUT);
try {
browser = await puppeteer.launch({
headless: 'new',
args: args || [
'--no-sandbox','--disable-setuid-sandbox','--disable-dev-shm-usage',
'--disable-gpu','--no-first-run','--no-zygote','--single-process',
'--disable-extensions','--disable-background-networking',
],
defaultViewport: defaultViewport || { width: 1280, height: 720 },
...(executablePath ? { executablePath } : {}),
});
const page = await browser.newPage();
await page.setUserAgent(
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36'
);
await page.setExtraHTTPHeaders({ 'Accept-Language': 'en-US,en;q=0.9' });
log('🔗', 'الانتقال إلى aternos.org...');
await page.goto('https://aternos.org/go/', { waitUntil: 'networkidle2', timeout: 30000 });
log('🔑', 'ملء بيانات الدخول...');
await page.waitForSelector('#user', { timeout: 15000 });
await humanType(page, '#user', ATERNOS_USER);
await sleep(randInt(400, 900));
await humanType(page, '#password', ATERNOS_PASS);
await sleep(randInt(300, 700));
await page.click('.login-button, [data-id="login"], button[type="submit"]');
log('⏳', 'انتظار تسجيل الدخول...');
await page.waitForNavigation({ waitUntil: 'networkidle2', timeout: 20000 }).catch(() => {});
await sleep(randInt(1500, 3000));
log('🔗', 'صفحة السيرفرات...');
await page.goto('https://aternos.org/servers/', { waitUntil: 'networkidle2', timeout: 20000 })
.catch(() => page.goto('https://aternos.org/panel/', { waitUntil: 'networkidle2', timeout: 20000 }).catch(() => {}));
await sleep(randInt(1000, 2500));
if (ATERNOS_SERVER) {
log('🖱️', `البحث عن: ${ATERNOS_SERVER}`);
try {
const links = await page.$$('.server-name,.server .name,[class*="server"]');
for (const link of links) {
const text = await page.evaluate(el => el.textContent?.trim(), link);
if (text?.toLowerCase().includes(ATERNOS_SERVER.toLowerCase())) {
await link.click();
log('✅', `اختيار: ${text}`);
await sleep(randInt(1500, 3000));
break;
}
}
} catch (_) {}
} else {
try {
const first = await page.$('.server,.server-card,[class*="server-item"]');
if (first) { await first.click(); await sleep(randInt(1500, 3000)); }
} catch (_) {}
}
const url = page.url();
if (!url.includes('/server/')) {
await page.goto('https://aternos.org/server/', { waitUntil: 'networkidle2', timeout: 20000 }).catch(() => {});
await sleep(randInt(1000, 2000));
}
log('🔍', 'فحص حالة السيرفر...');
let status = await getServerStatus(page);
log('📊', `الحالة: ${status}`);
if (status === 'online') {
log('✅', 'السيرفر يعمل بالفعل!');
clearTimeout(timer);
await browser.close();
process.exit(0);
}
if (status === 'offline' || status === 'unknown') {
const clicked = await clickStart(page);
log(clicked ? '✅' : '⚠️', clicked ? 'تم النقر على Start' : 'لم يُعثر على زر Start');
}
log('⏳', `انتظار Online (مهلة: ${Math.round(ONLINE_TIMEOUT / 60000)} دقائق)...`);
const start = Date.now();
let last = '';
while (Date.now() - start < ONLINE_TIMEOUT) {
await sleep(15000);
await page.reload({ waitUntil: 'networkidle2', timeout: 15000 }).catch(() => {});
await sleep(2000);
status = await getServerStatus(page);
if (status !== last) { log('📊', `الحالة: ${status}`); last = status; }
if (status === 'online') {
log('🎉', '✅ السيرفر Online! البوتات ستتصل قريباً');
clearTimeout(timer);
await browser.close();
process.exit(0);
}
if (status === 'offline') {
log('🔄', 'لا يزال Offline — محاولة Start مرة أخرى...');
await clickStart(page);
}
}
log('⏱️', 'انتهت مهلة الانتظار — السيرفر لم يبدأ');
clearTimeout(timer);
await browser.close();
process.exit(2);
} catch (err) {
log('❌', `خطأ: ${err.message}`);
clearTimeout(timer);
try { browser?.close(); } catch (_) {}
process.exit(1);
}
}
main();