Лайфхакер
Лайфхакер
Лучшее
Рубрики
Рецепты
Подкасты
Сервисы
Колонки
Лучшее
Рубрики
Рецепты
Подкасты
Сервисы
Колонки
Выгодные покупки
Новости
Здоровье
Спорт и фитнес
Покупки
Технологии
Отношения
Кино
Реклама
Работа и учёба
1 июня 2015

Секреты деловой email-переписки

Представляем вам статью Артёма Туровца о системе организации деловой переписки. Это не набор «суперметодик повышения продуктивности», не лекция по email-маркетингу. Артём просто поделится опытом своей компании, где постарались настроить работу с электронной почтой так, чтобы всем было удобно.
Фото автора Настя Радужная
Настя Радужная

Автор Лайфхакера

Секреты деловой email-переписки

Что такое электронная почта? В современном деловом мире это:

  • Ваше лицо. Именно с помощью email можно создать положительный образ в глазах контрагента или испортить первое впечатление.
  • Ваш рабочий инструмент. Очень много общения с внешним миром происходит по email. Поэтому, хорошо владея этим инструментом, можно здорово облегчить себе жизнь.
  • Мощный отвлекающий фактор. Внешний мир пытается достать вас, отвлечь и сбить с верного пути через email.

С этих позиций и посмотрим на работу с электронной почтой. Начнём с простого.

Оформление письма

Я пользуюсь почтовым клиентом Mozilla Thunderbird, поэтому буду рассказывать на его примере. Создадим новое письмо и пойдём сверху вниз по списку полей.

Кому. Копия. Скрытая копия

Возможно, кто-то не знает, но «Кому» в Mozilla можно изменить на «Копия» или «Скрытая копия».

Mozilla Thunderbird
  • Кому: пишем основного адресата или несколько адресатов через точку с запятой.
  • Копия: пишем того, кто должен ознакомиться с письмом, но от кого мы не ждём реакции.
  • Скрытая копия: пишем того, кто должен ознакомиться с письмом, но должен остаться неизвестным для остальных получателей письма. Особенно уместно использовать для массовых рассылок деловых писем, например уведомлений.

Неправильно в массовой рассылке указывать получателей через поля «Копия» или «Кому». Несколько раз в год получаю письма, в которых перечислено 50–90 адресатов в поле «Копия». Налицо нарушение privacy. Не всем из твоих адресатов нужно знать, с кем ещё вы работаете по аналогичной теме. Хорошо, если это знакомые между собой люди. А если в списке конкурирующие компании, которым неизвестно друг о друге? Как минимум нужно быть готовым к лишним объяснениям, как максимум — к прекращению сотрудничества с одним из них. Не надо так.

Mozilla Thunderbird

Правильно массовую рассылку отправлять на своё имя, а всех получателей ставить в поле «Cкрытая копия».

Mozilla Thunderbird

Тема письма

О важности темы письма часто пишут (иногда толково) в своих корпоративных блогах профессиональные сервисы рассылок. Но там чаще всего идёт речь о продающих письмах, где тема письма решает задачу «email должны открыть».

Мы же обсуждаем ежедневную деловую переписку. Здесь тема решает задачу «письмо и его автора должны легко идентифицировать и потом найти». Причём ваша старательность вернётся к вам в виде кармы многочисленных ответных писем, только с приставками Re: или Fwd, среди которых придётся искать нужное письмо по теме.

Mozilla Thunderbird

Двадцать писем — это объём однодневной переписки менеджера среднего звена. О предпринимателях и владельцах бизнеса вообще не говорю, у них число писем иногда зашкаливает за 200 и более в день. Поэтому ещё раз: не отправляйте письма с пустой темой.

Итак, как правильно формулировать тему письма?

Мы у себя в «Небе» рекомендуем во внешних письмах писать в теме: «Небо.<Содержательная тема письма в трёх-пяти словах>». Во внутренних — просто содержание темы письма в трёх-пяти словах без префиксов.

Ошибка № 1: только название компании в теме. Например, «Небо» и всё. Во-первых, наверняка вы не один из вашей компании общаетесь с этим контрагентом. Во-вторых, никакого смысла такая тема не привносит, ведь название вашей компании и так видно из адреса. В‑третьих, угадайте, как будет выглядеть ваш собственный ящик при таком подходе к переписке? Примерно вот так.

Mozilla Thunderbird

Удобно искать по таким темам?

Ошибка № 2: кричащий, продающий заголовок. Здорово, если вы умеете писать такие заголовки. Вот только уместно ли применение этих навыков в деловой переписке? Вспомните цель темы делового письма: не продать, а обеспечить идентификацию и поиск.

Неправильно Правильно
Успей купить топоры по сходной цене! Коммерческое предложение по поставке топоров
Надо поторопиться свериться по процентам! Родион уже в пути! На согласование акт сверки по процентам с Алёной Ивановной
ВНИМАНИЕ! Порфирий Петрович разгадал тайну Раскольникова, решит и наши проблемы Предложение от консультанта: психологическая дедукция

Текст письма

Есть множество руководств по написанию текстов для разных случаев жизни. Например, много полезного у Максима Ильяхова и других мастеров слова. Советую почитать их статьи хотя бы для повышения общей грамотности и улучшения общей стилистики письменной речи.

В процессе написания письма мы должны последовательно принять несколько решений.

Вопрос вежливости. В начале письма можно расплыться в любезностях или даже нежности в духе «Милый мой Родя, вот уже два месяца с лишком, как я не беседовала с тобой письменно, от чего сама страдала и даже иную ночь не спала, думая». Очень вежливо и очень затратно, как по времени на сочинение такого вступления, так и по времени собеседника на его прочтение. Переписка ведь деловая, помните? Не сочинение эпистолярного жанра на конкурс и не письмо матери Раскольникову, а деловая переписка.

Уважаем время своё и получателя!

Представляться и напоминать обстоятельства знакомства имеет смысл только в первом письме, отправляемом после мимолётной встречи на выставке. Если же это продолжение сотрудничества или текущая переписка, в первом письме в день пишем: «Здравствуйте, Иван», во втором и последующих: «Иван, …».

Обращение. Меня всегда волновал вопрос, к кому обратиться в письме, если получателей несколько. Недавно я писал письмо, обращённое к трём девушкам по имени Анна. Нисколько не сомневаясь, я написал «Здравствуйте, Анна» и не парился. Но так везёт далеко не всегда.

Что делать, если получателей три или даже семь и они не носят одно имя? Можно перечислить по именам: «Добрый день, Родион, Пульхерия, Авдотья и Пётр Петрович». Но это длинно и занимает время. Можно написать: «Здравствуйте, коллеги!».

Я для себя использую правило обращаться по имени к тому, кто стоит в поле «Кому». А к тем, кто в копии, не обращаться вообще. Это правило заодно позволяет точнее определить (одного!) адресата письма и цель этого письма.

Цитирование. Часто переписка представляет собой цепочку писем с вопросами и ответами — словом, диалог. Хорошим тоном считается не удалять историю переписки и писать свой ответ сверху цитируемого текста, чтобы, вернувшись к этой переписке через неделю, можно было легко прочитать диалог сверху вниз по убывающим датам.

Почему-то по умолчанию в Mozilla стоит настройка «Установить курсор после цитируемого текста». Рекомендую её поменять в меню «Инструменты» → «Параметры учётной записи» → «Составление и адресация». Должно быть так.

Mozilla Thunderbird

Цель письма. Деловые письма бывают двух видов:

  • когда мы просто информируем собеседника (например, отчёт о проделанной работе за месяц);
  • и когда мы чего-то хотим от собеседника. Например, чтобы он согласовал приложенный счёт на оплату.

Как правило, побуждающих писем в разы больше, чем отчётных. Если мы хотим чего-то добиться от собеседника, очень важно сказать об этом в письме прямым текстом. Призыв к действию должен сопровождаться обращением по имени и идти последним предложением в письме.

Неправильно: «Порфирий Петрович, я знаю, кто зарубил старушку».

Правильно: «Порфирий Петрович, это я зарубил старушку, пожалуйста, примите меры по моему аресту, устал мучиться!».

