Начинающий
-
Автор темы
- #1
Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:
- бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
- маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
- приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
- обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.
Спасибо!
спасибо hutrythtyuh который дал базу, теперь сливаю это вам как нада
Для установки библиотеки прописываем: npm install git+
это говно код (чат лгбт) и да не судите сторого если он будет фигово работать + есть чо та типо решалки каптчи но он не работает кому надо улучшат
Для установки библиотеки прописываем: npm install git+
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
это говно код (чат лгбт) и да не судите сторого если он будет фигово работать + есть чо та типо решалки каптчи но он не работает кому надо улучшат
gavna.js:
'use strict'; // Строгий режим
const { exec } = require('child_process');
const mineflayer = require('mineflayer');
const FlayerCaptcha = require('FlayerCaptcha');
const fs = require('fs');
const sharp = require('sharp');
// Для OCR (опционально). Если не нужно — можете закомментировать использование (см. дальше).
const tesseract = require('tesseract.js');
const { createWorker } = tesseract;
// Readline — ввод команд из консоли.
const readline = require('readline');
// 1) Список имён ботов
const BOT_USERNAMES = ['gavnapio1312']; // Можно добавить ещё: ['Bot1', 'Bot2', ...]
// 2) Настройки сервера
const SERVER_SETTINGS = {
host: 'mc.funtime.su',
port: 25565,
version: '1.16.5',
viewDistance: 'far'
};
// 3) Задержка между запуском каждого бота (мс)
const BOT_LAUNCH_DELAY_MS = 4000;
// 4) Сколько ждём после спавна бота, прежде чем принимать команды (чтобы прогрузился мир и капча)
const TIMEOUT_BEFORE_COMMANDS = 5000;
// 5) Пути к файлам с капчей
const CAPTCHA_RAW_PATH = 'captcha.png';
const CAPTCHA_ENHANCED_PATH = 'captcha-enhanced.png';
// 6) Включить ли OCR через Tesseract.js
const USE_TESSERACT_OCR = false;
// 7) Параметры Tesseract (если USE_TESSERACT_OCR = true)
const TESSERACT_CONFIG = {
lang: 'eng'
// Можно добавить другие опции
};
// 8) Открывать ли окно Electron для капчи
const SHOW_ELECTRON_WINDOW = true;
/****************************************************************************************************
* СОЗДАНИЕ READLINE-ИНТЕРФЕЙСА
****************************************************************************************************/
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// Если readline кто-то закроет — мы это увидим
rl.on('close', () => {
console.log('[READLINE] The readline interface was closed! If this is unexpected, check code for rl.close().');
});
/****************************************************************************************************
[LIST]
[*]ФУНКЦИЯ: promptUser
[*]- Обёртка над rl.question, чтобы возвращать Promise.
[/LIST]
****************************************************************************************************/
function promptUser(queryText) {
return new Promise((resolve) => {
rl.question(queryText, (answer) => {
resolve(answer);
});
});
}
/****************************************************************************************************
[LIST]
[*]ФУНКЦИЯ: enhanceCaptcha
[*]- Улучшает изображение капчи при помощи "sharp" (грейскейл, нормализация, ресайз, threshold).
[/LIST]
****************************************************************************************************/
async function enhanceCaptcha(inputPath, outputPath) {
try {
console.log('[enhanceCaptcha] Start...');
await sharp(inputPath)
.resize({ width: 400 })
.greyscale()
.normalise()
.sharpen()
.threshold(180)
.toFile(outputPath);
console.log('[enhanceCaptcha] Done ->', outputPath);
} catch (err) {
console.error('[enhanceCaptcha] Error:', err);
}
}
/****************************************************************************************************
[LIST]
[*]ФУНКЦИЯ: recognizeCaptchaWithOCR
[*]- Если включен USE_TESSERACT_OCR, пытаемся распознать текст капчи автоматически.
[/LIST]
****************************************************************************************************/
async function recognizeCaptchaWithOCR(imagePath) {
try {
console.log('[OCR] Starting Tesseract recognition...');
const worker = createWorker();
await worker.load();
await worker.loadLanguage(TESSERACT_CONFIG.lang);
await worker.initialize(TESSERACT_CONFIG.lang);
const { data: { text } } = await worker.recognize(imagePath);
await worker.terminate();
// Очищаем пробелы и переносы строк
let cleaned = text.replace(/\s+/g, '').trim();
console.log([ICODE][OCR] Recognized text: "${cleaned}"[/ICODE]);
return cleaned;
} catch (error) {
console.error('[OCR] Error:', error);
return '';
}
}
/****************************************************************************************************
[LIST]
[*]ФУНКЦИЯ: openCaptchaWindow
[*]- Запускает (при помощи exec) окно Electron, которое показывает капчу.
[*]Предполагается, что captchaWindow.js находится рядом и умеет показывать captcha-enhanced.png
[/LIST]
****************************************************************************************************/
function openCaptchaWindow() {
if (!SHOW_ELECTRON_WINDOW) {
console.log('[Electron] Disabled by config, skipping...');
return;
}
console.log('[Electron] Launching captchaWindow.js...');
exec('npx electron captchaWindow.js', (error, stdout, stderr) => {
if (error) {
console.error('[Electron] Error:', error);
return;
}
if (stderr) {
console.error('[Electron] stderr:', stderr);
}
console.log('[Electron] stdout:', stdout);
});
}
/****************************************************************************************************
[LIST]
[*]ФУНКЦИЯ: handleUserCommands
[*]- В бесконечном цикле (рекурсивно) спрашивает команду и отправляет её в чат бота.
[*]- Заодно тут можно парсить и собственные команды, например "tp" и т.д.
[/LIST]
****************************************************************************************************/
function handleUserCommands(bot, username) {
if (rl.closed) {
// Если readline вдруг закрыт — не сможем задать вопрос
console.log([ICODE][${username}] Cannot handle commands because readline is closed.[/ICODE]);
return;
}
rl.question([ICODE][${username}] Enter command: [/ICODE], (command) => {
// Если пользователь ничего не ввёл — повторим
if (!command.trim()) {
return handleUserCommands(bot, username);
}
// Можно сделать свой «парсер» команд, например:
const args = command.split(' ');
if (args[0] === '/tp') {
// Допустим, пользователь хочет телепортироваться:
if (args.length > 1) {
let target = args.slice(1).join(' ');
teleportCommand(bot, target, username);
} else {
console.log([ICODE][${username}] Usage: /tp <target>[/ICODE]);
}
} else {
// Иначе просто шлём команду в чат, как есть
console.log([ICODE][${username}] Sending command: ${command}[/ICODE]);
bot.chat(command);
}
// Рекурсивный вызов, чтобы продолжать принимать команды
handleUserCommands(bot, username);
});
}
/****************************************************************************************************
[LIST]
[*]ФУНКЦИЯ: teleportCommand
[*]- Пример "телепортации" по команде. В реальности зависит от того,
[*]что разрешено на сервере (может быть /tpa, /home, /warp).
[/LIST]
****************************************************************************************************/
function teleportCommand(bot, target, username) {
const command = [ICODE]/tp ${target}[/ICODE];
console.log([ICODE][${username}] Attempting teleport: ${command}[/ICODE]);
bot.chat(command);
}
/****************************************************************************************************
[LIST]
[*]ФУНКЦИЯ: processCaptcha
[*]- Сохранение и улучшение капчи, опциональный OCR, вывод вопроса в консоль, отправка ответа.
[/LIST]
****************************************************************************************************/
async function processCaptcha(image, bot, username) {
console.log([ICODE][${username}] Captcha received! Let's process it...[/ICODE]);
// 1) Сохранение исходной капчи:
await image.toFile(CAPTCHA_RAW_PATH);
console.log([ICODE][${username}] Saved raw captcha to ${CAPTCHA_RAW_PATH}[/ICODE]);
// 2) Улучшение (энхансинг):
await enhanceCaptcha(CAPTCHA_RAW_PATH, CAPTCHA_ENHANCED_PATH);
// 3) Открыть Electron-окно (опционально)
openCaptchaWindow();
// 4) Если включён OCR — пытаемся автоматически распознать:
let autoRecognized = '';
if (USE_TESSERACT_OCR) {
autoRecognized = await recognizeCaptchaWithOCR(CAPTCHA_ENHANCED_PATH);
}
// 5) Просим пользователя вручную ввести капчу
// (если rl уже закрыт, не сможем спросить)
if (rl.closed) {
console.log([ICODE][${username}] readline closed; cannot prompt user for captcha.[/ICODE]);
return;
}
const manual = await promptUser([ICODE][${username}] Enter captcha manually: [/ICODE]);
// 6) Определяем финальный ответ
let finalAnswer = (manual || '').trim();
if (!finalAnswer && autoRecognized) {
finalAnswer = autoRecognized;
console.log([ICODE][${username}] Using OCR result since manual was empty: "${finalAnswer}"[/ICODE]);
}
if (!finalAnswer) {
console.log([ICODE][${username}] No captcha response provided. Skipping...[/ICODE]);
return;
}
// 7) Отправляем капчу на сервер
console.log([ICODE][${username}] Sending captcha: "${finalAnswer}"[/ICODE]);
bot.chat(finalAnswer);
}
async function createBot(username) {
return new Promise((resolve, reject) => {
console.log([ICODE][${username}] Creating bot...[/ICODE]);
// 1) Создаём бота
const bot = mineflayer.createBot({
host: SERVER_SETTINGS.host,
port: SERVER_SETTINGS.port,
username,
version: SERVER_SETTINGS.version,
viewDistance: SERVER_SETTINGS.viewDistance
});
// 2) Подключаем капчу
let captcha = null;
try {
captcha = new FlayerCaptcha(bot);
} catch (err) {
// Если внутри FlayerCaptcha что-то упало (редко, но бывает)
console.error([ICODE][${username}] Failed to initialize FlayerCaptcha:[/ICODE], err);
bot.quit();
return reject(err);
}
// 3) Подстраховка от падения FlayerCaptcha — подписываемся на .on('error')
captcha.on('error', (err) => {
console.error([ICODE][${username}] FlayerCaptcha error: ${err}[/ICODE]);
bot.quit();
return reject(err);
});
// 4) Когда получена капча — обрабатываем
captcha.on('success', async (image) => {
try {
await processCaptcha(image, bot, username);
} catch (processErr) {
console.error([ICODE][${username}] Error in processCaptcha:[/ICODE], processErr);
bot.quit();
return reject(processErr);
}
});
// 5) Логируем все входящие сообщения
bot.on('message', (jsonMsg) => {
const msgString = jsonMsg.toString();
console.log([ICODE][${username}] Chat: ${msgString}[/ICODE]);
});
// 6) Событие: бот заспавнился
bot.on('spawn', () => {
console.log([ICODE][${username}] Bot spawned! Waiting ${TIMEOUT_BEFORE_COMMANDS}ms...[/ICODE]);
setTimeout(() => {
console.log([ICODE][${username}] Ready for commands![/ICODE]);
// Если readline ещё открыт, запускаем цикл команд
if (!rl.closed) {
handleUserCommands(bot, username);
} else {
console.log([ICODE][${username}] Readline is closed, cannot handle commands.[/ICODE]);
}
}, TIMEOUT_BEFORE_COMMANDS);
});
// 7) Событие: бот отключился
bot.on('end', () => {
console.log([ICODE][${username}] Bot disconnected. Quitting this bot instance.[/ICODE]);
bot.quit();
resolve();
});
// 8) Событие: ошибка бота
bot.on('error', (err) => {
console.error([ICODE][${username}] Bot error:[/ICODE], err);
bot.quit();
reject(err);
});
});
}
async function startBots() {
for (let i = 0; i < BOT_USERNAMES.length; i++) {
const currentUsername = BOT_USERNAMES[i];
try {
await createBot(currentUsername);
} catch (err) {
console.error([ICODE][${currentUsername}] Bot crashed or error:[/ICODE], err);
}
// Задержка перед запуском следующего
if (i < BOT_USERNAMES.length - 1) {
console.log([ICODE][startBots] Waiting ${BOT_LAUNCH_DELAY_MS} ms before next bot...[/ICODE]);
await new Promise((res) => setTimeout(res, BOT_LAUNCH_DELAY_MS));
}
}
console.log('[startBots] All bots done or disconnected!');
}
startBots()
.then(() => {
console.log('[GLOBAL] startBots finished. All bots are offline now.');
console.log('[GLOBAL] But the readline is still open — press Ctrl+C to exit if you wish.');
process.stdin.resume();
})
.catch((err) => {
console.error('[GLOBAL] Fatal error during startBots:', err);
});
index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Captcha</title>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
}
#captcha {
max-width: 100%;
height: auto;
}
</style>
</head>
<body>
<img id="captcha" src="" alt="Captcha">
<script>
const { ipcRenderer } = require('electron');
ipcRenderer.send('get-captcha');
ipcRenderer.on('captcha', (event, data) => {
document.getElementById('captcha').src = data;
});
</script>
</body>
</html>
captchaWindow.js:
const { app, BrowserWindow, ipcMain } = require('electron');
const fs = require('fs');
let mainWindow;
app.whenReady().then(() => {
mainWindow = new BrowserWindow({
width: 500,
height: 400,
webPreferences: {
nodeIntegration: true,
contextIsolation: false
}
});
mainWindow.loadFile('index.html');
ipcMain.on('get-captcha', (event) => {
const imagePath = 'captcha-enhanced.png';
const image = fs.readFileSync(imagePath, { encoding: 'base64' });
event.reply('captcha', [ICODE]data:image/png;base64,${image}[/ICODE]);
});
});
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') app.quit();
});
Последнее редактирование: