Начинающий
- Статус
- Оффлайн
- Регистрация
- 5 Ноя 2022
- Сообщения
- 71
- Реакции
- 0
- Выберите загрузчик игры
- Прочие моды
Прку всем друзьяшкам
Работающий парсер фт
Очередной бот от меня по парсингу ников на фт сколько там их уже развелось
ВООБЩЕМ
скриптик создает файл collected_block.txt тама все ники которые будут пропущены при парсинге и вообще не будут собираться
а так же скриптик по дням распределяет ники тоесть включили 8 числа прошло 3 дня и у вас 3 файлика .txt с никами в столбик
Так же для удобства можете почистить мусорные строки 69-86 и связанные с ними они тупо для вывода статистики в тг боте
Есть списочек анархий по который бот ходит его указываем сами (руки не дошли автоматически все это сделать лень было)
Да а решение каптчи у меня локально моделью yolov11 (точность +-90%) если и она вам нужна сделаю пост или по запросу в личке писать в тг @lv0xn
код
Работающий парсер фт
Очередной бот от меня по парсингу ников на фт сколько там их уже развелось
ВООБЩЕМ
скриптик создает файл collected_block.txt тама все ники которые будут пропущены при парсинге и вообще не будут собираться
а так же скриптик по дням распределяет ники тоесть включили 8 числа прошло 3 дня и у вас 3 файлика .txt с никами в столбик
Так же для удобства можете почистить мусорные строки 69-86 и связанные с ними они тупо для вывода статистики в тг боте
Есть списочек анархий по который бот ходит его указываем сами (руки не дошли автоматически все это сделать лень было)
Да а решение каптчи у меня локально моделью yolov11 (точность +-90%) если и она вам нужна сделаю пост или по запросу в личке писать в тг @lv0xn
код
JavaScript:
const mineflayer = require('mineflayer');
const FlayerCaptcha = require('flayercaptcha');
const axios = require('axios');
const fs = require('fs');
const path = require('path');
const FormData = require('form-data');
const chalk = require('chalk');
const STATE_FILE = path.join(__dirname, 'stats_state.json');
function updateJSStats(count) {
try {
let state = { js_collected: 0 };
if (fs.existsSync(STATE_FILE)) {
state = JSON.parse(fs.readFileSync(STATE_FILE, 'utf-8'));
}
state.js_collected = (state.js_collected || 0) + count;
fs.writeFileSync(STATE_FILE, JSON.stringify(state, null, 4));
} catch (e) {
console.error('Ошибка обновления статистики JS:', e.message);
}
}
const ANARCHY_LIST = [
...Array.from({ length: 109 - 102 + 1 }, (_, i) => 102 + i),
...Array.from({ length: 223 - 203 + 1 }, (_, i) => 203 + i),
...Array.from({ length: 312 - 302 + 1 }, (_, i) => 302 + i),
...Array.from({ length: 508 - 502 + 1 }, (_, i) => 502 + i),
602
];
const BLACKLIST_FILE = path.join(__dirname, 'collected_block.txt');
const QUEUE_DIR = path.join(__dirname, 'nicks_queue');
function ensureDirExists(dirPath) {
if (!fs.existsSync(dirPath)) {
fs.mkdirSync(dirPath, { recursive: true });
}
}
ensureDirExists(QUEUE_DIR);
function getTodayFileName() {
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
return `${year}-${month}-${day}.txt`;
}
function loadBlacklist() {
if (!fs.existsSync(BLACKLIST_FILE)) return new Set();
const content = fs.readFileSync(BLACKLIST_FILE, 'utf-8');
return new Set(content.split('\n').map(line => line.trim()).filter(line => line));
}
function saveToBlacklist(nicks) {
const content = Array.from(nicks).join('\n') + '\n';
fs.appendFileSync(BLACKLIST_FILE, content);
}
function saveToDaily(nicks) {
const fileName = path.join(__dirname, getTodayFileName());
const content = Array.from(nicks).join('\n') + '\n';
fs.appendFileSync(fileName, content);
}
function addToPythonQueue(nicks) {
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
const dateStr = `${year}-${month}-${day}`;
nicks.forEach(nick => {
const filePath = path.join(QUEUE_DIR, `${dateStr}___${nick}.txt`);
if (!fs.existsSync(filePath)) {
try {
fs.writeFileSync(filePath, '');
} catch (e) {
console.error(`Ошибка записи в очередь для ${nick}:`, e.message);
}
}
});
}
async function solveCaptchaAPI(imagePath) {
try {
const formData = new FormData();
formData.append('file', fs.createReadStream(imagePath));
const response = await axios.post('http://localhost:5000/solve', formData, {
headers: {
...formData.getHeaders(),
},
});
if (response.data && response.data.result) {
return response.data.result;
}
return null;
} catch (e) {
console.error('Ошибка при обращении к API серверу капчи:', e.message);
return null;
}
}
let currentAnarchyIndex = 0;
let isCollecting = false;
let totalCollectedCount = 0;
let blacklist = loadBlacklist();
let activeTimeouts = [];
function clearAllTimeouts() {
activeTimeouts.forEach(t => clearTimeout(t));
activeTimeouts = [];
}
function setTrackedTimeout(fn, delay) {
const t = setTimeout(() => {
activeTimeouts = activeTimeouts.filter(timeout => timeout !== t);
fn();
}, delay);
activeTimeouts.push(t);
return t;
}
let currentBot = null;
function start_bot() {
const user_name = "ник ботика";
clearAllTimeouts();
if (currentBot) {
try {
currentBot.quit();
currentBot.removeAllListeners();
} catch (e) {}
}
const log = (...args) => {
const time = chalk.gray(new Date().toLocaleTimeString('ru-RU', { hour12: false }));
const prefix = chalk.cyan(`[${user_name}]`);
console.log(`[${time}] ${prefix}`, ...args);
};
const botOptions = {
host: 'mc.funtime.su',
port: 25565,
username: user_name,
version: '1.20.1'
};
let bot = mineflayer.createBot(botOptions);
currentBot = bot;
let isWaitingForSpawn = false;
let collectionTimeout = null;
log('Старт бота:', user_name);
const goToNextAnarchy = () => {
if (isSolvingCaptcha) {
log(chalk.yellow('Попытка перехода на другую анархию во время решения капчи проигнорирована.'));
return;
}
if (currentAnarchyIndex >= ANARCHY_LIST.length) {
log(chalk.blue(`Все анархии пройдены. Начинаю заново через 60 секунд...`));
isCollecting = false;
setTrackedTimeout(() => {
isCollecting = true;
currentAnarchyIndex = 0;
goToNextAnarchy();
}, 60000);
return;
}
const anarchyNum = ANARCHY_LIST[currentAnarchyIndex];
log(chalk.magenta(`Перехожу на Анархию ${anarchyNum} (${currentAnarchyIndex + 1}/${ANARCHY_LIST.length}).`) + chalk.yellow(` Ожидаю 3 секунды для сбора ников...`));
isWaitingForSpawn = true;
bot.chat(`/an${anarchyNum}`);
};
const collectNicks = () => {
collectionTimeout = null;
if (!bot.players) return;
const players = Object.keys(bot.players);
const newNicks = [];
players.forEach(nick => {
if (!blacklist.has(nick)) {
newNicks.push(nick);
blacklist.add(nick);
}
});
if (newNicks.length > 0) {
saveToBlacklist(newNicks);
saveToDaily(newNicks);
addToPythonQueue(newNicks);
totalCollectedCount += newNicks.length;
updateJSStats(newNicks.length);
log(chalk.green(`Собрано новых ников: ${newNicks.length}`) + `. Всего за сессию: ` + chalk.bold(totalCollectedCount));
} else {
log(chalk.gray('Новых ников не найдено'));
}
currentAnarchyIndex++;
setTrackedTimeout(goToNextAnarchy, 1000);
};
bot.on('spawn', () => {
if (!isCollecting) {
log('Бот заспавнился (в лобби)');
return;
}
if (isWaitingForSpawn) {
if (isSolvingCaptcha) {
log(chalk.yellow('Спавн произошел во время решения капчи. Жду...'));
return;
}
isWaitingForSpawn = false;
log(chalk.cyan('Бот заспавнился на анархии. Ожидаю 3 секунды для сбора ников...'));
if (collectionTimeout) {
clearTimeout(collectionTimeout);
activeTimeouts = activeTimeouts.filter(t => t !== collectionTimeout);
}
collectionTimeout = setTrackedTimeout(collectNicks, 3000);
}
});
const captcha = new FlayerCaptcha(bot);
let isSolvingCaptcha = false;
captcha.on('imageReady', async ({ data, image }) => {
if (isSolvingCaptcha) return;
if (data.facing !== 'forward') return;
isSolvingCaptcha = true;
captcha.stop();
const tempDir = path.join(__dirname, 'temp_images');
ensureDirExists(tempDir);
const imagePath = path.join(tempDir, `captcha_${Date.now()}.png`);
try {
await new Promise(r => setTimeout(r, 500));
const buffer = await image.toBuffer();
fs.writeFileSync(imagePath, buffer);
log('Решение капчи через API сервер...');
const solved = await solveCaptchaAPI(imagePath);
if (solved) {
log(chalk.green(`Распознанные цифры: ${solved}`));
bot.chat(solved);
setTrackedTimeout(() => {
isSolvingCaptcha = false;
captcha.resume();
if (isCollecting) {
log(chalk.yellow('Возобновляю сбор после капчи...'));
goToNextAnarchy();
}
}, 5000);
} else {
log(chalk.red('Не удалось решить капчу через API'));
isSolvingCaptcha = false;
captcha.resume();
if (isCollecting) {
log(chalk.yellow('Возобновляю сбор после неудачной капчи...'));
goToNextAnarchy();
}
}
} catch (error) {
log('Ошибка распознавания капчи:', error.message);
isSolvingCaptcha = false;
captcha.resume();
} finally {
if (fs.existsSync(imagePath)) {
try { fs.unlinkSync(imagePath); } catch (e) {}
}
}
});
bot.on('message', async (message) => {
const msgStr = String(message);
if (msgStr.includes('** ! Внимание !')) {
log('Начинаю сбор ников');
isCollecting = true;
currentAnarchyIndex = 0;
goToNextAnarchy();
}
if (msgStr.includes('/login')) {
log('Авторизация...')
await bot.chat('/l пасс твоего ботика');
}
if (msgStr.includes('Сервер заполнен')) {
log('Сервер заполнен, перехожу к следующей анархии');
currentAnarchyIndex++;
setTrackedTimeout(goToNextAnarchy, 2000);
}
});
bot.on('kicked', (res) => {
const reason = JSON.stringify(res);
log('Кик с сервера:', reason);
});
bot.on('error', (err) => {
log('Ошибка бота:', err.message);
});
bot.on('end', () => {
log('Соединение закрыто. Перезапуск через 10 сек...');
clearAllTimeouts();
setTimeout(start_bot, 10000);
});
}
process.on('unhandledRejection', (reason) => {
console.error('Unhandled Rejection:', reason);
});
process.on('uncaughtException', (err) => {
console.error('Uncaught Exception:', err);
});
start_bot();