2008-09-23 10 views
12

Quali sono alcune delle funzionalità e delle tecniche meno conosciute ma utili che le persone utilizzano negli script di Greasemonkey?Funzioni nascoste di Greasemonkey

(. Per favore, basta una caratteristica per ogni risposta)

discussioni simili:

+1

c'è un'altra domanda 10 contrassegnati come-caratteristiche nascoste. http://stackoverflow.com/questions/tagged/hidden-features –

risposta

8

I dati possono essere conservati tra i carichi di pagina memorizzandoli come valore di preferenza di mozilla tramite GM_setValue(keyname, value).

Ecco un semplice esempio che Tallys il numero di volte in cui è stato eseguito lo script - per un determinato navigatore:

valori
 
var od = GM_getValue("odometer", 0); 
od++; 
GM_setValue("odometer", od); 
GM_log("odometer=" + od); 

GM sono analoghi a cookie in che i valori dei cookie possono essere accessibili solo dal originato dominio, i valori GM sono accessibili solo dallo script che li ha creati.

+0

Questa è davvero una funzionalità nascosta o ancora meno conosciuta? Fa parte dell'API documentata di Greasemonkey, che è a sua volta molto piccola. –

+0

Concordato che questo non è nascosto di per sé. Ma rientra nella categoria idioma. –

+0

Sì, l'API di GM non è davvero così grande e quindi non conosco le "funzionalità nascoste" di per sé - sarebbe più interessante chiedere di tecniche/exploit interessanti che forniscano funzionalità utili e non ovvie. –

3

statistiche anonime