Почему корреспондент должен за вас думать, что ему делать с этим письмом? Ведь он может принять и неправильное решение.

Подпись в тексте. Она должна быть. Тем более все почтовые клиенты позволяют настроить автоподстановку подписи, например классическое «С уважением, …». В Mozilla это делается в меню «Инструменты» → «Параметры учётной записи».

Писать или не писать контакты в подписи — личное дело каждого. Но если вы хоть как-то связаны с продажами — обязательно пишите. Даже если сделка не состоится по итогам коммуникации, в будущем вас легко найдут по контактам из подписи.

Напоследок ещё одна фишка тела письма для тех собеседников, кто не любит (не может, не хочет, не имеет времени) отвечать на ваши письма. Укажите в тексте письма умолчание. Например, «Порфирий Петрович, если не придёте меня арестовывать до 12:00 пятницы, то я считаю себя амнистированным». Разумеется, срок должен быть реальным (не стоит текст из примера отправлять в пятницу в 11:50). Получатель должен физически иметь возможность прочитать и принять решение по вашему письму. Такое «умолчание» снимает с вас ответственность за неответ собеседника. Как и всегда, к применению этой фишки нужно подходить разумно. Если человек вовремя и регулярно отвечает на ваши письма, такой ультиматум может его если не обидеть, то немного напрячь или привести к решению не отвечать на письмо прямо сейчас, а заставить вас ждать пятницы.

Вложения

Письма часто бывают с вложениями: резюме, коммерческие предложения, сметы, графики, сканы документов — очень удобный инструмент и в то же время источник популярных ошибок.

Ошибка: огромный размер вложения. Часто приходят письма с размером вложений до 20 МБ. Как правило, это сканы каких-нибудь документов в формате TIFF, с разрешением 600dpi. Почтовая программа корреспондента почти наверняка зависнет на несколько минут в тщетных попытках загрузить предпросмотр этого вложения. И не дай бог получателю попытаться прочитать это письмо на смартфоне…

Лично я такие письма сразу удаляю. Не хотите, чтобы ваше письмо оказалось в корзине до прочтения? Проконтролируйте размер вложения. Рекомендуется, чтобы оно было не более 3 МБ.

Что делать, если превышает?

  • Попробуйте перенастроить ваш сканер на другой формат и разрешение. Например, в PDF и 300dpi получаются вполне читабельные сканы.
  • Вспомните про такие программы, как архиватор WinRar или 7zip. Некоторые файлы отлично сжимаются.
  • Что делать, если вложение огромное и сжать его не получается? Например, почти пустая база бухгалтерии весит 900 МБ. На помощь придут облачные хранилища информации: Dropbox, Google Drive и тому подобные. Некоторые сервисы, например Mail.ru, автоматически преобразовывают огромные вложения в ссылки на облачное хранилище. Но я предпочитаю сам управлять своей информацией, хранящейся в облаке, поэтому автоматизацию от Mail.ru не приветствую.

И ещё одна не совсем очевидная рекомендация про вложения — их имя. Оно должно быть понятным и приемлемым для получателя. Как-то раз мы в компании готовили коммерческое предложение на имя… пусть будет Фёдора Михайловича Достоевского. Я получил от менеджера письмо с проектом КП на согласование, и во вложении был файл с именем «ДляФеди.docx». С менеджером, отправившим мне это, состоялся диалог примерно следующего содержания:

— Дорогой менеджер, ты лично готов подойти к этому уважаемому человеку и назвать его в лицо Федя?

— Как-то нет, уважаемый же человек, его все по имени-отчеству называют.

— Почему же ты вложение назвал «ДляФеди»? Если я прямо сейчас перешлю ему, как думаешь, он купит у нас топоры по этому КП?

— Я собирался потом переименовать…

Зачем готовить мину замедленного действия — отказ потенциального клиента — или создавать себе лишнюю работу по переименованию файла? Почему бы сразу не назвать вложение правильно: «ДляФёдораМихайловича.docx» или ещё лучше — «КП_Небо_Топоры.docx».

Итак, с email как «лицом» более-менее разобрались. Давайте перейдём к рассмотрению электронной почты как инструмента эффективной работы и поговорим об её отвлекающей составляющей.

Работа с письмами

Электронная почта — это мощный отвлекающий фактор. Как и с любым отвлекающим фактором, с почтой нужно бороться путём ужесточения правил и внедрения расписания работы.

Как минимум нужно отключить ВСЕ уведомления о приходе почты. Если почтовый клиент настроен по умолчанию, вас оповестят и звуковым сигналом, и помигают иконкой рядом с часами, и покажут превью письма. Словом, сделают всё, чтобы сначала оторвать вас от кропотливой работы, а потом погрузить в пучину непрочитанных писем и непросмотренных рассылок — минус час-другой из жизни.

У кого-то могучая сила воли позволяет не отвлекаться на уведомления, а обычным людям лучше не искушать судьбу и отключить их. В Mozillla Thunderbird это делается через меню «Инструменты» → «Настройки» → «Основные» → «При появлении новых сообщений».

Если нет уведомлений, как понять, что пришло письмо?

Очень просто. Вы сами, осознанно, выделяете время на разбор почты, откроете почтовый клиент и увидите все непрочитанные сообщения. Это можно делать два раза в день, например в обед и вечером или во время вынужденных простоев, допустим, в пробках.

Часто спрашивают, как же время реакции и срочные письма? Отвечаю: у вас нет срочных писем в почте. Если только вы не работаете в отделе клиентской поддержки (в таком отделе свой регламент работы с почтой).

Если и будут срочные письма, то отправитель уведомит вас об этом по другим каналам — телефон, SMS, Skype. Тогда вы осознанно зайдёте в почтовый клиент и обработаете срочную почту. Все гуру тайм-менеджмента (например, Глеб Архангельский с его «Тайм-драйвом») декларируют стандарт ответа на email до 24 часов. Это нормальное правило хорошего тона — не ждать от собеседника мгновенных ответов по email. Если же есть срочное письмо, уведомить об этом по более быстрым каналам связи.

Итак, уведомления мы отключили и теперь включаем почтовый клиент по своему расписанию.

Что же делать, когда мы зашли в почту и занялись деятельностью с названием «разбираю электронную почту»? Где начало и конец этой работы?

Я много слышал про систему zero inbox, но, к сожалению, не встречал ни одного человека, применяющего её. Пришлось изобретать свой велосипед. Статьи на эту тему есть на Лайфхакере. Например, «Ноль входящих». Ниже я расскажу о системе zero inbox в моей интерпретации. Буду благодарен, если гуру GTD отметятся в комментариях, дополнят или улучшат описанную систему.

Важно понять и принять, что электронная почта — это не планировщик задач и не архив для вашей деятельности. Поэтому папка «Входящие» должна быть всегда пустой. Если вы взялись за разбор входящих, не останавливайтесь и не отвлекайтесь ни на что, пока не опустошите эту папку.

Что делать с письмами во входящих? Нужно пройтись последовательно по каждому письму и удалить его. Да, просто выделить и нажать на клавиатуре Delete. Если не получается заставить себя удалить письмо, придётся принимать решение, что с ним делать.

  1. Можете ответить на него за три минуты? Нужно ли на него отвечать? Да, нужно, и ответ займёт не более трёх минут, тогда отвечайте сразу.
  2. Отвечать нужно, но подготовка ответа займёт более трёх минут. Если пользуетесь планировщиком задач, позволяющим преобразовать письмо в задачу, превратите email в таск и на время забудьте о нём. Я, например, использую совершенно замечательный сервис Doit.im. Он позволяет сгенерировать персональный email-адрес: пересылаешь на него письмо, и оно превращается в задачу. Но если у вас нет планировщика задач, перенесите письмо в подпапку «0_Выполнить».
  3. После быстрого ответа на письмо, превращения его в задачу или простого ознакомления необходимо решить, что делать с этим сообщением дальше: удалить или отправить в одну из папок на длительное хранение.

Вот какие папки для длительного хранения есть у меня.

  • 0_Выполнить. У меня такой папки нет, но если у вас нет планировщика, повторюсь, сюда можно складывать письма, требующие детальной проработки. Эту папку тоже нужно регулярно очищать, но уже с вдумчивым подходом в специально выделенное на это время.
  • 1_Справ. Сюда я складываю письма со справочной информацией: приветственные письма с логинами от различных веб-сервисов, билеты на предстоящие рейсы и так далее.
  • 2_Проекты. Здесь хранится архив переписки по партнёрам и проектам, с которыми есть текущие взаимоотношения. Естественно, для каждого проекта или партнёра заведена отдельная папка. В папку партнёра я складываю письма не только от его сотрудников, но и письма от сотрудников «Неба», связанные с этим партнёром. Очень удобно: при необходимости вся переписка по проекту под рукой за пару кликов.
  • 3_Музей. Сюда я закидываю те письма, которые и удалить жалко, и польза от них неочевидна. Также сюда перекочевывают папки с закрытыми проектами из «2_Проекты». Словом, в «Музее» хранятся первые кандидаты на удаление.
  • 4_Документы. Здесь лежат письма с электронными образцами документов, которые могут пригодиться в будущем для бухгалтерии, например акты сверок от клиентов, билеты по состоявшимся поездкам. Папка во многом перекликается с папками «2_Проекты» и «1_Справ», только в ней хранится бухгалтерская информация, а в папке «2_Проекты» — управленческая. В «4_Документы» — мёртвая информация, а в «2_Проекты» — живая.
  • 5_Знания. Сюда я складываю только действительно полезные рассылки, к которым хочу вернуться через время для вдохновения или поиска решений.

Есть и другие настройки почтового клиента, важные для работы этой системы. Во-первых, по умолчанию в Thunderbird стоит флажок «Помечать сообщения как прочитанные». Я предпочитаю делать это осознанно, поэтому флажок долой! Для этого заходим в меню «Инструменты» → «Настройки» → «Дополнительно» → «Чтение и отображение».

Во-вторых, используем фильтры. Раньше я активно применял фильтры, которые по адресу отправителя автоматически переправляли письма в соответствующие папки. Например, письма от юриста перемещались в папку «Юрист». Отказался от такого подхода по нескольким причинам. Первая: письма от юриста в 99% случаев относятся к какому-либо проекту или партнёру, а значит, подлежат перемещению в папку этого партнёра или проекта. Вторая: решил добавить осознанности. Вы сами должны решить, где должно храниться конкретное письмо, а искать необработанные сообщения удобнее только в одном месте — во входящих. Сейчас фильтры использую только для разнесения по папкам автоматических регулярных писем из различных систем, то есть писем, не требующих от меня принятия решений. Фильтры в Mozilla Thunderbird настраиваются в меню «Инструменты» → «Фильтры сообщений».

Итак, при правильном подходе на электронную почту должно уходить от 10 до 60 минут в день в зависимости от объёма переписки.

Да, и ещё одно. Вы ведь уже отключили уведомления о приходе новых писем? ;)

Обложка: Brian A Jackson / Shutterstock
Если нашли ошибку, выделите текст и нажмите Ctrl + Enter

Лучшие предложения

10 пар зимней обуви с хорошими скидками на «чёрной пятнице»

10 пар зимней обуви с хорошими скидками на «чёрной пятнице»

постельное белье

21 комплект постельного белья, который преобразит вашу спальню

Roborock Q5 Pro

Надо брать: робот-пылесос Roborock Q5 Pro со скидкой 76%

Гидравлический домкрат с высоким рейтингом отдают со скидкой 35% на AliExpress

Гидравлический домкрат с высоким рейтингом отдают со скидкой 35% на AliExpress

23 нарядных платья, которые можно надеть на новогодний корпоратив

23 нарядных платья, которые можно надеть на новогодний корпоратив

10 рюкзаков для ноутбука, которые не боятся мокрого снега и дождя

10 рюкзаков для ноутбука, которые не боятся мокрого снега и дождя

5 милых мягких игрушек для тех, кто любит мультфильмы Хаяо Миядзаки

5 милых мягких игрушек для тех, кто любит мультфильмы Хаяо Миядзаки

Самый популярный компрессор от Baseus отдают за полцены

Самый популярный компрессор от Baseus отдают за полцены

Это интересно
Пазл жизни: что нужно знать о донорстве костного мозга

Пазл жизни: что нужно знать о донорстве костного мозга

Нейросети меняют рынок труда. Что нужно сделать сегодня, чтобы оставаться востребованным завтра

Нейросети меняют рынок труда. Что нужно сделать сегодня, чтобы оставаться востребованным завтра

В России запустили производство вакцины от вируса папилломы человека полного цикла

В России запустили производство вакцины от вируса папилломы человека полного цикла

8 умных гаджетов для дома, которые делают быт проще и уютнее

8 умных гаджетов для дома, которые делают быт проще и уютнее

Комментарии
id297101743
01.06.15 13:16
у меня после отпуска 356 непрочитанных писем, что с ними делать ?
Artem Turovets
01.06.15 14:52
Как удалить все письма: Ctrl+A - delete ). Если серьезно, нужно просто сесть и разобрать до нуля. Проще всего завалы разбирать, отсортировав их по отправителю.
Viacheslav Parinov
01.06.15 23:02
А ещё лучше - раз в день во время отпуска заходить в почту и тратить минут пятнадцать на прочтение писем. Половина из них, как правило, предназначена лишь для ознакомления - их можно прочесть и забыть. В итоге после отпуска будет лишь 180 писем, которые требуют от вас ответа, и не надо будет перегружать свой мозг ненужной сейчас информацией - изменениями в корпоративной страховке, трудовом договоре, новостями компании, информацией о том, что кто-то ушёл в отпуск, уволился и тд. Информация простая, только для ознакомления, но в первый рабочий день даже это сильно напрягает и отвлекает.
id209023497
03.06.15 11:08
нет, не "лучше". Зачем вообще ходить в отпуск, если ни на день вы не можете "отпустить" производственные вопросы и разгрузить мозги? Это не отдых. К тому же, к моменту выхода из отпуска часть информации потеряет актуальность (например, ваш коллега тоже вернется из отпуска).
Dmitry Zakharov
02.06.15 16:15
https://www.youtube.com/watch?v=EE6E5WX5AJM
Valentina Korennaja
07.12.15 18:22
Настройте фильтр Непрочитанные и начинайте читать. По темам отберите наиболее важные и прочтите. Отвечайте только на те, которые требуют Вашего ответа. Все ненужные отправьте в корзину и посмотрите что осталось. Монотонная работа, но съешьте слона по кускам.?
Что вы могли пропустить
Что такое ванильный секс и стоит ли переживать, если ваш именно такой
Что такое ванильный секс и стоит ли переживать, если ваш именно такой
0
21:00
Ликбез
Секс
8 невероятных явлений, которые можно увидеть в небе
8 невероятных явлений, которые можно увидеть в небе
0
19:00
Образование
Образование
10 способов приготовить бесподобную утку в духовке
10 способов приготовить бесподобную утку в духовке
0
18:00
Еда
Ликбез
Xiaomi начала обновлять до HyperOS 3 ещё четыре смартфона, включая Redmi 13
Xiaomi начала обновлять до HyperOS 3 ещё четыре смартфона, включая Redmi 13
0
16:44
Android
Новости
11 фильмов, на которые можно пригласить девушку к себе домой на свидание
11 фильмов, на которые можно пригласить девушку к себе домой на свидание
0
16:00
Кино
Кино
«Снегоуборщик» и «Дорожные игры»: Collider назвал 10 великих триллеров, о которых все забыли
«Снегоуборщик» и «Дорожные игры»: Collider назвал 10 великих триллеров, о которых все забыли
0
15:48
Кино
Новости
Тот самый классический салат цезарь с курицей
Тот самый классический салат цезарь с курицей
14:30
«Горящая изба»
Еда
Представлен внешний SSD с кнопкой уничтожения файлов без следа — прямо как в шпионских фильмах
Представлен внешний SSD с кнопкой уничтожения файлов без следа — прямо как в шпионских фильмах
0
14:18
Новости
Устройства
Испарительная камера рвётся голыми руками: OnePlus 15 проверили на прочность
Испарительная камера рвётся голыми руками: OnePlus 15 проверили на прочность
0
13:40
Новости
Устройства
Как выбрать хороший увлажнитель воздуха для квартиры и частного дома
Как выбрать хороший увлажнитель воздуха для квартиры и частного дома
0
13:00
Как выбрать
Ликбез
В финале «Очень странных дел» будет самая жестокая смерть в истории сериала
В финале «Очень странных дел» будет самая жестокая смерть в истории сериала
0
12:25
Кино
Новости
Пироги и пирожки, которые готовятся из обычного лаваша
Пироги и пирожки, которые готовятся из обычного лаваша
12:00
Еда
Еда
В «Блокноте» на Windows 11 появилась поддержка таблиц
В «Блокноте» на Windows 11 появилась поддержка таблиц
0
11:39
Windows
Новости
Вышел трейлер слэшера «Микки против Винни» с культовыми персонажами Disney
Вышел трейлер слэшера «Микки против Винни» с культовыми персонажами Disney
0
11:10
Кино
Новости
И дом цел, и кошка счастлива. Как сделать жильё комфортным и безопасным для питомца
И дом цел, и кошка счастлива. Как сделать жильё комфортным и безопасным для питомца
0
11:00
Советы
Советы

Новые комментарии

Аватар автора комментария
D.V.1 час назад

0 / 0

Про натертую пятку это круто !
Что такое shallowing — секс-тренд, который очень нравится женщинам
Аватар автора комментария
Информатик1 час назад

0 / 0

на xiaomi 11 не работает. Вкл режим Factory Mode . Чтоб выти из режима нужно все время клавищей выкл жать и чтоб выбрана верхняя стройка была..
Как включить и отключить безопасный режим на Android-смартфоне
Аватар автора комментария
Кирилл Тимонин1 час назад

0 / 0

22.11.2025 - новая версия скрипта для автоматического удаления постов со стены ВК, учитывающая все изменения алгоритма удаления постов и интерфейса ВК. У скрипта есть удобное меню для управления процессом. Пред запуском скрипта необходимо войти в режим просмотра сообщений стены с выбором по календарю (двойной клик по слову Сообщения). Далее - выбираете год и дату в календаре, с которой начинать удалять сообщения - например 31 декабря 2023 года. Сообщения будут удаляться в прошлое - весь декабрь, ноябрь, октябрь и так далее. В меню скрипта нужно выбрать год - это служит предохранителем от случайного удаления текущих постов этого года. Скорость удаления постов от 0.1 до 3 секунд. Настраивать в зависимости от скорости вашего интернета и мощности компьютера. Для максимально быстрой работы скрипта необходимо в настройках браузера отключить показ картинок и видео. Скрипт успешно тестировался в браузере Хром на любых скоростях. Удаляет без ошибок. var test = false, count = 0, targetYear = 2024, deletePause = 100; var controlElements = {}; // Объект для хранения элементов управления // Функция создания панели управления function createControlPanel() { var panel = document.createElement('div'); panel.style.cssText = ` position: fixed; top: 20px; right: 20px; z-index: 10000; background: rgba(0,0,0,0.8); color: white; border-radius: 10px; padding: 15px; font-family: Arial, sans-serif; min-width: 200px; backdrop-filter: blur(10px); `; var title = document.createElement('div'); title.innerHTML = '🎯 Управление удалением'; title.style.cssText = 'font-weight: bold; margin-bottom: 10px; font-size: 16px;'; panel.appendChild(title); var stats = document.createElement('div'); stats.id = 'controlStats'; stats.innerHTML = `Год: ${targetYear}Удалено: ${count}Пауза: ${deletePause/1000}сек`; stats.style.cssText = 'margin-bottom: 10px; font-size: 12px; line-height: 1.4;'; panel.appendChild(stats); // Кнопка остановки/продолжения controlElements.stopBtn = document.createElement('button'); controlElements.stopBtn.innerHTML = '🛑 Остановить'; controlElements.stopBtn.style.cssText = ` background: #ff4444; color: white; border: none; padding: 8px 12px; border-radius: 5px; cursor: pointer; font-weight: bold; font-size: 12px; margin-right: 5px; margin-bottom: 5px; width: 100%; `; controlElements.stopBtn.onclick = function() { if (test) { // Останавливаем скрипт test = false; controlElements.stopBtn.innerHTML = '▶️ Продолжить'; controlElements.stopBtn.style.background = '#44aa44'; console.log('⏸️ Скрипт приостановлен пользователем'); } else { // Продолжаем скрипт test = true; controlElements.stopBtn.innerHTML = '🛑 Остановить'; controlElements.stopBtn.style.background = '#ff4444'; console.log('▶️ Скрипт продолжен пользователем'); // Запускаем процесс снова setTimeout(() => { processPostsContinuously(); }, 100); } updateControlPanel(); }; panel.appendChild(controlElements.stopBtn); // Кнопка перезапуска var restartBtn = document.createElement('button'); restartBtn.innerHTML = '🔄 Перезапустить'; restartBtn.style.cssText = ` background: #44aaff; color: white; border: none; padding: 8px 12px; border-radius: 5px; cursor: pointer; font-weight: bold; font-size: 12px; margin-bottom: 5px; width: 100%; `; restartBtn.onclick = function() { test = false; console.log('🔄 Перезапуск скрипта...'); // Сбрасываем кнопку остановки к красному цвету if (controlElements.stopBtn) { controlElements.stopBtn.innerHTML = '🛑 Остановить'; controlElements.stopBtn.style.background = '#ff4444'; } setTimeout(() => { restartWithNewSettings(); }, 500); }; panel.appendChild(restartBtn); // Кнопка быстрых настроек var settingsBtn = document.createElement('button'); settingsBtn.innerHTML = '⚙️ Быстрые настройки'; settingsBtn.style.cssText = ` background: #ffaa00; color: white; border: none; padding: 8px 12px; border-radius: 5px; cursor: pointer; font-weight: bold; font-size: 12px; width: 100%; `; settingsBtn.onclick = function() { quickSettings(); }; panel.appendChild(settingsBtn); document.body.appendChild(panel); return panel; } // Функция сброса кнопки остановки при перезапуске function resetStopButton() { if (controlElements.stopBtn) { controlElements.stopBtn.innerHTML = '🛑 Остановить'; controlElements.stopBtn.style.background = '#ff4444'; } } // Функция обновления панели управления function updateControlPanel() { var stats = document.getElementById('controlStats'); if (stats) { stats.innerHTML = `Год: ${targetYear}Удалено: ${count}Пауза: ${deletePause/1000}секСтатус: ${test ? 'активен' : 'пауза'}`; } } // Функция быстрых настроек function quickSettings() { if (test) { alert('Сначала остановите скрипт для изменения настроек!'); return; } var newPause = parseFloat(prompt('Новая пауза между удалениями (секунды):\n\n0.1-0.3 - Максимальная скорость\n0.5-1.0 - Баланс\n1.5-3.0 - Максимальная надежность', deletePause/1000)); if (!isNaN(newPause) && newPause >= 0.1 && newPause <= 3) { deletePause = newPause * 1000; console.log('⚙️ Пауза изменена: ' + newPause + ' сек.'); updateControlPanel(); } else { alert('Некорректное значение паузы!'); } } // Функция перезапуска с новыми настройками function restartWithNewSettings() { // Сбрасываем счетчик count = 0; // Запрос года для удаления var currentYear = new Date().getFullYear(); var newTargetYear = parseInt(prompt('Введите год, посты за который нужно удалить\n(например: 2024, 2023, 2022)', targetYear)); // Проверка корректности года if (isNaN(newTargetYear) || newTargetYear < 2000 || newTargetYear > currentYear) { alert('Некорректный год! Будет использован предыдущий год: ' + targetYear); } else { targetYear = newTargetYear; } // Настройка паузы между удалениями var pauseInput = parseFloat(prompt('Пауза между удалениями постов (секунды)\n\nРекомендации:\n• 0.1-0.3 - Максимальная скорость (риск ошибок)\n• 0.5-1.0 - Баланс скорости и надежности\n• 1.5-3.0 - Максимальная надежность', deletePause/1000)); // Проверка и ограничение паузы if (isNaN(pauseInput) || pauseInput < 0.1) { pauseInput = 0.1; } else if (pauseInput > 3) { pauseInput = 3; } deletePause = pauseInput * 1000; test = confirm("⚡ НОВЫЕ НАСТРОЙКИ УДАЛЕНИЯ:\n\n• Год: " + targetYear + "\n• Пауза между удалениями: " + pauseInput + " сек." + "\n• Медиа заблокированы: Да\n\nНачать удаление с новыми настройками?"); if (test) { console.log('🔄 ПЕРЕЗАПУСК С НОВЫМИ НАСТРОЙКАМИ'); console.log('🎯 Целевой год: ' + targetYear); console.log('⏱️ Пауза между удалениями: ' + pauseInput + ' сек.'); // Сбрасываем кнопку остановки к красному цвету resetStopButton(); updateControlPanel(); startContinuousDeletion(); } else { updateControlPanel(); } } // Остановка по клавише ESC document.addEventListener('keydown', function(e) { if (e.key === 'Escape' && test) { test = false; if (controlElements.stopBtn) { controlElements.stopBtn.innerHTML = '▶️ Продолжить'; controlElements.stopBtn.style.background = '#44aa44'; } console.log('⏸️ Скрипт приостановлен по клавише ESC'); updateControlPanel(); } }); function disableMediaLoading() { document.querySelectorAll('img, video, iframe').forEach(el => { el.style.display = 'none'; }); const observer = new MutationObserver(mutations => { mutations.forEach(mutation => { mutation.addedNodes.forEach(node => { if (node.nodeType === 1) { if (node.tagName === 'IMG' || node.tagName === 'VIDEO') { node.style.display = 'none'; } node.querySelectorAll?.('img, video').forEach(media => { media.style.display = 'none'; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); console.log('⚡ Медиа заблокированы'); } function itit() { disableMediaLoading(); // Запрос года для удаления var currentYear = new Date().getFullYear(); targetYear = parseInt(prompt('Введите год, посты за который нужно удалить\n(например: 2024, 2023, 2022)', currentYear)); // Проверка корректности года if (isNaN(targetYear) || targetYear < 2000 || targetYear > currentYear) { alert('Некорректный год! Будет использован текущий год: ' + currentYear); targetYear = currentYear; } // Точная настройка паузы между удалениями var pauseInput = parseFloat(prompt('Пауза между удалениями постов (секунды)\n\nРекомендации:\n• 0.1-0.3 - Максимальная скорость (риск ошибок)\n• 0.5-1.0 - Баланс скорости и надежности\n• 1.5-3.0 - Максимальная надежность', '0.5')); // Проверка и ограничение паузы if (isNaN(pauseInput) || pauseInput < 0.1) { pauseInput = 0.1; } else if (pauseInput > 3) { pauseInput = 3; } deletePause = pauseInput * 1000; test = confirm("⚡ НАСТРОЙКИ УДАЛЕНИЯ:\n\n• Год: " + targetYear + "\n• Пауза между удалениями: " + pauseInput + " сек." + "\n• Медиа заблокированы: Да\n\nНачать удаление?"); if (test) { console.log('⚡ ЗАПУСК С НАСТРОЕННЫМИ ПАРАМЕТРАМИ'); console.log('🎯 Целевой год: ' + targetYear); console.log('⏱️ Пауза между удалениями: ' + pauseInput + ' сек.'); createControlPanel(); startContinuousDeletion(); } } function startContinuousDeletion() { console.log('🔄 Начинаем непрерывное удаление...'); updateControlPanel(); processPostsContinuously(); } function processPostsContinuously() { if (!test) { console.log('⏸️ Скрипт на паузе'); return; } console.log(`\n=== ПОИСК ПОСТОВ ЗА ${targetYear} ГОД ===`); var posts = document.querySelectorAll('div._post'); console.log(`📊 На странице: ${posts.length} постов`); if (posts.length === 0) { console.log('📭 Постов не найдено, пытаемся загрузить...'); loadMorePosts().then((success) => { setTimeout(processPostsContinuously, 1000); }); return; } var postsToDelete = []; for (var i = 0; i < posts.length; i++) { var post = posts[i]; var postDate = extractDateFromPost(post); if (postDate && postDate.getFullYear() === targetYear) { postsToDelete.push({ element: post, date: postDate, index: i }); } } console.log(`🎯 Найдено постов за ${targetYear} год: ${postsToDelete.length}`); // Показываем информацию о найденных постах if (postsToDelete.length > 0) { console.log('📅 Даты найденных постов:'); postsToDelete.forEach(post => { console.log(' - ' + post.date.toLocaleDateString()); }); } if (postsToDelete.length > 0) { console.log('🔥 Начинаем удаление...'); deletePostsSequentially(postsToDelete, 0, () => { console.log(`✅ Удаление завершено. Всего удалено: ${count}`); updateControlPanel(); setTimeout(processPostsContinuously, 500); }); } else { console.log('📭 Постов за ' + targetYear + ' год не найдено, загружаем следующую страницу...'); loadMorePosts().then((success) => { setTimeout(processPostsContinuously, 1000); }); } } function loadMorePosts() { return new Promise((resolve) => { console.log('🔍 Поиск пагинации для загрузки следующей страницы...'); // Ищем кнопку "1" в пагинации (первая страница) var paginationButton = findPaginationButton(); if (paginationButton) { console.log('✅ Найдена кнопка пагинации, нажимаем...'); paginationButton.click(); console.log('⏳ Ждем загрузки новой страницы (3 секунды)...'); setTimeout(() => { // Прокручиваем немного для стимуляции загрузки window.scrollTo(0, 100); setTimeout(() => { console.log('✅ Новая страница загружена'); resolve(true); }, 1000); }, 3000); } else { console.log('❌ Кнопка пагинации не найдена, пробуем альтернативные методы...'); // Альтернативные методы загрузки var alternativeButtons = [ document.querySelector('#fw_load_more.pg_more_link'), document.querySelector('#wall_more_link'), document.querySelector('.wall_more_link'), document.querySelector('.pg_more_link'), findElementByText('к предыдущим постам') ]; var foundButton = alternativeButtons.find(btn => btn !== null); if (foundButton) { console.log('✅ Найдена альтернативная кнопка, нажимаем...'); foundButton.click(); console.log('⏳ Ждем загрузки постов (4 секунды)...'); setTimeout(() => { console.log('✅ Посты загружены через альтернативную кнопку'); resolve(true); }, 4000); } else { console.log('❌ Ни одна кнопка не найдена, используем прокрутку...'); var oldCount = document.querySelectorAll('div._post').length; window.scrollTo(0, 0); setTimeout(() => { window.scrollTo(0, document.body.scrollHeight); console.log('⏳ Ждем загрузки постов после прокрутки (5 секунд)...'); setTimeout(() => { var newCount = document.querySelectorAll('div._post').length; if (newCount > oldCount) { console.log(`✅ Загружено ${newCount - oldCount} постов через прокрутку`); resolve(true); } else { console.log('❌ Не удалось загрузить новые посты через прокрутку'); resolve(false); } }, 5000); }, 1000); } } }); } // Функция поиска кнопки пагинации "1" function findPaginationButton() { // Ищем все элементы пагинации var paginationContainers = [ document.querySelector('.pagination_page'), document.querySelector('.pagination_pages'), document.querySelector('.page_list'), document.querySelector('.pagination_list'), document.querySelector('[data-module="uiPagination"]'), document.querySelector('.ui_pagination') ]; // Ищем в контейнерах пагинации for (var container of paginationContainers) { if (container) { // Ищем кнопку с цифрой "1" var button = container.querySelector('a[href*="offset=0"], a[href*="page=1"], .pagination_page:first-child, .page:first-child'); if (button) return button; // Ищем по тексту "1" var buttons = container.querySelectorAll('a, span, .page, .pagination_page'); for (var btn of buttons) { if (btn.textContent && btn.textContent.trim() === '1') { return btn; } } } } // Ищем по всему документу ссылки с offset=0 var offsetLinks = document.querySelectorAll('a[href*="offset=0"]'); for (var link of offsetLinks) { if (link.textContent && link.textContent.trim() === '1') { return link; } } // Ищем любую кнопку с цифрой "1" в вероятных контейнерах пагинации var allButtons = document.querySelectorAll('a, span, .page, .pagination_page, .ui_pagination a'); for (var btn of allButtons) { if (btn.textContent && btn.textContent.trim() === '1' && (btn.href && btn.href.includes('wall') || btn.parentElement && btn.parentElement.className.includes('pagination'))) { return btn; } } return null; } function findElementByText(text) { var elements = document.querySelectorAll('a, span, div, button'); for (var i = 0; i < elements.length; i++) { var element = elements[i]; var elementText = element.textContent || element.innerText; if (elementText && elementText.trim() === text) { return element; } } return null; } function extractDateFromPost(postElement) { try { var dateElement = postElement.querySelector('.PostDateBlock__root'); if (dateElement) { var dateText = dateElement.textContent || dateElement.innerText; if (dateText) { return parseDateFromText(dateText); } } var likeWrap = postElement.querySelector('.like_wrap'); if (likeWrap) { var likeText = likeWrap.textContent || likeWrap.innerText; if (likeText) { return parseDateFromText(likeText); } } } catch (e) { return null; } return null; } function parseDateFromText(text) { if (!text) return null; text = text.replace(/\s+/g, ' ').trim(); var datePatterns = [ /(\d{1,2})\s+(янв|фев|мар|апр|май|июн|июл|авг|сен|окт|ноя|дек)\s+(\d{4})/i, /(\d{1,2})\s+(января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября|декабря)\s+(\d{4})/i ]; for (var pattern of datePatterns) { var match = text.match(pattern); if (match) { var day = parseInt(match[1]); var monthStr = match[2].toLowerCase(); var year = parseInt(match[3]); var months = { 'янв': 0, 'января': 0, 'фев': 1, 'февраля': 1, 'мар': 2, 'марта': 2, 'апр': 3, 'апреля': 3, 'май': 4, 'мая': 4, 'июн': 5, 'июня': 5, 'июл': 6, 'июля': 6, 'авг': 7, 'августа': 7, 'сен': 8, 'сентября': 8, 'окт': 9, 'октября': 9, 'ноя': 10, 'ноября': 10, 'дек': 11, 'декабря': 11 }; var month = months[monthStr]; if (month !== undefined) { return new Date(year, month, day); } } } return null; } function deletePostsSequentially(posts, currentIndex, callback) { if (currentIndex >= posts.length || test === false) { callback(); return; } var post = posts[currentIndex]; deleteSinglePost(post.element).then(() => { count++; console.log(`✅ Удален пост ${currentIndex + 1}/${posts.length}. Всего: ${count}`); // Используем настроенную пользователем паузу console.log(`⏱️ Ждем ${deletePause/1000} сек. перед следующим удалением...`); setTimeout(() => { deletePostsSequentially(posts, currentIndex + 1, callback); }, deletePause); }).catch((error) => { console.error('❌ Ошибка:', error); // При ошибке используем стандартную паузу 100мс setTimeout(() => { deletePostsSequentially(posts, currentIndex + 1, callback); }, 100); }); } function deleteSinglePost(postElement) { return new Promise((resolve, reject) => { try { var menuButton = postElement.querySelector('[data-testid="post_context_menu_toggle"]'); if (!menuButton) { reject('Кнопка меню не найдена'); return; } menuButton.click(); setTimeout(() => { var deleteButton = document.querySelector('[data-testid="post_context_menu_item_delete"]'); if (!deleteButton) { reject('Кнопка удаления не найдена'); return; } deleteButton.click(); setTimeout(() => { var confirmButton = document.querySelector('.vkuiButton--mode-primary'); if (confirmButton) { confirmButton.click(); } postElement.remove(); resolve(); }, 200); }, 200); } catch (error) { reject(error); } }); } function showFinalStats() { var message = `🎉 УДАЛЕНИЕ ЗАВЕРШЕНО!\n\n• Год: ${targetYear}\n• Удалено постов: ${count}\n• Пауза между удалениями: ${deletePause/1000} сек.`; alert(message); console.log(message); updateControlPanel(); } // Запускаем скрипт itit(); // КОМАНДЫ ДЛЯ УПРАВЛЕНИЯ: // - test = false // Остановить скрипт // - restartWithNewSettings() // Перезапуск с новыми настройками // - quickSettings() // Быстрые настройки паузы // - resetStopButton() // Сброс кнопки остановки
Как быстро удалить записи со стены «ВКонтакте»
Аватар автора комментария
Кирилл Тимонин1 час назад

0 / 0

22.11.2025 - новая версия скрипта для автоматического удаления постов со стены ВК, учитывающая все изменения алгоритма удаления постов и интерфейса ВК. У скрипта есть удобное меню для управления процессом. Пред запуском скрипта необходимо войти в режим просмотра сообщений стены с выбором по календарю (двойной клик по слову Сообщения). Далее - выбираете год и дату в календаре, с которой начинать удалять сообщения - например 31 декабря 2023 года. Сообщения будут удаляться в прошлое - весь декабрь, ноябрь, октябрь и так далее. В меню скрипта нужно выбрать год - это служит предохранителем от случайного удаления текущих постов этого года. Скорость удаления постов от 0.1 до 3 секунд. Настраивать в зависимости от скорости вашего интернета и мощности компьютера. Для максимально быстрой работы скрипта необходимо в настройках браузера отключить показ картинок и видео. Скрипт успешно тестировался в браузере Хром на любых скоростях. Удаляет без ошибок. var test = false, count = 0, targetYear = 2024, deletePause = 100; var controlElements = {}; // Объект для хранения элементов управления // Функция создания панели управления function createControlPanel() { var panel = document.createElement('div'); panel.style.cssText = ` position: fixed; top: 20px; right: 20px; z-index: 10000; background: rgba(0,0,0,0.8); color: white; border-radius: 10px; padding: 15px; font-family: Arial, sans-serif; min-width: 200px; backdrop-filter: blur(10px); `; var title = document.createElement('div'); title.innerHTML = '🎯 Управление удалением'; title.style.cssText = 'font-weight: bold; margin-bottom: 10px; font-size: 16px;'; panel.appendChild(title); var stats = document.createElement('div'); stats.id = 'controlStats'; stats.innerHTML = `Год: ${targetYear}Удалено: ${count}Пауза: ${deletePause/1000}сек`; stats.style.cssText = 'margin-bottom: 10px; font-size: 12px; line-height: 1.4;'; panel.appendChild(stats); // Кнопка остановки/продолжения controlElements.stopBtn = document.createElement('button'); controlElements.stopBtn.innerHTML = '🛑 Остановить'; controlElements.stopBtn.style.cssText = ` background: #ff4444; color: white; border: none; padding: 8px 12px; border-radius: 5px; cursor: pointer; font-weight: bold; font-size: 12px; margin-right: 5px; margin-bottom: 5px; width: 100%; `; controlElements.stopBtn.onclick = function() { if (test) { // Останавливаем скрипт test = false; controlElements.stopBtn.innerHTML = '▶️ Продолжить'; controlElements.stopBtn.style.background = '#44aa44'; console.log('⏸️ Скрипт приостановлен пользователем'); } else { // Продолжаем скрипт test = true; controlElements.stopBtn.innerHTML = '🛑 Остановить'; controlElements.stopBtn.style.background = '#ff4444'; console.log('▶️ Скрипт продолжен пользователем'); // Запускаем процесс снова setTimeout(() => { processPostsContinuously(); }, 100); } updateControlPanel(); }; panel.appendChild(controlElements.stopBtn); // Кнопка перезапуска var restartBtn = document.createElement('button'); restartBtn.innerHTML = '🔄 Перезапустить'; restartBtn.style.cssText = ` background: #44aaff; color: white; border: none; padding: 8px 12px; border-radius: 5px; cursor: pointer; font-weight: bold; font-size: 12px; margin-bottom: 5px; width: 100%; `; restartBtn.onclick = function() { test = false; console.log('🔄 Перезапуск скрипта...'); // Сбрасываем кнопку остановки к красному цвету if (controlElements.stopBtn) { controlElements.stopBtn.innerHTML = '🛑 Остановить'; controlElements.stopBtn.style.background = '#ff4444'; } setTimeout(() => { restartWithNewSettings(); }, 500); }; panel.appendChild(restartBtn); // Кнопка быстрых настроек var settingsBtn = document.createElement('button'); settingsBtn.innerHTML = '⚙️ Быстрые настройки'; settingsBtn.style.cssText = ` background: #ffaa00; color: white; border: none; padding: 8px 12px; border-radius: 5px; cursor: pointer; font-weight: bold; font-size: 12px; width: 100%; `; settingsBtn.onclick = function() { quickSettings(); }; panel.appendChild(settingsBtn); document.body.appendChild(panel); return panel; } // Функция сброса кнопки остановки при перезапуске function resetStopButton() { if (controlElements.stopBtn) { controlElements.stopBtn.innerHTML = '🛑 Остановить'; controlElements.stopBtn.style.background = '#ff4444'; } } // Функция обновления панели управления function updateControlPanel() { var stats = document.getElementById('controlStats'); if (stats) { stats.innerHTML = `Год: ${targetYear}Удалено: ${count}Пауза: ${deletePause/1000}секСтатус: ${test ? 'активен' : 'пауза'}`; } } // Функция быстрых настроек function quickSettings() { if (test) { alert('Сначала остановите скрипт для изменения настроек!'); return; } var newPause = parseFloat(prompt('Новая пауза между удалениями (секунды):\n\n0.1-0.3 - Максимальная скорость\n0.5-1.0 - Баланс\n1.5-3.0 - Максимальная надежность', deletePause/1000)); if (!isNaN(newPause) && newPause >= 0.1 && newPause <= 3) { deletePause = newPause * 1000; console.log('⚙️ Пауза изменена: ' + newPause + ' сек.'); updateControlPanel(); } else { alert('Некорректное значение паузы!'); } } // Функция перезапуска с новыми настройками function restartWithNewSettings() { // Сбрасываем счетчик count = 0; // Запрос года для удаления var currentYear = new Date().getFullYear(); var newTargetYear = parseInt(prompt('Введите год, посты за который нужно удалить\n(например: 2024, 2023, 2022)', targetYear)); // Проверка корректности года if (isNaN(newTargetYear) || newTargetYear < 2000 || newTargetYear > currentYear) { alert('Некорректный год! Будет использован предыдущий год: ' + targetYear); } else { targetYear = newTargetYear; } // Настройка паузы между удалениями var pauseInput = parseFloat(prompt('Пауза между удалениями постов (секунды)\n\nРекомендации:\n• 0.1-0.3 - Максимальная скорость (риск ошибок)\n• 0.5-1.0 - Баланс скорости и надежности\n• 1.5-3.0 - Максимальная надежность', deletePause/1000)); // Проверка и ограничение паузы if (isNaN(pauseInput) || pauseInput < 0.1) { pauseInput = 0.1; } else if (pauseInput > 3) { pauseInput = 3; } deletePause = pauseInput * 1000; test = confirm("⚡ НОВЫЕ НАСТРОЙКИ УДАЛЕНИЯ:\n\n• Год: " + targetYear + "\n• Пауза между удалениями: " + pauseInput + " сек." + "\n• Медиа заблокированы: Да\n\nНачать удаление с новыми настройками?"); if (test) { console.log('🔄 ПЕРЕЗАПУСК С НОВЫМИ НАСТРОЙКАМИ'); console.log('🎯 Целевой год: ' + targetYear); console.log('⏱️ Пауза между удалениями: ' + pauseInput + ' сек.'); // Сбрасываем кнопку остановки к красному цвету resetStopButton(); updateControlPanel(); startContinuousDeletion(); } else { updateControlPanel(); } } // Остановка по клавише ESC document.addEventListener('keydown', function(e) { if (e.key === 'Escape' && test) { test = false; if (controlElements.stopBtn) { controlElements.stopBtn.innerHTML = '▶️ Продолжить'; controlElements.stopBtn.style.background = '#44aa44'; } console.log('⏸️ Скрипт приостановлен по клавише ESC'); updateControlPanel(); } }); function disableMediaLoading() { document.querySelectorAll('img, video, iframe').forEach(el => { el.style.display = 'none'; }); const observer = new MutationObserver(mutations => { mutations.forEach(mutation => { mutation.addedNodes.forEach(node => { if (node.nodeType === 1) { if (node.tagName === 'IMG' || node.tagName === 'VIDEO') { node.style.display = 'none'; } node.querySelectorAll?.('img, video').forEach(media => { media.style.display = 'none'; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); console.log('⚡ Медиа заблокированы'); } function itit() { disableMediaLoading(); // Запрос года для удаления var currentYear = new Date().getFullYear(); targetYear = parseInt(prompt('Введите год, посты за который нужно удалить\n(например: 2024, 2023, 2022)', currentYear)); // Проверка корректности года if (isNaN(targetYear) || targetYear < 2000 || targetYear > currentYear) { alert('Некорректный год! Будет использован текущий год: ' + currentYear); targetYear = currentYear; } // Точная настройка паузы между удалениями var pauseInput = parseFloat(prompt('Пауза между удалениями постов (секунды)\n\nРекомендации:\n• 0.1-0.3 - Максимальная скорость (риск ошибок)\n• 0.5-1.0 - Баланс скорости и надежности\n• 1.5-3.0 - Максимальная надежность', '0.5')); // Проверка и ограничение паузы if (isNaN(pauseInput) || pauseInput < 0.1) { pauseInput = 0.1; } else if (pauseInput > 3) { pauseInput = 3; } deletePause = pauseInput * 1000; test = confirm("⚡ НАСТРОЙКИ УДАЛЕНИЯ:\n\n• Год: " + targetYear + "\n• Пауза между удалениями: " + pauseInput + " сек." + "\n• Медиа заблокированы: Да\n\nНачать удаление?"); if (test) { console.log('⚡ ЗАПУСК С НАСТРОЕННЫМИ ПАРАМЕТРАМИ'); console.log('🎯 Целевой год: ' + targetYear); console.log('⏱️ Пауза между удалениями: ' + pauseInput + ' сек.'); createControlPanel(); startContinuousDeletion(); } } function startContinuousDeletion() { console.log('🔄 Начинаем непрерывное удаление...'); updateControlPanel(); processPostsContinuously(); } function processPostsContinuously() { if (!test) { console.log('⏸️ Скрипт на паузе'); return; } console.log(`\n=== ПОИСК ПОСТОВ ЗА ${targetYear} ГОД ===`); var posts = document.querySelectorAll('div._post'); console.log(`📊 На странице: ${posts.length} постов`); if (posts.length === 0) { console.log('📭 Постов не найдено, пытаемся загрузить...'); loadMorePosts().then((success) => { setTimeout(processPostsContinuously, 1000); }); return; } var postsToDelete = []; for (var i = 0; i < posts.length; i++) { var post = posts[i]; var postDate = extractDateFromPost(post); if (postDate && postDate.getFullYear() === targetYear) { postsToDelete.push({ element: post, date: postDate, index: i }); } } console.log(`🎯 Найдено постов за ${targetYear} год: ${postsToDelete.length}`); // Показываем информацию о найденных постах if (postsToDelete.length > 0) { console.log('📅 Даты найденных постов:'); postsToDelete.forEach(post => { console.log(' - ' + post.date.toLocaleDateString()); }); } if (postsToDelete.length > 0) { console.log('🔥 Начинаем удаление...'); deletePostsSequentially(postsToDelete, 0, () => { console.log(`✅ Удаление завершено. Всего удалено: ${count}`); updateControlPanel(); setTimeout(processPostsContinuously, 500); }); } else { console.log('📭 Постов за ' + targetYear + ' год не найдено, загружаем следующую страницу...'); loadMorePosts().then((success) => { setTimeout(processPostsContinuously, 1000); }); } } function loadMorePosts() { return new Promise((resolve) => { console.log('🔍 Поиск пагинации для загрузки следующей страницы...'); // Ищем кнопку "1" в пагинации (первая страница) var paginationButton = findPaginationButton(); if (paginationButton) { console.log('✅ Найдена кнопка пагинации, нажимаем...'); paginationButton.click(); console.log('⏳ Ждем загрузки новой страницы (3 секунды)...'); setTimeout(() => { // Прокручиваем немного для стимуляции загрузки window.scrollTo(0, 100); setTimeout(() => { console.log('✅ Новая страница загружена'); resolve(true); }, 1000); }, 3000); } else { console.log('❌ Кнопка пагинации не найдена, пробуем альтернативные методы...'); // Альтернативные методы загрузки var alternativeButtons = [ document.querySelector('#fw_load_more.pg_more_link'), document.querySelector('#wall_more_link'), document.querySelector('.wall_more_link'), document.querySelector('.pg_more_link'), findElementByText('к предыдущим постам') ]; var foundButton = alternativeButtons.find(btn => btn !== null); if (foundButton) { console.log('✅ Найдена альтернативная кнопка, нажимаем...'); foundButton.click(); console.log('⏳ Ждем загрузки постов (4 секунды)...'); setTimeout(() => { console.log('✅ Посты загружены через альтернативную кнопку'); resolve(true); }, 4000); } else { console.log('❌ Ни одна кнопка не найдена, используем прокрутку...'); var oldCount = document.querySelectorAll('div._post').length; window.scrollTo(0, 0); setTimeout(() => { window.scrollTo(0, document.body.scrollHeight); console.log('⏳ Ждем загрузки постов после прокрутки (5 секунд)...'); setTimeout(() => { var newCount = document.querySelectorAll('div._post').length; if (newCount > oldCount) { console.log(`✅ Загружено ${newCount - oldCount} постов через прокрутку`); resolve(true); } else { console.log('❌ Не удалось загрузить новые посты через прокрутку'); resolve(false); } }, 5000); }, 1000); } } }); } // Функция поиска кнопки пагинации "1" function findPaginationButton() { // Ищем все элементы пагинации var paginationContainers = [ document.querySelector('.pagination_page'), document.querySelector('.pagination_pages'), document.querySelector('.page_list'), document.querySelector('.pagination_list'), document.querySelector('[data-module="uiPagination"]'), document.querySelector('.ui_pagination') ]; // Ищем в контейнерах пагинации for (var container of paginationContainers) { if (container) { // Ищем кнопку с цифрой "1" var button = container.querySelector('a[href*="offset=0"], a[href*="page=1"], .pagination_page:first-child, .page:first-child'); if (button) return button; // Ищем по тексту "1" var buttons = container.querySelectorAll('a, span, .page, .pagination_page'); for (var btn of buttons) { if (btn.textContent && btn.textContent.trim() === '1') { return btn; } } } } // Ищем по всему документу ссылки с offset=0 var offsetLinks = document.querySelectorAll('a[href*="offset=0"]'); for (var link of offsetLinks) { if (link.textContent && link.textContent.trim() === '1') { return link; } } // Ищем любую кнопку с цифрой "1" в вероятных контейнерах пагинации var allButtons = document.querySelectorAll('a, span, .page, .pagination_page, .ui_pagination a'); for (var btn of allButtons) { if (btn.textContent && btn.textContent.trim() === '1' && (btn.href && btn.href.includes('wall') || btn.parentElement && btn.parentElement.className.includes('pagination'))) { return btn; } } return null; } function findElementByText(text) { var elements = document.querySelectorAll('a, span, div, button'); for (var i = 0; i < elements.length; i++) { var element = elements[i]; var elementText = element.textContent || element.innerText; if (elementText && elementText.trim() === text) { return element; } } return null; } function extractDateFromPost(postElement) { try { var dateElement = postElement.querySelector('.PostDateBlock__root'); if (dateElement) { var dateText = dateElement.textContent || dateElement.innerText; if (dateText) { return parseDateFromText(dateText); } } var likeWrap = postElement.querySelector('.like_wrap'); if (likeWrap) { var likeText = likeWrap.textContent || likeWrap.innerText; if (likeText) { return parseDateFromText(likeText); } } } catch (e) { return null; } return null; } function parseDateFromText(text) { if (!text) return null; text = text.replace(/\s+/g, ' ').trim(); var datePatterns = [ /(\d{1,2})\s+(янв|фев|мар|апр|май|июн|июл|авг|сен|окт|ноя|дек)\s+(\d{4})/i, /(\d{1,2})\s+(января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября|декабря)\s+(\d{4})/i ]; for (var pattern of datePatterns) { var match = text.match(pattern); if (match) { var day = parseInt(match[1]); var monthStr = match[2].toLowerCase(); var year = parseInt(match[3]); var months = { 'янв': 0, 'января': 0, 'фев': 1, 'февраля': 1, 'мар': 2, 'марта': 2, 'апр': 3, 'апреля': 3, 'май': 4, 'мая': 4, 'июн': 5, 'июня': 5, 'июл': 6, 'июля': 6, 'авг': 7, 'августа': 7, 'сен': 8, 'сентября': 8, 'окт': 9, 'октября': 9, 'ноя': 10, 'ноября': 10, 'дек': 11, 'декабря': 11 }; var month = months[monthStr]; if (month !== undefined) { return new Date(year, month, day); } } } return null; } function deletePostsSequentially(posts, currentIndex, callback) { if (currentIndex >= posts.length || test === false) { callback(); return; } var post = posts[currentIndex]; deleteSinglePost(post.element).then(() => { count++; console.log(`✅ Удален пост ${currentIndex + 1}/${posts.length}. Всего: ${count}`); // Используем настроенную пользователем паузу console.log(`⏱️ Ждем ${deletePause/1000} сек. перед следующим удалением...`); setTimeout(() => { deletePostsSequentially(posts, currentIndex + 1, callback); }, deletePause); }).catch((error) => { console.error('❌ Ошибка:', error); // При ошибке используем стандартную паузу 100мс setTimeout(() => { deletePostsSequentially(posts, currentIndex + 1, callback); }, 100); }); } function deleteSinglePost(postElement) { return new Promise((resolve, reject) => { try { var menuButton = postElement.querySelector('[data-testid="post_context_menu_toggle"]'); if (!menuButton) { reject('Кнопка меню не найдена'); return; } menuButton.click(); setTimeout(() => { var deleteButton = document.querySelector('[data-testid="post_context_menu_item_delete"]'); if (!deleteButton) { reject('Кнопка удаления не найдена'); return; } deleteButton.click(); setTimeout(() => { var confirmButton = document.querySelector('.vkuiButton--mode-primary'); if (confirmButton) { confirmButton.click(); } postElement.remove(); resolve(); }, 200); }, 200); } catch (error) { reject(error); } }); } function showFinalStats() { var message = `🎉 УДАЛЕНИЕ ЗАВЕРШЕНО!\n\n• Год: ${targetYear}\n• Удалено постов: ${count}\n• Пауза между удалениями: ${deletePause/1000} сек.`; alert(message); console.log(message); updateControlPanel(); } // Запускаем скрипт itit(); // КОМАНДЫ ДЛЯ УПРАВЛЕНИЯ: // - test = false // Остановить скрипт // - restartWithNewSettings() // Перезапуск с новыми настройками // - quickSettings() // Быстрые настройки паузы // - resetStopButton() // Сброс кнопки остановки
Как быстро удалить записи со стены «ВКонтакте»
Задача — дойти до школы самому: как подготовить ребёнка и убедиться, что всё будет в порядке&nbsp;

Задача — дойти до школы самому: как подготовить ребёнка и убедиться, что всё будет в порядке  

Лайфхакер
Информация
О проектеРубрикиРекламаРедакцияВакансииДля начинающих авторовО компании
Подписка
TelegramВКонтактеTwitterViberYouTubeИнициалRSS
Правила
Пользовательское соглашениеПолитика обработки персональных данныхПравила применения рекомендательных технологийПравила сообществаСогласие на обработку персональных данныхСогласие для рекламных рассылокСогласие для информационной программы
18+Копирование материалов запрещено.
Издание может получать комиссию от покупки товаров, представленных в публикациях