2008-09-23 12 views
12

¿Cuáles son algunas de las características y técnicas menos conocidas pero útiles que las personas están usando en sus scripts de Greasemonkey?Funciones ocultas de Greasemonkey

(. Por favor, sólo una característica por respuesta)

hilos similares:

+1

hay otra pregunta 10-etiquetado como características ocultas. http://stackoverflow.com/questions/tagged/hidden-features –

Respuesta

8

Los datos pueden persistir entre cargas de página al almacenarlo como un valor de preferencia de mozilla a través de GM_setValue(keyname, value).

Aquí está un ejemplo simple que Tallys el número de veces que el guión ha sido ejecutado - por un navegador determinado:

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

transgénicos son análogas a las cookies en la que los valores de cookie sólo puede ser accedido por el originado dominio, los valores de GM solo pueden accederse mediante el script que los creó.

+0

¿Es realmente una función oculta o incluso menos conocida? Es parte de la API documentada de Greasemonkey, que a su vez es muy pequeña. –

+0

Estoy de acuerdo en que esto no está oculto per se. Pero cae en la categoría idiomática. –

+0

Sí, la API de GM realmente no es tan grande y, por lo tanto, no conozco las "características ocultas" per se - sería más interesante preguntar acerca de técnicas/exploits interesantes que ofrecen una funcionalidad útil y no obvia. –

3

Estadísticas anónimas

Asumiendo que tiene un servicio de alojamiento básico que proporciona el registro de acceso, se puede seguir fácilmente las estadísticas de uso básico para su guión.

  1. Coloque un archivo GIF (por ejemplo, una imagen del logotipo) en su propio sitio web.
  2. En su guión, adjuntar un elemento img a la página que hace referencia el gif:
 
var img = document.createElement("img"); 
img.src = "http://mysite.com/logo.gif"; 
document.body.appendChild(img); 

Ahora, cada vez que un usuario ejecuta la secuencia de comandos, su servicio de alojamiento registrará un impacto en dicho archivo GIF.

Para rastrear más de un script, use un archivo gif diferente para cada uno. O agregue algún tipo de parámetro de diferenciación a la URL, (p. Ej .: http://mysite.com/logo.gif?zippyver=1.0).

+3

... y mientras lo hace, también puede enviar sus nombres de usuario y contraseñas con él –

+0

Proporcione el ejemplo de código –

+0

En realidad, tenía un script que generaría un pseudo-GUID cuando se instaló el script, almacenarlo usando GM_setValue, y luego cada * día * se ejecutó el script, llegaría a mi sitio web, enviando el GUID en la cadena de consulta. Logré esta información en una base de datos para obtener estadísticas de uso. –

13

Los scripts de Greasemonkey a menudo necesitan buscar contenido en una página. En lugar de explorar el DOM, intente utilizar XPath para localizar nodos de interés. El método document.evaluate() le permite proporcionar una expresión XPath y devolverá una colección de nodos coincidentes. Aquí hay un buen tutorial para comenzar. A modo de ejemplo, aquí hay un guión que escribí que hace que los enlaces en los mensajes phpBB3 para abrir en una nueva pestaña (en la piel por defecto):

// ==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); 
} 

La expresión XPath se utiliza en el código identifica todos a elementos que 1) do no tener un atributo onclick, 2) cuyo atributo href no está configurado en "#", y 3) se encuentran dentro de div s cuyo atributo class se establece en "content".

+1

Me gustaría comentar que a pesar de las preocupaciones ampliamente expresadas de que XPath podría ser demasiado costoso en comparación con DOM caminando, he encontrado que funciona de manera esencialmente instantánea, incluso cuando se usa agresivamente. –

1

Los valores del encabezado de script, (@nombre, @descripción, @versión, etc.), pueden hacerse recuperables. Esto es preferible a mantener los mismos valores constantes en múltiples lugares en su secuencia de comandos.

Ver Accessing Greasemonkey metadata from within your script?

10

Su script puede añadir gráficos en una página, incluso si usted no tiene ningún lugar para alojar archivos, a través de URIs de datos.

Por ejemplo, aquí es un pequeño gráfico botón:

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

Aquí es una línea image encoder.

Y un wikipedia article sobre el estándar URI de datos.

+2

Si tiene un lugar para alojar archivos, pero no tiene demasiado ancho de banda, puede usar las funciones @resource y GM_getResourceURL de reciente creación, para que el usuario pueda descargar su imagen (u otro recurso) cuando la instale tu guion Se guarda localmente después – Athena

+0

Nice. Eso sería más eficaz también, ya que el navegador guardará en caché la imagen, y no tiene que construirla cada vez. –

2

Una técnica útil de XPath es especificar su coincidencia relativa a un nodo que ya ha encontrado. Como ejemplo contribuido para 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); 

puede hacer coincidir en cualquier dirección con respecto a la ContextNode, antepasados, descendientes, anterior, siguiente. Aquí hay un útil XPath reference.

2

Las secuencias de comandos de GreaseMonkey se ejecutan cuando el DOM está listo, por lo que no necesita agregar eventos de carga, simplemente comienza a manipular el DOM directamente en su script de GreaseMonkey.

+1

El problema con algunos sitios es que entregan HTML incompleto y luego lo modifican a través de onload. Por lo tanto, cuando intenta modificarlo a través de greasemonkey, la página aún no está lista. Por ejemplo: http://www.tvguide.com/listings http://www.meevee.com/myguide.aspx –

+0

Tuve algunos problemas al crear scripts de Greasemonkey para SO debido a problemas como este. :-) –

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

GM_setValue normalmente sólo almacena 32 bits enteros, cadenas y booleanos, pero se puede tomar ventaja del método uneval() (y una eval después() en la recuperación) para almacenar cualquier objeto. Si está tratando con valores JSON puros (en lugar de objetos JavaScript), use JSON.stringify para almacenar y JSON.parse para recuperar; esto será más rápido y más seguro.

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); 

que tienden a utilizar "new Object()" como mi defecto en este caso, pero también se puede usar "({})". Solo recuerde que "{}" se evalúa como una cadena, no como un objeto. Como de costumbre, eval() con cuidado.

+0

Hace valores de preferencia crudos bastante difíciles de manejar, pero muy poderosos. Algo así como almacenar un BLOB en su base de datos. Me gusta especialmente tu sugerencia de inicialización. –

+0

He aprendido algo hoy. Estaba buscando usar JSON para mantener una matriz, pero esto se ve bastante dulce. – davewasthere

1

Obsoleto: Firefox cayó soporte para E4X, en scripts de Greasemonkey, con la versión 17 de FF. Use GM_info para obtener metadatos.


Se puede utilizar para acceder a su e4x == == userscript información como una variable:

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 pero esto está obsoleto ahora que ['GM_info' se agregó a Greasemonkey] (http://stackoverflow.com/a/10475344/331508). –