Как стать автором
Обновить

Комментарии 44

> P.S. Хотелось бы увидеть блог Userscripts на хабре. Ибо не одним GreaseMonkey едины.

надо GreaseMonkey переименовать в Userscripts, т.к. это будет правильней, ведь GM лишь дополнение для лисы, добавляющая поддержку и управление юзерскриптами, но во-первых эти скрипты работают не только в лисе, а и в других браузерах, а во-вторых — для лисы есть более хорошее дополнение Scriptish (https://addons.mozilla.org/ru/firefox/addon/scriptish/ ), который наследует все фичи GM, но имеет перед ним некоторые преимущества (за счёт удаления обратной совместимость со старыми версиями лисы, например).
Поддерживаю — переименовать на userscripts или Пользовательские скрипты, потому что даже в Firefox есть более быстро развивающийся клон Scriptish, а остальное описал автор — в каждом браузере есть ворох способов подключения юзерскриптов. При этом различия разработчики стремятся минимизировать.
Удаление само по себе — не преимущество. А какие ещё?
В вики скриптиша можно посмотреть его features.
Спасибо за статью. Кстати, увидел недавно новость, что кроссбраузерный фреймворк для создания расширений Kango, о котором ранее писали на хабре, начал на днях поддерживать юзерскрипты (статья в блоге). Было бы классно увидеть больше постов на хабре по использованию этой технологии.
Спасибо за интересную статью. Кстати, на днях узнал, что кроссбраузерный фреймворк Kango, о котором ранее писали на хабре, начал поддерживать юзерскрипты (статья в блоге). Интересно было бы почитать и об этой технологии.
Да что же комментарии появляются только через 10 минут после того, как запостишь.
хабраэффект на хабре…
От юзерскрипта до расширения в некоторых случая «рукой подать».

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

Так вот, для того, чтобы решить большую часть «продвинутых» проблем (к примеру, не доступный document.frames[i].parent) в Google Chrome, скрипт приходится упаковывать в простейшее расширение.

Спасибо за наводку на Kango, я этот фреймворк как-то упустил. Потестирую на новых проектах.
Спасибо, ссылка на компилятор есть в статье.

Простой способ упаковывания юзерскриптов в расширения для хрома я обещаю осветить в следующей статье (шаблон опять одинаковый и может быть использован во всех последующих юзерскриптах).
упс, не заметил её в статье
А вообще — я вот в JS пока ни бум-бум, а вот CSS знаю достаточно хорошо, для моих целей.
И вот иногда хочется на страничку какой-нибудь объект добавить (а это уже нельзя сделать с помощью CSS) и не знаю как. Возможно ли создать какой-то готовый юзерскрипт, исполняя который (вызвав его по хоткею, например, или через команды скрипта, о которых вы, кстати, в статье почему-то промолчали), вылезала бы штука, которая просила бы навести куда-нибудь на странице, чтобы там создать объект, а после подтверждения создания — создавался бы новый юзерскрипт, добавляющий этот объект на ту страницу.

Т.е. не могли бы вы (или, может, кто-то другой) создать юзерскрипт для простого создания юзерскриптов?

В моём понимании он должен работать по такому сценарию:
1. Спросить юзера куда на странице добавить объект(ы).
2. Спросить какой тип объекта должен быть (картинка (кликабельная ли?), таблица или блок (со смешанными данными (текст+картинки)).
3. Создать новый юзерскрипт с соответствующим кодом.

А дальше можно было бы улучшать этот скрипт всякими функциональными довесками.

Многим юзерам просто не требуются какие-то сверхумные вещи приделывать, им обычно надо что-нибудь простенькое, типа добавить кликабельную картинку на страницу, которая будет вести на такую-то страницу (актуально для многих форумов, у которых логотип либо не является ссылкой куда-то вообще, либо ведёт на главную страницу сайта, а не в корень форума, или наоборот).
Если вы «не бум-бум» в JS, то самое время начать его изучать. Как показал мой небогатый опыт, человек, не знакомый с javascript и программированием (нулевой уровень), может освоить javascript и написание юзерскриптов за пол года.

Если у вас есть знакомый javascript-порграммист (или веб-программист в общем случае), начните осаждать его вопросами (в умеренном количестве). Любой грамотный программист поможет вам советом.

Если такого знакомого нет — начните с форумов. На userscripts.org на самом деле отзывчивый и дружелюбный к новичкам форум. Одна проблема — он на английском.
Русскоязычных аналогов мне, к сожалению, не известно.

Что касается «конструктора», то рецепт для «непрограммистов» есть в статье.

Вам осталось найти адекватного программиста, который «вправит вам мозги» и направит на путь постижения javascript :)
Начать писать, всё же, лучше обычные скрипты, одновременно постигая, что в юзерскриптах трудно сделать, а что — нельзя. (Например, многократно упоминаемая недоступность window в Хроме, решается парой различных способов — исполнением скриптов через eval() (фактически) текста в объекте DOM или загрузкой скрипта как файла в элемент script.)
Согласен с вами, но частично.

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

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

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

Предположим, у вас есть сайт. И на этом сайте вы активно пропогандируете некий полезнейший скрипт.
Как показывает статистика, только 10% пользователей, посетивших вашу целевую страницу, установят скрипт.

Проблем несколько, но самых важных, на мой взгляд, две:
1. Пользователи не доверяют «непонятным» скриптам и программам.
2. Пользователи не умеют устанавливать скрипты в свои браузеры.

Если первую проблему решить в локальном масштабе довольно сложно, то вторая проблема может быть уменьшена следующими способами:
1. Пакуем скрипт в расширение и добавляем на официальные страницы расширений. (Этот способ я лично не проверял, но отзывы слышал очень лестные.)
2. Уменьшаем число необходимых расширений для запуска скрипта. (Этот способ даёт около +5% установок пользователями Google Chrome).

Статистические данные анализировались на нескольких средних проектов (до 5000 пользователей юзерскриптов).
кстати, вот бы хотелось возможность стартовать скрипт до загрузки всего и вся, например, чтобы подменить User-Agent.
Такое можно делать только из расширения, да и то, далеко не во всех браузерах.
установи User Agent Switcher
и подменяй на какой тебе надо
Обычно одним из немаловажных плюсов юзерскриптов является наличие «правильного» User-Agent.
Это делает запросы скрипта «неотличимыми» от запросов, сделанных пользователем.

Вообще, используя юзерскрипты удобно писать ботов для различных сайтов.
При правильном подходе можно добиться того, что бота можно вычислить только по нечеловеческому поведению (у среднестатистического бота просматривается чёткий паттерн поведения, отличный от человеческого).
var w = unsafeWindow || window;
Возможно, я вас удивлю, но ваш способ не будет работать как минимум в Opera.
Правильным является вариант, указанный в шаблоне.
Конечно удивит, потому что это не способ, а обычный синтаксис js. Почему не будет?
Условности окружения.

Юзерскрипты в GreaseMonkey запускаются в песочнице, где unsafeWindow определено изначально.
В Google Chrome юзерскрипты запускаются в замыкании, в котором есть параметр unsafeWindow, но как показала практика он не несёт особого смысла.
В Opera переменной unsafeWindow не существует — ссылка не определена. Интерпретатор выдаст
Undefined variable: unsafeWindow
.

Вы можете проверить это сами, создайте юзерскрипт со следующим содержанием и проверьте его исполнение в опера (заодно посмотрите, через какую ж как неудобно в опере устанавливать юзерскрипты):
// ==UserScript==
// @name SugarTest 
// @author Me
// @license none
// @version 1.0
// @include http://habrahabr.ru/
// ==/UserScript==
(function(window, undefined ) {
var w = unsafeWindow || window;
 alert(w);
})(window);


После установки скрипта зайдите на хабр и посмотрите в консоль ошибок (Shift+Ctrl+O).
Oops… писал с телефона, поторопился.

var w = window.unsafeWindow || window;
конечно же.
Тут вы, конечно же, правы. Данный кусок кода будет работать.
К тому же, его можно переписать как
window.unsafeWindow = window.unsafeWindow || window;

В этом случае у нас будет объект unsafeWindow, привычный разработчикам под GreaseMonkey :)

Но я считаю, что это дело вкуса.
window.unsafeWindow ||= window;
тогда уж.
Вы ерунду на ходу сочиняете, путаете людей. Проверяйте свой код в консоли хотя бы.
Макароны.
Вы слишком агрессивны. Да, я ошибся, что теперь?
GM может отключить анимацию гифок на странице? Если может то какой функцией?
Насколько я знаю — не может.

Есть скрипты, в которых гифка преобразуется в data:uri, и в ней подменяются байты, отвечающие за скорость анимации.
Я не проверял, работает ли такой подход, и не знаю, насколько он оправдан.
Оно! Подредактировав делает то что нужно — отключение анимации на указанных сайтах.
Спасибо!
В ff кнопкой Esc останавливается анимация.
давно пишу юзерскрипты, только без ГМ.
таким способом
javascript:(function(){document.getElementsByTagName('head')[0].appendChild(document.createElement('SCRIPT')).src='http://127.0.0.1/user.js';})();

сервачёк правда нужен
Это не совсем юзерскрипт, а скорее аналог прокси-инъекции, инъекция скрипта через букмарклет :)

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

В статье написано много и по делу, но не озвучен самый главный вопрос: как устанавливать юзер-скрипты в браузер?
Да, за этот промах каюсь.

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

Ждите, вторая статья на подходе :)
это же гуглится элементарно для своего браузера, пусть лучше статьи будут про интересное.
Побуду занудой: «unsafeWindow» — он не спроста так называется. GM дает пользовательским скриптам доступ к допольнительному (небезопасному) API и если вы не специалист в JS и не имеете четкого понимания концепции безопасности в GM, то при использовании unsafeWindow вы скорее всего выстрелите себе в ногу. Лучше вместо этого по-возможности использовать window (безопасную обертку, специально для вас сделанную).
Сегодня как раз изучал эту тему, но в моем js скрипте мне надо было еще подключить css файл, и знаете я еле нашел такое расширение, причем ни GM ни Tampermonkey не дают просто так пользоваться css, хотя это очень странно, потому что весь остальной функционал очень даже хорош.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации