Удаление сообщений со стены ВКонтакте (пишем скрипт).

программирование

разу оговорюсь. Скрипт не полностью автоматический, удаляет сообщения только с текущей страницы стены. Связано это с тем, что написан на коленке в 5 утра, с другой стороны с тем, что я не придумал как перезагружать страницу так, чтобы скрипт оставался в памяти браузера (поэтому если у кого-то есть идеи прошу отписаться во благо всех нас, Великого Павла Дурова и Господа Нашего Б-га, аминь).

С другой стороны, так за 2 минуты можно очистить больше сотни сообщений – а что еще нужно? У меня за 3 года накопилось всего 500, а удаление заняло минут 5 (всплакнул крупной суровой мужской слезой).

Скрипт лучше рассматривать как тренировку JavaScript для программистов и баттхерт для простых пользователей (почему – смотри ниже). Поэтому если ты, дорогой читатель, «простой пользователь», немного пошевелить разными там химикалиями в мозгах все же придется (можно сразу смотреть «Часть 3″).

Часть 1. Обратите внимание на кавычки! При перепечатке в блог они «поехали», нужно подправить вручную. Начну с обзора того, что мы будем делать. Стена ВКонтакте располагается по адресу vkontakte.ru/wall.php. Если мы заглянем в код страницы и посмотрим на ссылку удаления, то увидим следующее:

<a href=»» onclick=»(deletePost(…));return false;»>Удалить</a>

То есть совершенно недвусмысленно понятно, что у ВКонтакта есть функция deletePost, которая и применяется. Например, все скрипты, которые я смог нагуглить применяли давно устаревший API, из-за чего и не работали.

Мы знаем, что в JavaScript любой код можно исполнить с помощью функции eval(). Например код:

eval («alert (‘a’)»);

выдаст нам окошко с сообщением «а». То есть функции eval мы передаем строку, которую она выполняет как если бы такой же javascript был написан в сценарии

Кроме того, нужно не забывать, что работать скрипт должен по таймеру. Сервер просто не успеет обработать 20 запросов (а именно столько сообщений на одной странице) за секунду и просто напросто не ничего удалит. И хорошо, если еще и бан не получим.

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

Часть 2. Теперь сам скрипт и как он работает.

var i = 0 , step_t;

function Step(){
	var myregexp = /<a onclick="(deletePost\(.+\));return false;">Удалить<\/a>/g;
	var match = myregexp.exec(document.body.innerHTML);
	if(match != null){
		eval (match[1]);
		i = i + 1;
	}

	if (i >= 20){
		clearInterval (step_t);
	}
}

if (confirm('Удалить все сообщения со стены?') == true){
	step_t = setInterval("Step()", 500);
}

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

При старте скрипта мы выводим сообщение с помощью confirm (Yes/No Dialog Box) и проверяем ответ. Если ответ был «Да» («Ок» и т.п.), то мы запускаем таймер с помощью setInterval. Таймер срабатывает каждые пол-секунды (второй параметр) и вызывает при каждом срабатывании функцию Step(). Идентификатор таймера step_t (от step timer).

Отлично, теперь таймер запущен и каждые пол-секунды вызывается функция Step(), где и спрятан по сути весь скрипт.

Первым делов в этой функции мы находим на странице строку, содержащую deletePost и вытаскиваем её целиком.

Регулярные выражения в JavaScript можно инициализировать с помощью строки вида /pattern/mods. Где под pattern понимается само регулярное выражение, под mods – модификаторы. Как обычно, все символы «/» нужно закрыть слева-стоящим  »\» если они не являются модификаторами.

При этом здесь мы используем простую конструкцию «.+». Символ «точка» означает в ней «любой символ», а «плюс» – «один или больше». То есть получается «один или больше одного любых символов». Скобками нужно отметить тот участок, который мы хотим выцепить в результате. И, конечно, надо учитывать, что если скобка есть в самой строке, по которой мы делаем поиск, то её нужно «экранировать» с помощью «\».

После всего этого регулярка «запускается» с помощью pattern.exec(string), где pattern – наша регулярка, string – то, по чему мы будем искать, а exec – функция выполнения.

Краткая справка закончена, всем спасибо. *кланяется*

Итак, мы создаем регулярное выражение вида «/<a href=»» onclick=»(deletePost\(.+\));return false;»>Удалить<\/a>/g» (хочу обратить внимание, что в коде оно должно использоваться без кавычек). И обрабатываем с его помощью все тело документа (которое хранится, как мы знаем, в document.body.innerHTML).

Как итог вечеринки найденная строка попадает в match[1] (ибо сам по себе match – это массив строк; например в match[0] хранится полностью найденное выражение, а match[2] не существует, т.к. скобками, с помощью которых «выцепляется» нужный фрагмент, у нас «огорожен» только один кусок).

Дальше все еще проще. В match[1] у нас попадает строка вида «deletePost(…)». Нам нужно её просто выполнить. Поэтому мы используем eval() и передаем ему в качестве аргумента найденное значение (ведь оно содержит уже и имя выполняемой функции – deletePost).

На всякий случай добавлена проверка – если match равен null, значит мы ничего не нашли и удалять нам нечего.

Счетчик i служит для определения – сколько сообщений мы уже удалили. Мы знаем, что на странице у нас всего 20 сообщений, поэтому добавлено условие i >= 20. Когда это условие выполняется, мы останавливаем таймер с помощью clearInterval() (функция принимает на входе идентификатор таймера).

Вот, собственно и вся логика работы скрипта.

Часть 3. Лично я «сижу» в Chrome, поэтому, чтобы запустить скрипт, мне нужно сделать следующее:

1) Перейти на страницу vkontakte.ru/wall.php
2) Нажать правой кнопкой куда-нить и выбрать «Проверить элемент». Откроется новое окно.
3) В нем нажать «Console», скопировать туда весь скрипт целиком и нажать Enter.

Для пользователей FireFox существует дополнение FireBug, позволяющее сделать то же самое (описывать его я здесь не буду и если будут вопросы – велкам в комментарии).

Related posts

Оставить комментарий