Исходник Выкачка каптчи под любой сервер + сразу можно ее пройти

Начинающий
Статус
Оффлайн
Регистрация
15 Июл 2024
Сообщения
15
Реакции[?]
0
Поинты[?]
0

Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:

  • бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
  • маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
  • приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
  • обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.

Спасибо!

спасибо hutrythtyuh который дал базу, теперь сливаю это вам как нада
Для установки библиотеки прописываем: 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();
});
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
18 Июл 2022
Сообщения
26
Реакции[?]
0
Поинты[?]
0
то что в коде не находит скобочки в некоторых местах так должно быть или это у меня только?
 
Начинающий
Статус
Оффлайн
Регистрация
6 Дек 2023
Сообщения
234
Реакции[?]
2
Поинты[?]
2K
то что в коде не находит скобочки в некоторых местах так должно быть или это у меня только?
хз
govno.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()
      .normalize()
      .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);
 
  });
зафиксил ошибку с SyntaxError: missing ) after argument list
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
18 Июл 2022
Сообщения
26
Реакции[?]
0
Поинты[?]
0
хз
govno.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()
      .normalize()
      .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);

  });
зафиксил ошибку с SyntaxError: missing ) after argument list
у меня такая же ошибка была крсавчик что пофиксил жаль что мне уже чатгпт помог мне пофиксить ошибки
 
Сверху Снизу