Зачем нужны, чем могут помочь и где они обитают
Зачем нужны, чем могут помочь и где они обитают
@flyink (Котляров Евгений)
Код, который хранится у пользователя и выполняет заданные действия.
Проект Greasemonkey написан Aaron Boodman в 28 ноябре 2004 года, который был вдохновлен Firefox расширением, которое очищало интерфейс сайта AllMusic. К маю 2005 года для Greasemonkey было создано около 60 общих и 115 специфичных для сайта пользовательских скриптов.
С февраля 2009 года в Google Chrome появилась встроенная поддержка пользовательских скриптов в формате Greasemonkey, но позже установка пользовательских скриптов с посторонних доменов была отключена.
Tampermonkey был написан Jan Biniok в мае 2010 года из Greasemonkey, который уже был встроен в Chrome, но не имел полной совместимости.
An open-source userscript manager for Safari
Android | iOS | Linux | macOS | Windows | |
---|---|---|---|---|---|
Chrome |
![]() |
![]() ![]() |
![]() ![]() |
![]() ![]() |
|
Edge |
![]() |
||||
Firefox |
![]() ![]() ![]() |
![]() ![]() ![]() |
![]() ![]() ![]() |
![]() ![]() ![]() |
|
Opera |
![]() ![]() |
![]() ![]() |
![]() ![]() |
||
Safari |
![]() |
![]() ![]() |
|||
Yandex Browser |
![]() ![]() |
![]() ![]() |
![]() ![]() |
![]() ![]() |
// ==UserScript==
// @name New Userscript
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author You
// @match https://vk.com/
// @grant none
// ==/UserScript==
Подробнее о Метаданных пользовательских скриптов: tampermonkey.net/documentation.php
// @name Название скрипта
// @namespace http://domain.com/
// name + namespace - формируют id скрипта
// @version 0.1
// @description Описание
// @author Автор
(function() {
'use strict';
console.log('hello', location.pathname);
})();
PS: Тут в хроме можно переключать контекст
// Добавить
// @include https://domain.com/*
// Исключить
// @exclude https://domain.com/image/
// Отключить в фреймах
// @noframes
(function() {
'use strict';
const onDone = () => { document.body.style = 'green'; };
ajax.post('https://vk.com/foaf.php?id=1', {}, { onDone });
})();
... Полноценный доступ есть только через к DOM дереву страницы.
С контент скрипта вы можете инициировать ивенты, изменять DOM.
Даже можете добавлять script тег в страницу ...
Aleks Zinevych. Google Chrome Extensions — Часть 1. Архитектура
В Greasemonkey можно использовать @grant GM.unsafeWindow. Tampermonkey сам пробрасывает переменные.
(function injectScript(fn) {
var script = document.createElement('script');
script.textContent = '(' + fn + ')();';
script.id = fn.name;
document.head.appendChild(script);
})(function TryAjax() {
const onDone = () => { document.body.style = 'green'; };
ajax.post('https://vk.com/foaf.php?id=1', {}, { onDone });
});
Помогает отслеживать изменения в дереве элементов
searchGreenElements(document.body);
new MutationObserver(function onMutations(mutations) {
mutations.forEach(function onMutation(mutation) {
searchGreenElements(mutation.target);
});
}).observe(document.body, {
subtree: true,
childList: true,
});
Реагируем нужные нам действия
window.addEventListener('keydown', function onKeyDown(event) {
if (event.target.classList.contains('support_input')) {
showAndFilterHelpList(event.target);
}
});
Ловим чтение и запись в обьектах
Object.defineProperty(store, "adsLists", {
set: function() {
// хе-хе
return [];
},
get: function() {
return [];
}
});
Заменяем аргументы и результаты функций
ajax.post = (function replaceFunction(ajaxPost) {
return function ajaxPostFake() {
var query = arguments[1];
if (/^хз/i.test(query.msg)) {
query.msg = 'Не знаю';
}
return ajaxPost.apply(this, arguments);
}
})(ajax.post);
С помощью @grant вы перечисляете все функции, которые хотите вызвать
// Получение метаданных скрипта:
// @grant GM.info
// Аналог localStorage в контексте расширения:
// @grant GM.deleteValue/getValue/setValue/listValues
// Вывод уведомлений:
// @grant GM.notification
// Открытие новой вкладки:
// @grant GM.openInTab
// Копирование в буффер обмена
// @grant GM.setClipboard
Запрос ресурсов с другого сайта. Возвращает Data URL.
// ...
// @resource logo ../icons/laptop.png
// @grant GM.getResourceUrl
(async () => {
let img = document.createElement("img");
img.src = await GM.getResourceUrl("logo");
document.body.appendChild(img);
})();
Позволяет делать запросы к другом сайтам
// ...
// @connect api.vk.com
// @grant GM.xmlHttpRequest
GM.xmlHttpRequest({
method: "GET",
url: "http://api.vk.com/method/users.get",
onload: ({ response }) => {
console.log(response);
}
});
// ==UserScript==
// @name MenuExample
// @include https://vk.com/*
// @grant GM_registerMenuCommand
// ==/UserScript==
GM_registerMenuCommand('doSomeMagic', function() {
alert('doSomeMagic');
}, 'r');
* - но только в Google Chrome
// ==UserScript==
// @name onContextMenu > doSomeMagic
// @author FlyInk13
// @include https://vk.com/*
// @run-at context-menu
// ==/UserScript==
(function onContextMenu() {
alert('doSomeMagic');
})();
// @updateURL https://openuserjs.org/....js
Закладки, в адресе которых прописан JavaScript код, выполняемый при их открытии
AppleScript, JavaScript & Shell
Когда компилировать и публиковать официальные плагины сложно
LivePlugin Kotlin & Groovy