Постовой: Часто нет времени прочитать книгу для души. Аудиокниги из серии Модель для сборки
В качестве эксперимента и скорее хака придумался способ создать блок ссылок, который не будет индексироваться. Смысл в том, что поисковики не индексируют яваскрипт. Например, я хочу прорекламировать сайты, но не явно. Если кто-то хочет посмотреть – посмотрит, другие нет.
Смысл в том, чтобы засунуть текст в переменную JavaScript, а по клику на ссылку дать диву ее содержимое. Работает следующим образом:
<script> var sometext = «Это текст, который не должен индексироваться поисковиками.<br>Например, куча говноссылок на говносайты. Ура!»;</script>
<a href=»javascript: void();» onclick=»document.getElementById(‘text’).innerHTML = sometext;»>Крутые сайты</a><div id=»text»></div>
Зачем, спрашивается, очередной способ скрыть блок, если есть nofollow, noindex? Не знаю. Просто пришла в голову идея.
Давненько раздражал меня виджет Meta. Все, кто пользуется платформой WordPress должны были заметить, что при добавлении этого виджета в сайдбар он добавляет не только ссылки «администрирование» и »выйти», но еще и предательские прямые (т.е. без nofollow-noindex) ссылки на сайт разработчиков платформы. Из-за чего слабые духом и вовсе отказывались от виджетов, делали весь дизайн как статический файл. А ведь виджеты – это действительно удобно.
Сейчас, дети мои, я расскажу, как вырезать ненужное нам барахло из виджетов для WordPress 3.0.4 (впрочем, я почти уверен, что способ подходит и для более старых версий и будет подходить для более новых).
Идем в файл /wp-include/default-widgets.php и ищем в нем строчку 280 (у меня), которая начинается на «class WP_Widget_Meta extends WP_Widget».
И приводим HTML-блок в следующий вид (или любой нужный Вам вид):
<ul>
<?php wp_register(); ?>
<li><?php wp_loginout(); ?></li>
<?php wp_meta(); ?>
</ul>
Таким образом мы удалили все ненужные нам ссылки из виджета meta. Возможно, для разных версий будут какие-то отличия, поэтому можете писать в комментариях вопросы с указанием версии WP.
Постовой (*): Комплексная оптимизация и продвижение сайта – основные направления деятельности нашей Компании.
Сразу оговорюсь. Скрипт не полностью автоматический, удаляет сообщения только с текущей страницы стены. Связано это с тем, что написан на коленке в 5 утра, с другой стороны с тем, что я не придумал как перезагружать страницу так, чтобы скрипт оставался в памяти браузера (поэтому если у кого-то есть идеи прошу отписаться во благо всех нас, Великого Павла Дурова и Господа Нашего Б-га, аминь).
С другой стороны, так за 2 минуты можно очистить больше сотни сообщений – а что еще нужно? У меня за 3 года накопилось всего 500, а удаление заняло минут 5 (всплакнул крупной суровой мужской слезой).
Скрипт лучше рассматривать как тренировку JavaScript для программистов и баттхерт для простых пользователей (почему – смотри ниже). Поэтому если ты, дорогой читатель, «простой пользователь», немного пошевелить разными там химикалиями в мозгах все же придется (можно сразу смотреть «Часть 3″).
Часть 1. Обратите внимание на кавычки! При перепечатке в блог они «поехали», нужно подправить вручную. Начну с обзора того, что мы будем делать. Стена ВКонтакте располагается по адресу vkontakte.ru/wall.php. Если мы заглянем в код страницы и посмотрим на ссылку удаления, то увидим следующее:
То есть совершенно недвусмысленно понятно, что у ВКонтакта есть функция 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 регулярным выражениям (подробнее, например, здесь).
Регулярные выражения в 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, позволяющее сделать то же самое (описывать его я здесь не буду и если будут вопросы – велкам в комментарии).
Узнал с хабра о Zen Coding. Заинтересовался, что это такое. Какие-то непонятные символы, похожие на CSS и все радуются и благодарят автора(-ов), придумавшего(-их) Zen Coding… Погуглил. А теперь сам всем рекомендую. Эту идею действительно есть смысл продвигать в массы, чем я сейчас и займусь.
Итак, начнем. Чтобы лучше всего понять, рекомендую посмотреть видео.
Например. Открываем редактор, пишем там строчку:
div#content>h1+p
Жмем «Ctrl + ,» и строка разворачивается в код:
<div id="content"> <h1></h1> <p></p> </div>
Другими словами – мы коротко записываем выражение, жмем «секретную комбинацию» и получаем готовую болванку кода! Самый наглядный (и немного шокирующий пример) будет, если написать:
Удивительно, правда? :) Zen Coding помогает сократить время написания кода… в разы! Поэтому рекомендуется к изучению. «Технология» новая, чтобы работала в вашем редакторе, понадобится скачать плагины.
Полный список плагинов есть тут: http://code.google.com/p/zen-coding/. Собственно, официальный сайт пока что не работает, поэтому и документацию Вы можете найти там же. Для каждого тега есть описание и его «короткий вариант». Например, простое «table+» даст нам:
Чтобы попробовать, без установки плагинов в редактор, авторы создали демо-приложение в веб вот здесь. Это же и официальный сайт, но он пока что не работает.
Увидел я на одном блоге интересную штуку – не стандартный счетчик фидбернера, а подпись текстом: подписчиков столько-то. Заинтересовался. И понеслась.
Оказалось, что у FeedBurner’а есть свой API! Для нашего случая нужно знать следующее. Получить данные (в формате XML) можно по GET запросу http://feedburner.google.com/api/awareness/1.0/GetFeedData?uri=[здесь название подписки].