Supponendo di avere un servizio di hosting di base che fornisce registrazione degli accessi, si può facilmente tenere traccia delle statistiche di utilizzo di base per lo script.

  1. Inserire un file gif (ad esempio un'immagine del logo) sul proprio sito Web.
  2. Nello script, allegare un elemento img alla pagina che fa riferimento al GIF:
 
var img = document.createElement("img"); 
img.src = "http://mysite.com/logo.gif"; 
document.body.appendChild(img); 

Ora, ogni volta che un utente esegue lo script, il tuo servizio di hosting registrerà un successo su quel file gif.

Per tenere traccia di più di uno script, utilizzare un file GIF diverso per ciascuno. O aggiungi qualche tipo di parametro di differenziazione all'URL, (es .: http://mysite.com/logo.gif?zippyver=1.0).

+3

... e mentre ci sei, puoi anche inviarne i nomi utente e le password –

+0

Fornire un esempio di codice –

+0

In realtà avevo uno script che generava uno pseudo-GUID quando lo script è stato installato, lo memorizzo usando GM_setValue, e quindi ogni * giorno * lo script è stato eseguito, avrebbe colpito il mio sito Web, inviando il GUID nella stringa di query. Ho registrato questi dati in un database per ottenere statistiche sull'utilizzo. –

13

Gli script di Greasemonkey devono spesso cercare il contenuto in una pagina. Invece di scavare attraverso il DOM, prova ad usare XPath per localizzare i nodi di interesse. Il metodo document.evaluate() consente di fornire un'espressione XPath e restituirà una raccolta di nodi corrispondenti. Ecco un bel tutorial per iniziare. A titolo di esempio, ecco uno script che ho scritto che provoca collegamenti in messaggi phpBB3 per aprire in una nuova scheda (nel tema predefinito):

// ==UserScript== 
// @name   New Tab in phpBB3 
// @namespace  http://robert.walkertribe.com/ 
// @description Makes links in posts in phpBB3 boards open new tabs. 
// ==/UserScript== 

var newWin = function(ev) { 
    var win = window.open(ev.target.href); 
    if (win) ev.preventDefault(); 
}; 

var links = document.evaluate(
     "//div[@class='content']//a[not(@onclick) and not(@href='#')]", 
     document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); 

for (var i = 0; i < links.snapshotLength; i++) { 
    var link = links.snapshotItem(i); 
    link.addEventListener("click", newWin, true); 
} 

L'espressione XPath usata nel codice identifica tutti a elementi che 1) do non ha un attributo onclick, 2) il cui attributo href non è impostato su "#" e 3) si trova all'interno di div s il cui attributo class è impostato su "content".

+1

Desidero commentare che, nonostante le preoccupazioni ampiamente espresse riguardo al fatto che XPath potrebbe essere troppo costoso rispetto al DOM walking, l'ho trovato in grado di funzionare essenzialmente istantaneamente, anche se usato in modo aggressivo. –

10

Lo script può aggiungere grafica in una pagina, anche se non si dispone di alcun luogo per ospitare i file, tramite URI di dati.

Per esempio, ecco un po 'di grafica tasto:

 
var button = document.createElement("img"); 
button.src = "data:image/gif;base64," 
    + "R0lGODlhEAAQAKEDAAAA/wAAAMzMzP///yH5BAEAAAMALAAAAAAQABAAAAIhnI+pywOtwINHTmpvy3rx" 
    + "nnABlAUCKZkYoGItJZzUTCMFACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==" 
somenode.appendChild(button); 

Ecco online image encoder.

E uno wikipedia article sullo standard URI di dati.

+2

Se si dispone di un luogo per ospitare i file, ma semplicemente non hanno troppa larghezza di banda, è possibile utilizzare il @Resource relativamente recente aggiunto e funzioni GM_getResourceURL, così l'utente può scaricare la vostra immagine (o altre risorse) quando si installa il tuo copione Viene salvato localmente in seguito – Athena

+0

Nice. Sarebbe anche più performante, dal momento che il browser memorizzerà l'immagine nella cache e non dovrà costruirlo ogni volta. –

2

Una tecnica XPath utile è specificare la corrispondenza relativa a un nodo che è già stato trovato. Come un esempio inventato per StackOverflow:

 
// first we got the username link at the top of the page 
var hdrdiv = document.evaluate(
    "//div[@id='headerlinks']/a[1]", document, null, 
    XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; 

// now we can retrieve text that follows it, (user's reputation score) 
// (note that hdrdiv is now the contextNode argument, rather than document) 
var reptext = document.evaluate(
    "following-sibling::span", hdrdiv, null, 
    XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; 

alert("Reputation Score: " + reptext.textContent); 

Si può competere in qualsiasi direzione rispetto al contextnode, antenati, discendenti, precedente, successivo. Ecco un utile XPath reference.

2

Gli script GreaseMonkey vengono eseguiti quando il DOM è pronto, quindi non è necessario aggiungere eventi onload, basta iniziare a manipolare il DOM immediatamente nello script GreaseMonkey.

+1

Il getcha con alcuni siti è che forniscono HTML incompleto e quindi lo modificano tramite onload. Pertanto, quando si tenta di modificarlo tramite greasemonkey, la pagina non è ancora pronta. Ad esempio: http://www.tvguide.com/listings http://www.meevee.com/myguide.aspx –

+0

Ho riscontrato alcuni problemi durante la creazione di script Greasemonkey per SO a causa di problemi di questo tipo. :-) –

13
==UserScript== 
... 
@require http://ajax.googleapis.com/ajax/framework-of-your/choice.js 
==/UserScript== 
5

GM_setValue normalmente memorizza solo a 32 bit interi, stringhe, e booleani, ma è possibile usufruire del metodo uneval() (e un eval più tardi() sul recupero) per memorizzare qualsiasi oggetto. Se hai a che fare con valori JSON puri (anziché oggetti JavaScript), usa JSON.stringify per memorizzare e JSON.parse per recuperare; questo sarà sia più veloce che più sicuro.

var foo={people:['Bob','George','Smith','Grognak the Destroyer'],pie:true}; 
GM_setValue('myVeryOwnFoo',uneval(foo)); 
var fooReborn=eval(GM_getValue('myVeryOwnFoo','new Object()')); 
GM_log('People: '+fooReborn.people+' Pie:'+fooReborn.pie); 

Io tendo ad usare "new Object()" come il mio difetto in questo caso, ma si potrebbe anche usare "({})". Ricorda che "{}" valuta come una stringa, non come un oggetto. Come al solito, eval() con attenzione.

+0

Apporta valori di preferenza raw abbastanza ingombranti, ma molto potenti. Un po 'come memorizzare un BLOB nel tuo database. Mi piace soprattutto il tuo suggerimento per l'inizializzazione. –

+0

Ho imparato qualcosa oggi. Stavo cercando di usare JSON per mantenere un array, ma questo sembra piuttosto dolce. – davewasthere

1

Obsoleto: Supporto per Firefox rilasciato per E4X, in script Greasemonkey, con FF versione 17. Utilizzare GM_info per ottenere i metadati.


È possibile utilizzare E4X per accedere alle informazioni == == userscript come una variabile:

var metadata=<> 
// ==UserScript== 
// @name   search greasemonkey 
// @namespace  foo 
// @include  http://*.google.com/* 
// @include  http://*.google.ca/* 
// @include  http://search.*.com/* 
// @include  http://*.yahoo.com/* 
// ==/UserScript== 
</>.toString(); 
+1

+1 ma questo è obsoleto ora che ['GM_info' è stato aggiunto a Greasemonkey] (http://stackoverflow.com/a/10475344/331508). –