Greasemonkey

Transkript

Greasemonkey
Greasemonkey
Uživatelské skriptování (nejen) ve Firefoxu
Úvod
•
Co jsou uživatelské skripty?
•
•
•
K čemu je to dobré?
•
•
Umožňují spouštět uživatelem definované skripty
na (cizích) webových stránkách
Typicky v JavaScriptu
Přidání funkčnosti, změna vzhledu, ...
Co je Greasemonkey?
•
•
Rozšíření do Firefoxu, které toto umožňuje
Sám od sebe nedělá nic, jen zprostředkovává spouštění
skriptů
Motivace
•
Čeho se dá s Greasemonkey dosáhnout?
•
Book Burro
„Hello World“ skript v Greasemonkey
•
helloworld.user.js
//
//
//
//
//
==UserScript==
@name
Hello World
@description
display "Hello World" on every page
@include
*
==/UserScript==
alert('Hello, world!');
Instalace a spuštění skriptu
•
Instalace se spustí automaticky při otevření
libovolného souboru *.user.js ve Firefoxu (pokud
je nainstalován Greasemonkey plugin)
Metadata
•
U každého skriptu jsou metainformace, které
určují název skriptu, kdy se má spouštět, …
//
//
//
//
//
//
//
//
•
==UserScript==
@name
Hello World
@namespace
http://www.example.com/
@description
"Hello World" on every page
@include
*
@exclude
http://google.com/*
@exclude
http://www.google.com/*
==/UserScript==
@exclude má přednost před @include
Příklad využití Greasemonkey
•
Google Image Search
•
•
Odkazy z obrázků vedou na frameset, kde je thumbnail
a až po kliknutí na něj se zobrazí žádáný obrázek
Chceme změnit toto chování, aby odkaz vedl rovnou na
cílový obrázek
Podrobnosti o Google Image Search
•
Obrázky mají link na takovouto URL:
/imgres?imgurl=http://ex.com/image.gif&imgrefurl=http://ex.com/index.html
•
•
Stačí najít všechny elementy <a>, které mají odkaz
na URL tohoto formátu, a změnit jim atribut href
Pro nalezení elementů lze použít
document.getElementsByTagName('A'), nebo
document.evaluate
•
document.evaluate je k dispozici pouze ve Firefoxu a
vyhodnocuje Xpath výrazy
Uživatelský skript pro Google Image Search
//
//
//
//
==UserScript==
@name
Google Image Search Upgrade
@include
http://images.google.*/*
==/UserScript==
nodes = document.getElementsByTagName('A');
for (var i = 0; i < nodes.length; i++)
{
var linkElement = nodes[i];
var match = linkElement.href.match(
/\/imgres\?imgurl\=(.*?)\&imgrefurl\=/ );
if (match)
linkElement.href = decodeURI(match[1]);
}
Greasemonkey API
•
GM_log(message);
•
•
GM_getValue(key, defaultValue);
GM_setValue(key, value);
•
•
Uloží nebo načte konfigurační hodnotu, ukládají se
trvale, specifické pro jednotlivé skripty, k dispozici v
přehledu konfigurace about:config
GM_registerMenuCommand(menuText, callbackFunction);
•
•
Zapíše zprávu do JavaScriptové konzole, ladící účely
Umožňuje přidat do menu Nástroje | GreaseMonkey |
Příkazy uživatelských skriptů položku, která spustí
zadanou funkci
GM_xmlhttpRequest(details);
•
Provede HTTP požadavek (GET nebo POST) na libovolné
URL (bez bezpečnostních omezení!)
Použití API
•
•
•
Chceme za každý odkaz připsat velikost dokumentu, na který odkaz
směřuje (GM_xmlhttpRequest)
Možnost vypnout a zapnout (GM_registerMenuCommand), toto
nastavení aby se ukládalo (GM_setValue, GM_getValue)
Logovat všechny tyto odkazy (GM_log)
Použití API – řešení
//
//
//
//
==UserScript==
@name
Linker
@include
http://www.google.com/
==/UserScript==
GM_registerMenuCommand("Enable Linker", function() { GM_setValue("enabled", true); });
GM_registerMenuCommand("Disable Linker", function() { GM_setValue("enabled", false); });
function MakeRequest(linkElement)
{
GM_xmlhttpRequest({
method: 'GET', url: linkElement.href,
onload: function(responseDetails) {
GM_log(linkElement.href + ": " + responseDetails.responseText.length);
linkElement.innerHTML += " (" + responseDetails.responseText.length + " bytes)";
}
});
}
if (GM_getValue("enabled", false))
{
GM_log("Linker is enabled, processing all links.");
nodes = document.getElementsByTagName('A');
for (var i = 0; i < nodes.length; i++)
MakeRequest(nodes[i]);
}
Bezpečnost uživatelských skriptů
•
•
•
•
Greasemonkey spouští skripty v sandboxu, cílový
web k nim nemá přístup
Všechny API funkce jsou přístupné pouze z tohoto
sandboxu
Je zakázáno přepisování metod a vlastností
objektů document a window
Kvůli sandboxu je prostředí uživatelských skriptů
mírně pozměněno
Drobné rozdíly v DOM/JavaScriptu
•
•
•
•
Nefunguje string eval na funkce
window.setTimeout("func", 1000);
window.setTimeout(func, 1000);
Nelze přistupovast přímo k event-handlerům
e.onclick = 'func(this)';
e.onclick = func;
e.addEventListener("click", func, true);
K vlastním atributům elementů lze přistupovat
pouze pomocí .setAttribute a .getAttribute
Nelze iterovat pomocí for (var e in elements)
Drobné rozdíly v DOM/JavaScriptu, #2
•
•
•
•
K formulářům a jejich prvkům je nutné přistupovat
přes document.forms.namedItem("form1") a
f.elements.namedItem("input1")
Nefunguje window.location = "...", používat
window.location.href = "..."
Proměnné unsafeWindow, unsafeDocument
Nefunguje e.setAttribute("style", "color:
blue;"), používat e.style.color = 'blue'
Kompilace skriptů
•
Greasemonkey Compiler
•
Webová aplikace, z uživatelského skriptu (*.user.js)
vytvoří samostatné rozšíření do Firefoxu (*.xpi)
Neocenitelní pomocníci při vývoji uživatelských skriptů
•
DOM Inspector
•
•
Firebug
•
•
Inspect Element najde element v DOM stromu, živé
editování
JavaScript Shell
•
•
Pro procházení DOM stromu dokumentu
Bookmarklet, umožňuje vyhodnocovat JavaScriptové
příkazy v kontextu aktuálního dokumentu, umí zobrazit
všechny metody a vlastnosti nějakého objektu
Web Developer Toolbar
•
View Generated Source zobrazí HTML obsah dokumentu
po vykonání JavaScriptu
Uživatelské skriptování v jiných prohlížečích
•
Opera
•
•
Internet Explorer
•
•
Greasemonkey for IE, Trixie, Turnabout (včetně GM API)
Safari
•
•
Od verze 8 má vestavěnou podporu uživatelských
skriptů, nemá GM API
GreaseKit
Konqueror
•
Konqueror Userscript
Možné problémy
•
Některé služby zakazují používání uživatelských
skriptů
•
•
•
Např. webové hry, internetové obchody
Změny na webu způsobí nefunkčnost GM skriptů
Bezpečnostní riziko
•
Špatně napsané uživatelské skripty mohou webové
stránce zpřístupnit nepovolené údaje nebo funkce
(GM_xmlhttpRequest)
Odkazy
•
GM Homepage
•
•
GM Wiki
•
•
http://wiki.greasespot.net/
Kniha/manuál ke Greasemonkey
•
•
•
http://www.greasespot.net/
http://diveintogreasemonkey.org/
Kniha Greasemonkey Hacks (O'Reilly 2005)
Databáze uživatelských skriptů
•
http://userscripts.org/, http://userjs.org/
Otázky?