Developer Опубликовано 20 сентября Поделиться Опубликовано 20 сентября Всем привет! Делюсь скриптом для автоматического удаления всех постов со стены сообщества ВКонтакте. Написан на чистом JavaScript, запускается прямо из консоли браузера — никаких расширений и стороннего софта. Что умеет Удаляет все посты со стены сообщества подряд Пропускает закреплённые посты (можно отключить) Автоматически скроллит ленту, подгружая новые посты Показывает прогресс в консоли: сколько удалено, пропущено, примерное время до завершения Корректно обрабатывает модальные окна подтверждения Имеет защитный потолок (100 000 удалений) и возможность остановки на лету Как использовать Откройте стену сообщества в браузере (vk.com/имя_сообщества) Откройте консоль разработчика: F12 → вкладка Console Вставьте код скрипта и нажмите Enter Скрипт запустится автоматически через 2 секунды — подтвердите начало работы Прогресс будет отображаться в консоли Управление Команда - Действие vkClean() - Запустить удаление vkStop() - Остановить после текущего поста Настройки (опционально) Можно передать параметры при запуске: vkClean({ keepPinned: true, // пропускать закреплённые (по умолчанию true) deleteDelay: 400, // пауза после удаления, мс maxDeletes: 100000, // максимум удалений }) Важные замечания Скрипт работает только на странице стены сообщества, где вы администратор или редактор Не удаляет посты, которые ВК не даёт удалить (например, репосты от имени других сообществ) Если стена не пуста после завершения — просто запустите скрипт ещё раз Рекомендую не трогать вкладку во время работы: ВК может выгружать посты из DOM при потере фокуса Код (async function () { const DEFAULTS = { keepPinned: true, // пропускать закреплённые посты deleteDelay: 400, // пауза после удаления (мс) menuWait: 3000, // таймаут ожидания меню postVanishWait: 3000, // ждать исчезновения поста из DOM scrollStepFraction: 0.7, // шаг скролла при застое maxStuckScrolls: 10, // попыток подтолкнуть скролл maxDeletes: 100000, // защитный потолок batchLogEvery: 10, // логировать каждые N постов }; const sleep = (ms) => new Promise((r) => setTimeout(r, ms)); async function waitFor(test, timeout, interval = 60) { const t0 = performance.now(); while (performance.now() - t0 < timeout) { try { const v = typeof test === 'function' ? test() : document.querySelector(test); if (v) return v; } catch (_) {} await sleep(interval); } return null; } function getAllToggles() { return [...document.querySelectorAll('[data-testid="post_context_menu_toggle"]')]; } function getPostIdForToggle(toggle) { const container = toggle.closest('[class*="vkitFeedPost"]') || toggle.closest('article') || toggle.parentElement; if (!container) return null; const pidEl = container.querySelector('[data-post-id]'); return pidEl ? pidEl.getAttribute('data-post-id') : null; } function findFirstUnseenToggle(seen) { for (const t of getAllToggles()) { const pid = getPostIdForToggle(t); if (!pid || seen.has(pid)) continue; return { toggle: t, postId: pid }; } return null; } function isPinnedMenuOpen() { const items = document.querySelectorAll( '[class*="DropdownActionSheetItem"], [data-testid^="post_context_menu_item_"]' ); for (const it of items) { const t = (it.textContent || '').trim(); if (t === 'Открепить' || t.startsWith('Открепить')) return true; } return false; } function closeMenu() { document.dispatchEvent( new KeyboardEvent('keydown', { key: 'Escape', code: 'Escape', keyCode: 27, bubbles: true, }) ); } async function run(opts = {}) { const cfg = Object.assign({}, DEFAULTS, opts); window.__vkCleanStop = false; const seen = new Set(); const knownPinned = new Set(); let deleted = 0, failed = 0, skippedPinned = 0; const tStart = performance.now(); const ok = confirm( `Удалить все посты со стены?\n\n` + `Закреплённые: ${cfg.keepPinned ? 'пропускать' : 'тоже удалять'}\n` + `Остановка: vkStop() в консоли\n` + `Прогресс в консоли.\n\n` + `Продолжить?` ); if (!ok) { console.log('[vk-clean] отменено пользователем'); return; } window.scrollTo(0, 0); await sleep(500); let stuckScrolls = 0; let lastProgressAt = Date.now(); while (!window.__vkCleanStop && deleted < cfg.maxDeletes) { let next = findFirstUnseenToggle(seen); if (!next) { // Ничего нового — скроллим вниз const beforeIds = new Set( [...document.querySelectorAll('[data-post-id]')].map(e => e.getAttribute('data-post-id')) ); window.scrollBy(0, Math.round(window.innerHeight * cfg.scrollStepFraction)); await sleep(700); const afterIds = new Set( [...document.querySelectorAll('[data-post-id]')].map(e => e.getAttribute('data-post-id')) ); const appeared = [...afterIds].some(id => !beforeIds.has(id)); next = findFirstUnseenToggle(seen); if (!next) { stuckScrolls = appeared ? 0 : stuckScrolls + 1; if (stuckScrolls >= cfg.maxStuckScrolls) { // Последняя попытка — на самый низ window.scrollTo(0, document.documentElement.scrollHeight); await sleep(900); window.scrollTo(0, 0); await sleep(700); next = findFirstUnseenToggle(seen); if (!next) { console.log('[vk-clean] все посты обработаны. Завершение.'); break; } } continue; } } stuckScrolls = 0; const { toggle, postId } = next; // Центрируем пост в viewport, чтобы ВК его не выгрузил из DOM try { toggle.scrollIntoView({ block: 'center', behavior: 'instant' }); } catch (_) { toggle.scrollIntoView({ block: 'center' }); } await sleep(180); // Открываем меню toggle.click(); const deleteItem = await waitFor( '[data-testid="post_context_menu_item_delete"]', cfg.menuWait ); if (!deleteItem) { closeMenu(); seen.add(postId); failed++; console.warn(`[vk-clean] нет кнопки удаления для ${postId}`); await sleep(200); continue; } // Пропуск закрепа if (cfg.keepPinned && isPinnedMenuOpen()) { seen.add(postId); knownPinned.add(postId); skippedPinned++; closeMenu(); console.log(`[vk-clean] пропущен закреп ${postId}`); const el = document.querySelector(`[data-post-id="${postId}"]`); if (el) { const r = el.getBoundingClientRect(); window.scrollBy(0, Math.max(r.bottom - 40, window.innerHeight * 0.3)); await sleep(400); } continue; } // УДАЛЯЕМ deleteItem.click(); // На случай модального подтверждения const confirmBtn = await waitFor( '[data-testid="modal_confirm_button"], .vkuiModalCard button[mode="primary"]', 500 ); if (confirmBtn && /Удал/i.test(confirmBtn.textContent || '')) confirmBtn.click(); // Ждём исчезновения поста await waitFor(() => { const el = document.querySelector(`[data-post-id="${postId}"]`); if (!el) return true; const txt = (el.closest('[class*="vkitFeedPost"]')?.textContent || ''); return /Пост удалён|Post deleted/i.test(txt); }, cfg.postVanishWait); deleted++; seen.add(postId); lastProgressAt = Date.now(); // Периодический лог if (deleted % cfg.batchLogEvery === 0) { const elapsed = performance.now() - tStart; const perPost = elapsed / Math.max(1, deleted + failed); const eta = (perPost * (cfg.maxDeletes - deleted)) / 1000; console.log( `%c[vk-clean] ✅ удалено=${deleted} | пропущено=${failed} | закрепов=${skippedPinned} | ` + `~${(perPost/1000).toFixed(2)}с/пост | ETA: ${formatETA(eta)}`, 'color:#0a0;font-weight:bold' ); } await sleep(cfg.deleteDelay); } const elapsed = ((performance.now() - tStart) / 1000).toFixed(1); console.log( `%c[vk-clean] ГОТОВО\n` + `Удалено: ${deleted}\n` + `Пропущено: ${failed}\n` + `Закрепов: ${skippedPinned}\n` + `Время: ${elapsed} сек`, 'color:#0a0;font-weight:bold;font-size:14px' ); alert( `Готово!\n\n` + `Удалено: ${deleted}\n` + `Пропущено: ${failed}\n` + `Закрепов: ${skippedPinned}\n` + `Время: ${elapsed} сек\n\n` + `Если стена не пуста — запустите скрипт снова.` ); } function formatETA(seconds) { if (!isFinite(seconds) || seconds <= 0) return '?'; const s = Math.round(seconds); if (s < 60) return `${s}s`; const m = Math.floor(s / 60); const r = s % 60; return `${m}m${r.toString().padStart(2, '0')}s`; } // Регистрируем функции управления window.vkClean = run; window.vkStop = () => { window.__vkCleanStop = true; console.log('%c[vk-clean] ⛔ остановка запрошена. Дождитесь завершения текущего поста.', 'color:#c00;font-weight:bold'); }; console.log( '%c[vk-clean v3] загружен.\n\n' + 'Запуск удаления: vkClean()\n' + 'Остановка: vkStop()\n\n' + 'Автозапуск через 2 секунды...', 'color:#69c;font-weight:bold;font-size:13px' ); // Автостарт через 2 секунды setTimeout(() => run(), 2000); })(); Проверено на актуальной версии ВК (2026). Если что-то перестанет работать — пишите в тему, буду обновлять. Поставь LIKE! Если помог)) LinkBoost .RU - Cервис для монетизации трафика Зарабатывай на продаже рекламных ссылок, и баннеров Ссылка на комментарий https://xezzy.ru/topic/802-skript-dlya-massovogo-udaleniya-postov-so-steny-soobschestva-vk-2026/ Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти