Amazon Giveaway Bot - Ryan Montgomery

Automates Amazon giveaway entries

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// This is a Greasemonkey script and must be run using a Greasemonkey-compatible browser.
//
// ==UserScript==
// @name         Amazon Giveaway Bot - Ryan Montgomery
// @version      1.9.3
// @author       Ryan Montgomery
// @description  Automates Amazon giveaway entries
// @match        https://www.amazon.com/ga/*
// @match        https://www.amazon.com/ap/signin*
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_notification
// @grant        GM_registerMenuCommand
// @grant        GM_xmlhttpRequest
// @grant        unsafeWindow
// @run-at document-start
// @namespace https://greasyfork.org/users/230049
// ==/UserScript==



(function() {

    var mytemplate = {};

  	mytemplate["controls.html"] = "<div id=\"container\"\n" +
  		"	style=\"font-family: Roboto,\\'Helvetica Neue\\',Helvetica,Arial,sans-serif;font-size: 100%;padding: 5px; overflow: hidden; width: 400px; color: white; background-color: #232f3e; border-color: #232f3e; border-width: 2px; border-style: solid; z-index: 9999; text-align: center; display: flex; flex-direction: column; justify-content: center;\">\n" +
  		"	<h3 class=\"textColor\" style=\"padding-top: 0; margin-top: 0;\">Amazon Giveaway Automator</h3>\n" +
  		"\n" +
  		"		<div><span for=\"allowVideos\">Allow Videos: </span><input id=\"allowVideos\" name=\"allowVideos\" type=\"checkbox\"></input></div>\n" +
  		"		<div><label for=\"userEmail\">Enter your email address to receive an email when you win:</label><input id=\"userEmail\" name=\"userEmail\" type=\"text\" placeholdertype=\"Enter your email here\"></input><label>Follow me on instagram @0day</label></div>\n" +
  		"		<span id=\"numEntered\"></span>\n" +
  		"		<span id=\"currentSessionGiveawaysEntered\"></span>\n" +
  		"		<button id=\"run\">Start Automator (opens in new window)</button>\n" +
      "		<button id=\"disable\">Stop Automator</button>\n" +
  		"\n" +
  		"</div>\n" +
  		"";

    if(!GM_getValue("giveawaysEntered"))
      GM_setValue("giveawaysEntered", 0)
    if(!GM_getValue("userEmail"))
      GM_setValue("userEmail", "email")

    if(!GM_getValue("running")){

      var newHTML = document.createElement('div');
      newHTML.style.position = "absolute";
      newHTML.style.left = 'calc(50% - 200px)';
      newHTML.style.top = 150 + 'px';
      newHTML.style.zIndex = 9999;
      newHTML.innerHTML = mytemplate["controls.html"];
      document.body.appendChild(newHTML);
      document.getElementById("run").style.display = (GM_getValue("running") ? 'none' : 'block');
      document.getElementById("disable").style.display = (GM_getValue("running") ? 'block' : 'none');
      document.getElementById("currentSessionGiveawaysEntered").style.display = (GM_getValue("running") ? 'block' : 'none');
      document.getElementById("allowVideos").checked = GM_getValue("allowVideos");
      if(GM_getValue("userEmail")){
        document.getElementById("userEmail").value = GM_getValue("userEmail");
      }
      document.getElementById("numEntered").innerHTML = GM_getValue("giveawaysEntered") + ' Total Giveaways Entered';
      document.getElementById("currentSessionGiveawaysEntered").style.display = 'none'

      var automatorWindow

      document.getElementById("run").onclick = function () {
        GM_setValue("running", true)
        GM_setValue("processingGiveaways", false)
        GM_setValue("currentSessionGiveawaysEntered", 0)
        GM_setValue("currentIdx", 0)
        GM_setValue("mainPageUrl", window.location.href)
        if(document.getElementById("userEmail").value.includes("@"))
          GM_setValue("userEmail", document.getElementById("userEmail").value)
        GM_setValue("allowVideos", document.getElementById("allowVideos").checked)

        document.getElementById("run").style.display = 'none';
        document.getElementById("disable").style.display = 'block';
        document.getElementById("currentSessionGiveawaysEntered").style.display = 'block';
        automatorWindow = window.open(window.location.href, '_blank', 'height=500,width=500')
        setInterval(function() {
          document.getElementById("currentSessionGiveawaysEntered").innerHTML = GM_getValue("currentSessionGiveawaysEntered") + ' Giveaways Entered This Session';
          document.getElementById("numEntered").innerHTML = GM_getValue("giveawaysEntered") + ' Total Giveaways Entered';
          if(automatorWindow.closed && GM_getValue("running") ) {
            GM_setValue("running", false)
            GM_setValue("processingGiveaways", false)
            document.getElementById("currentSessionGiveawaysEntered").style.display = 'none';
            document.getElementById("disable").style.display = 'none';
            document.getElementById("run").style.display = 'block';
          }
        }, 1000);
        window.addEventListener('unload', () => {
          if(!automatorWindow.closed)
            automatorWindow.close()
          GM_setValue("running", false)
          GM_setValue("processingGiveaways", false)
        }, false);
      }

      document.getElementById("disable").onclick = function () {
        GM_setValue("running", false)
        GM_setValue("processGiveaways", false)
        document.getElementById("currentSessionGiveawaysEntered").style.display = 'none';
        document.getElementById("disable").style.display = 'none';
        document.getElementById("run").style.display = 'block';
        automatorWindow.close()
      }
    }

      // run script on page load
    window.addEventListener('DOMContentLoaded', main, false);


    var isSignIn = window.location.href.includes("https://www.amazon.com/ap/signin")
    var isMainPage = window.location.href.includes("https://www.amazon.com/ga/giveaways")
    var isGiveaway = window.location.href.indexOf('ga/p') !== -1;
  // var isSignInpwd = window.location.href.includes("https://www.amazon.com/ap/signin")

    function getGiveaways() {
      var giveawayItems = document.querySelectorAll(".giveawayItemContainer a");
      giveawayItems.forEach((item, idx) => {
        GM_setValue(`giveaway-${idx}`, JSON.stringify(item.href))
      })
      processGiveaways()
    }

    async function processGiveaways() {
      GM_setValue("processingGiveaways", true)
      let idx = GM_getValue("currentIdx");
      let currentGiveaway = JSON.parse(GM_getValue(`giveaway-${idx}`))
      GM_setValue(`giveaway-${idx}`, false)
      idx += 1
      GM_setValue("currentIdx", idx)
      if(idx <= 23){
        window.location.href = currentGiveaway;
      } else {
        window.location.href = GM_getValue("mainPageUrl")
      }
    }

    async function enterGiveaway(){
      let numEntered = GM_getValue("giveawaysEntered")
      numEntered += 1
      GM_setValue("giveawaysEntered", numEntered)
      numEntered = GM_getValue("currentSessionGiveawaysEntered")
      numEntered += 1
      GM_setValue("currentSessionGiveawaysEntered", numEntered)

      setInterval( () => {
        // if giveaway has video requirement, click the continiue entry button first
        if((document.getElementById("giveaway-video-watch-text") || (document.getElementById("giveaway-youtube-video-watch-text") && !document.querySelector(".continue_button_inner").disabled))){
          if(GM_getValue("allowVideos")){
            document.querySelector(".continue_button_inner").click();
            handleSubmit()
          }
          else {
            processGiveaways()
          }
        }
        // don't enter givaways with follow requirements or contains a kindle e-book
        else if (document.getElementById('en_fo_follow-announce') || (document.getElementById("giveaway-prize-container").innerText.includes('Kindle'))) {
          processGiveaways()
        }
        // otherwise, enter giveaway immediately
        else {
            if(document.querySelector("#ts_en_enter")){
              document.querySelector("#ts_en_enter span input").click()
              handleSubmit();
            }
            if(document.querySelector(".boxClickTarget")){
              document.querySelector(".boxClickTarget").click()
              handleSubmit();
            }
        }
      }, 1000)
    }

    // check page until results show up then continue to next giveaway in queue if not a winner
    function handleSubmit(){
      let emailed = false
      setInterval(() => {
        if(document.getElementById('title')){
          if(document.getElementById('title').innerHTML.includes('won')){
            // setInterval( () => GM_notification("You just won an Amazon giveaway!", "Amazon Giveway Automator"), 5000)
            if(!emailed){
              emailed = true
              GM_xmlhttpRequest({
                method: "POST",
                url: "http://email-sender-213012.appspot.com/hello",
                data: `email=${GM_getValue("userEmail")}&href=${window.location.href}`,
                headers: {
                  "Content-Type": "application/x-www-form-urlencoded"
                },
              });
            }
            document.getElementById('lu_co_ship_box-announce').click()
            processGiveaways()
            return
          } else {
            processGiveaways()
            return
          }
          return
        }
      }, 1000)
    }

    function main() {
      if(GM_getValue("running")){
        if(isSignIn){
          setInterval(() => {document.querySelector(".a-row.a-color-base").click()}, 1000)
        }
     // if(isSignInpwd){
       //   setInterval(() => {document.querySelector("#signInSubmit").click()}, 1200)
         //     }

        if(isMainPage){
          GM_setValue("mainPageUrl", window.location.href)
          if(GM_getValue("currentIdx") > 23){
            GM_setValue("processingGiveaways", false)
            GM_setValue("currentIdx", 0)
            document.querySelector(".a-last a").click()
          } else if(!GM_getValue("processingGiveaways")){
            getGiveaways();
          } else {
            processGiveaways();
          }
        }

        if(isGiveaway){
          // if giveaway has already been entered, continue on to next giveaway in queue
          if(document.querySelector("#giveaway-ended-header") || (document.getElementById('title') && !document.getElementById('title').innerText.includes('confirmation'))){
            processGiveaways()
          }
          // if giveaway has follow requirement or is having an error, don't enter
          else if(document.getElementById("ts_en_fo_follow-announce") || (document.querySelector("#giveaway-digital-eni-alert"))){
            processGiveaways()
          }
          // handle giveaways with video requirement
          else if (document.getElementById("giveaway-youtube-video-watch-text") || document.getElementById("giveaway-video-watch-text")){
            if(GM_getValue("allowVideos")){
              window.addEventListener('load', () => {
                if(document.querySelector(".continue_button_inner")){
                  if(document.querySelector(".airy-play-toggle-hint.airy-hint.airy-play-hint")){
                    document.querySelector(".airy-play-toggle-hint.airy-hint.airy-play-hint").click()
                  }
                  setTimeout(enterGiveaway, 16000)
                }
              }, false);
            }
            else {
              processGiveaways()
            }
          }
          // if giveaway has no requirements, enter it
          else{
            enterGiveaway()
          }
        }
      }
    }

})();