2011-01-03 4 views
2

Ich erstelle ein Skript für GMail, das erfordert, dass ich verschiedene Links auf der linken Seite wie Posteingang, Mail, Spam und Compose vervielfältige. Ich habe alle Links außer Compose arbeiten. Ich kann nicht herausfinden, was passiert, wenn ich klicke. Sie können meinen Code unten finden. Ich würde schätzen jede HilfeWie kann ich programmgesteuert in GMail mit "greymonkey" auf die Schaltfläche "verfassen" klicken?

// ==UserScript== 
// @name   GMC Test 
// @namespace  com.pavelgutin 
// @description test 
// @include  http*://mail.google.com* 
// ==/UserScript== 

//loading function 
function tryAgain(tries) { 
    setTimeout(function() { init(tries++); }, 1000*tries); 
} 

//gets a node by XPath 
function getNodeByXPath(expression, parent) { 
    var r = parent.evaluate(expression, parent, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null); 
    return ((r != null) ? r.iterateNext() : null); 
} 

//initialize 
function init(tries) { 

    tries = tries || 0; 
    if (tries > 3) return; // give up, too many tries 
    // Locate the canvas_frame iframe 
    var f = document.getElementById("canvas_frame"); 
    if (f == null) return tryAgain(tries); 
    // Locate the document 
    var doc = f.contentWindow.document; 
    if (doc == null) return tryAgain(tries); 
    // make sure all the links are loaded 
    if (getNodeByXPath("//a[contains(@href,'#inbox')]", doc) == null) return tryAgain(tries); 

    go(); 
} 
function go() { 

    function fireEvent(xPath,event)//https://developer.mozilla.org/en/DOM/element.dispatchEvent 
    { 
     var evt = document.createEvent("MouseEvents"); 
     evt.initMouseEvent(event, true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); 
     var cb = getNodeByXPath(xPath, doc); 
     var canceled = !cb.dispatchEvent(evt); 
     GM_log("event canceled = " + canceled); 
    } 
    var doc = document.getElementById("canvas_frame").contentWindow.document; 

    //THE LINE BELOW WORKS 
    //setTimeout(function(){GM_log("let's click starred!");fireEvent("//a[contains(@href,'#starred')]", "click")}, 5000); 

    //THIS DOENS'T WORK 
    setTimeout(function(){GM_log("now let's click compose!");fireEvent("//div[@class='J-Zh-I J-J5-Ji L3')]", "click")}, 5000); 
} 

window.addEventListener('load', init, false); 
+0

ich arbeite hoffe, Sie fragen nicht Hilfe beim Erstellen eines Spam-Generators ... – PowerUser

+1

@PowerUser: Dachte das Gleiche ... Aber Google sollte ziemlich schlau sein, um Bots zu fangen Email schicken. 2, können Sie GMAIL direkt über SMTP verwenden. Also warum würdest du das mit GreaseMonkey machen? – turtlepick

+0

Nun, wenn alles, was Sie wissen, GreaseMonkey ist und Sie einen billigen Spambot machen wollten, ohne eine neue Sprache zu lernen, dann ist es ein Weg zu gehen (egal wie ineffizient es ist). – PowerUser

Antwort

2

Wenn Sie die neuere AJAX-y Stil GMail verwenden, Sie könnten nur die href der Seite, auf der Compose-URL wie folgt ändern * und lassen nur die Event-Handler Seite auslösen/Griff der hashtag Änderung wie gewohnt:

document.location.href = "#compose"; 

Alternativ, wenn Sie die einfache HTML-Ansicht verwenden, können Sie xPath verwenden, um die E-Mail schreiben Anker zu finden und die document.location.href zu verändern, um unabhängig von den Anlenkpunkte entsprechen.

Ich bin sicher, dass eine elegantere/elastische xPath ändern kann gerade jetzt aber ein kurzer Blick geschrieben werden zeigt, dass es ein accesskey Attribut auf c, die wahrscheinlich unverwechselbar genug ist, den richtigen Link zu jagen:

var nodesSnapshot = document.evaluate(
    '//*[@accesskey="c"]', 
    document, 
    null, 
    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, 
    null 
); 

document.location.href = nodesSnapshot.snapshotItem(0).href; 

* nb: beide wurden getestet und sind in der Firebug arbeiten, aber möglicherweise anders in einem Greasemonkey-Skript aufgrund der Verwendung von iFrames in der AJAX-y Ansicht/andere Faktoren usw.