2016-06-10 14 views
2

Ich schrieb ein Skript, um einige automatisierte Aktionen auf einer Website (die nicht meins ist) zu tun.JS ignoriert meine setInterval

Diese Website ist eine Art Online-Shop für ein PC-Spiel. Der Benutzer wählt einen Artikel aus und klickt auf einen "Zurückziehen" -Button. Wenn die Website (oft) stark ausgelastet ist, erhält der Benutzer oft die Meldung "Heavy load - try again!" und muss immer wieder auf den gleichen Knopf klicken, bis er entweder den Gegenstand bekommt oder eine Nachricht erhält, die sagt: "Der Gegenstand wurde bereits verkauft!".

Alles läuft in einer Chrome-Erweiterung!

Mein Skript macht folgendes:

  • Fügen Sie ein OnClick-Ereignis auf die Schaltfläche, um eine Funktion

  • Klicken Sie auf "zurückziehen"

  • Lesen Sie die Meldung ausführen, die herkommt die Website

  • Hängt von der Nachricht ab:

    • „Angebot wird ... gesendet“ - Nichts tun und lesen wieder nach Intervall

    • „Artikel wurde bereits verkauft!“ - Stoppen Sie das Intervall

    • "Schwere Last - versuchen Sie es erneut!" - ein Element Klicken Sie auf die Nachricht und „zurückziehen“ wieder

um das Problem zu beseitigen:

Das Intervall wird auf 2000 ms, aber das Skript scheint nur die Taste zurückziehen Spamming werden nonstop und es scheint die clearInterval() zu ignorieren.

Mein Code:

function buy() { 

    //Get the innerHTML for the box that displays the message 
    var message = document.getElementsByClassName("pm-content")[0].innerHTML; 

    //Message: Offer is being sent! - DO NOTHING! 
    if (message == "Please wait while your trade offer is being sent...") { 
     console.log("Loading: Going on!") 
    } 

    //Message: Item is gone! - STOP EVERYTHING! 
    if (message == "Items unavailable") { 
     console.log("Unavailable: Stopping!") 
     clearInterval(buyInterval); 
    } 

    //Message: Transaction successfull! - STOP EVERYTHING 
    if (message.includes("Trade offer has been sent! Code: ")) { 
     console.log("Success: Stopping!") 
     clearInterval(buyInterval); 
    } 

    if (message == "Heavy load! - Try again!") { 
     console.log("Overload: Going on!") 
     document.getElementById("pgwModal").click(); //Click to remove the message 
     document.getElementById("withdraw").click(); //Click withdraw again 

    } 
} 



function forceBuy() { 
    buyInterval = setInterval(function(){ buy() }, 2000); 
} 

var button = document.getElementById("withdraw"); 

withdraw.onclick=function(){ forceBuy() }; 

Jede Hilfe ist willkommen!


Edit_1

-Code jetzt:

(function(){ //creating isolated scope to avoid using global variables. 
var buyInterval; // declaring sharing variables. 

    function buy() { 

    var message = document.getElementsByClassName("pm-content")[0].innerHTML; 

    if (message == "Please wait while your trade offer is being sent...<br><small>(this might take up to 5 minutes)</small>") { 
     console.log("Loading: Going on!") 
    } 

    if (message == "You cannot afford that withdrawal.") { 
     console.log("Broke: Stopping!") 
     document.getElementById("pgwModal").click(); 
     clearInterval(buyInterval); 
    } 

    if (message == "Items unavailable") { 
     console.log("Unavailable: Stopping!") 
     document.getElementById("pgwModal").click(); 
     clearInterval(buyInterval); 
    } 

    if (message.includes("Trade offer has been sent!")) { 
     console.log("Success: Stopping!") 
     clearInterval(buyInterval); 
    } 

    if (message.includes("missing")) { 
     console.log("Missing: Stopping") 
     document.getElementById("pgwModal").click(); 
     clearInterval(buyInterval); 
    } 

    if (message == "You can have only one pending deposit or withdrawal.") { 
     console.log("Pending: Stopping!") 
     document.getElementById("pgwModal").click(); 
     clearInterval(buyInterval); 
    } 

    if (message == "Too many active trades") { 
     console.log("Overload: Going on!") 
     document.getElementById("pgwModal").click(); 
     document.getElementById("withdraw").click();  
    } 

    } 

    function forceBuy() { 
     return setInterval(function(){ buy(); }, 2000); // not necessary but                       // will be more readable 
    } 

    var button = document.getElementById("withdraw"); 

    withdraw.onclick=function(){ //making a closure to catch buyInterval variable 
    buyInterval = forceBuy(); 
    }; 

}()) 

Dank Vitalii für diesen Code - Es scheint jetzt besser zu arbeiten, da sie nicht ständig ist mehr auf den Button Spamming. Leider bleibt das andere Problem: Wenn das Skript zum Beispiel diesen Teil des Codes erreicht:

if (message.includes("Trade offer has been sent!")) { 
     console.log("Success: Stopping!") 
     clearInterval(buyInterval); 
    } 

Es erfolgreich die Nachricht liest und druckt „Erfolg: Stoppen“ - einmal alle zwei Sekunden ... so lange, bis ich es von Hand aufhebe. Es scheint wie klarInterval (buyInterval); wird immer noch ignoriert.

Was mache ich hier falsch?

+2

Pls zeigen, wie und wo Sie buyInterval erklären – Vitalii

+0

Was ist die entsprechende HTML (der Knopf und vielleicht die umgebende Form)? – devnull69

+0

buyInterval wird in der Funktion forceBuy deklariert. Ich bin neu in JS und ich denke, dass ich gelernt habe, dass es keine "var" davor geben sollte, um es für das ganze Skript zugänglich zu machen. Ist das falsch? (Fügen Sie den entsprechenden HTML zu meinem ursprünglichen Beitrag in ein paar Minuten. Nicht auf einem PC im Moment. - aber es ist nur eine ususal Schaltfläche, nichts besonderes und der eigentliche Klick auf die Schaltfläche funktioniert.) –

Antwort

2
(function(){ //creating isolated scope to avoid using global variables. 
var buyInterval; // declaring sharing variables. 

    function buy() { 
      ... buying action 
    } 

    function forceBuy() { 
     return setInterval(function(){ buy(); }, 2000); // not necessary but                       // will be more readable 
    } 

    var button = document.getElementById("withdraw"); 

    withdraw.onclick=function(){ //making a closure to catch buyInterval variable 
    buyInterval = forceBuy(); 
    }; 

}()) 
+0

Also kann ich einfach meinen if-Code zur "Funktion kaufen" hinzufügen, damit das funktioniert? Ich denke, ich verstehe Ihren Code nur teilweise, aber die Suche nach isolierten Bereichen und die gemeinsame Nutzung von Variablen könnte hilfreich sein. Ich werde es versuchen, sobald die Website den Wartungsmodus verlässt und Feedback gibt! Danke, Vitalii! –

+0

Hey, die Schaltfläche Spam gestoppt, aber die ClearInterval scheint immer noch nicht zu funktionieren. Ich habe etwas am Ende meines ursprünglichen Posts hinzugefügt. Ich verstehe nicht, warum es das Drehbuch nicht stoppt ... danke im Voraus! –

+0

Ok, ich nehme den Code und teste. Wird bald zurückkehren – Vitalii

0

Ihre forceBuy Funktion wie folgt umschreiben -

function forceBuy() { 
    if(buyInterval) clearInterval(buyInterval); 
    buyInterval = setInterval(function(){ buy() }, 2000); 
} 
Verwandte Themen