Last active
April 21, 2024 17:26
-
-
Save dmgolembiowski/6c5dc3deb9c7fa0b119b8439806e147e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name Cookie-Clicker for Alley Eddys | |
// @namespace http://tampermonkey.net/ | |
// @version 0.1 | |
// @description answsers requests from customers | |
// @author Me | |
// @require https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.21.2/babel.min.js | |
// @require https://cdnjs.cloudflare.com/ajax/libs/Detect.js/2.2.2/detect.min.js | |
// @run-at document-idle | |
// @match https://mystore.allenedmonds.com/backoffice | |
// @grant GM_getValue | |
// @grant GM_setValue | |
// @grant GM_deleteValue | |
// @grant GM_addValueChangeListener | |
// @grant GM_setClipboard | |
// @grant GM_removeValueChangeListener | |
// @grant GM_saveTab | |
// @grant GM_getTab | |
// @grant GM_getTabs | |
// @grant GM_openInTab | |
// @grant GM_getResourceText | |
// @grant GM_addStyle | |
// @noframes | |
// ==/UserScript== | |
// CAVEATS: Content-Security Policy "worker-src" 'self" blocks both data: and blob: urls in Chrome (and probly Edge, Opera). It works in Firefox though. | |
(function() { | |
var browserInfo = detect.parse(navigator.userAgent); | |
var browserName = browserInfo.browser.family; | |
var highestAcceptedVersion = browserInfo.browser.major; | |
var gistGithubLink = "https://gist.githubusercontent.com/dmgolembiowski/6c5dc3deb9c7fa0b119b8439806e147e/raw/2c87f23acb80631c21a4d89ad97382cbf8354b58/worker-src.js"; | |
var gistGithubLinkInline = "https://gist.githubusercontent.com/dmgolembiowski/6c5dc3deb9c7fa0b119b8439806e147e/raw/a783eaa5562f4fac6754ea7c94d56fe49f548008/inline-src.js"; | |
do { | |
try { | |
Babel.transform("", { presets: [ ["env", { targets: [browserName, highestAcceptedVersion].join(' ') }]]}) | |
break; | |
} catch (e) {} | |
} while (--highestAcceptedVersion) | |
var browserTarget = "defaults"; | |
https://gist.githubusercontent.com/dmgolembiowski/6c5dc3deb9c7fa0b119b8439806e147e/raw/2c87f23acb80631c21a4d89ad97382cbf8354b58/worker-src.js | |
if (highestAcceptedVersion != 0) { | |
browserTarget = [browserName, highestAcceptedVersion].join(" "); | |
} | |
var worker_src = ` | |
// This text becomes the JIT target of the Web Worker | |
let listenerIds = 0; | |
const funcListeners = { | |
GM_getValue: {} | |
}; | |
self.onmessage = (event) => { | |
const msg = event.data; | |
for (let listener of Object.values(funcListeners[msg[0]])) { | |
listener(...msg.slice(1)); | |
} | |
} | |
function log(...vars) { | |
console.log(self.name + ": ", ...vars); | |
} | |
function GM_getValue(storeKey, defaultValue) { | |
const listenerId = ++listenerIds; | |
self.postMessage(["GM_getValue", storeKey, defaultValue]); | |
return new Promise((resolve, reject) => { | |
funcListeners["GM_getValue"][listenerId] = (res) => { | |
resolve(res); | |
delete funcListeners["GM_getValue"][listenerId]; | |
}; | |
}); | |
} | |
// Our logic for awaiting the notification DOM node(s) and their nested "Accept" | |
// buttons to appear | |
function waitForElm(selector) { | |
return new Promise(resolve => { | |
let it = document.querySelector(selector); | |
if (it) { | |
return resolve(it); | |
} | |
const observer = new MutationObserver(mutations => { | |
if (document.querySelector(selector)) { | |
observer.disconnect(); | |
resolve(document.querySelector(selector)); | |
} | |
}); | |
observer.observe(document.body, { | |
childList: true, | |
subtree: true | |
}); | |
}); | |
} | |
async function main() { | |
const ACCEPT_BUTTON = ".accept-btn" | |
console.log("Auto-clicker is initialized!"); | |
console.log(await GM_getValue("webWorkerTest_workerSrc_es5")); | |
console.log(await GM_getValue("webWorkerTest_workerSrc")); | |
function sleep(ms) { | |
return new Promise(resolve => setTimeout(resolve, ms)); | |
} | |
for (;;) { | |
waitForElm(ACCEPT_BUTTON).then((_arrived) => { | |
let acceptButton = document.querySelector(ACCEPT_BUTTON); | |
console.log("Clicking accept"); | |
acceptButton.click(); | |
}); | |
sleep(60000).then((_) => {}); | |
continue; | |
} | |
} | |
`; | |
GM_setValue("webWorkerTest_workerSrc", worker_src); | |
var transpiled = Babel.transform(worker_src, { presets: [ ["env", { targets: browserTarget }] ] }).code; | |
GM_setValue("webWorkerTest_workerSrc_es5", transpiled); | |
GM_setValue("webWorkerTest_gistSrc", gistGithubLink); | |
var inline_src = ` | |
async function main() { | |
let supportsDataURL = true; | |
let supportsBlobURL = true; | |
let supportsGistURL = true; | |
let worker; | |
const workerSrc = GM_getValue("webWorkerTest_workerSrc_es5"); | |
try { | |
const dataURL = "data:text/javascript;base64," + btoa(workerSrc); | |
worker = new Worker(dataURL, { name: "Worker123" }); | |
} catch(e) { | |
supportsDataURL = false; | |
console.warn("CSP doesn't support 'data:' URL workers, can't instantiate SharedWorker"); | |
} | |
if (!supportsDataURL) { | |
let url; | |
try { | |
const blob = new Blob([workerSrc], { type: "text/javascript" }); | |
url = URL.createObjectURL(blob); | |
worker = new Worker(url, { name: "Worker123" }); | |
} catch (e) { | |
supportsBlobURL = false; | |
URL.revokeObjectURL(url); | |
console.warn("Content-Security Policy didn't support 'blob'. Ugh."); | |
} | |
} | |
if (!supportsBlobURL) { | |
console.warn("F*ck. It is impossible using blob urls in this approach...."); | |
const gistSrc = GM_getValue("webWorkerTest_gistSrc"); | |
try { | |
throw new Error("Great, it looks like we need to try and trick \`new Worker\` into using an overridden \`new URL\` which lies about its origin."); | |
} catch(e) { | |
console.error(e); | |
supportsGistURL = false; | |
} | |
} | |
if (!supportsGistURL) { | |
alert("Sorry bud, it's not gonna work. -David"); | |
return; | |
} | |
const workerMessageHandler = ( event ) => { | |
const msg = event.data; | |
switch (msg[0]) { | |
case "GM_getValue": | |
worker.postMessage([ | |
msg[0], | |
GM_getValue(msg[1], msg[2]) | |
]); | |
break; | |
} | |
}; | |
worker.onmessage = workerMessageHandler; | |
} | |
main(); | |
`; | |
var c = Babel.transform(inline_src, { presets: [ ["env", { targets: browserTarget }] ] }); | |
eval(c.code); | |
})(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
async function main() { | |
let supportsDataURL = true; | |
let supportsBlobURL = true; | |
let supportsGistURL = true; | |
let worker; | |
const workerSrc = GM_getValue("webWorkerTest_workerSrc_es5"); | |
try { | |
const dataURL = "data:text/javascript;base64," + btoa(workerSrc); | |
worker = new Worker(dataURL, { name: "Worker123" }); | |
} catch(e) { | |
supportsDataURL = false; | |
console.warn("CSP doesn't support 'data:' URL workers, can't instantiate SharedWorker"); | |
} | |
if (!supportsDataURL) { | |
let url; | |
try { | |
const blob = new Blob([workerSrc], { type: "text/javascript" }); | |
url = URL.createObjectURL(blob); | |
worker = new Worker(url, { name: "Worker123" }); | |
} catch (e) { | |
supportsBlobURL = false; | |
URL.revokeObjectURL(url); | |
console.warn("Content-Security Policy didn't support 'blob'. Ugh."); | |
} | |
} | |
if (!supportsBlobURL) { | |
console.warn("F*ck. It is impossible using blob urls in this approach...."); | |
const gistSrc = GM_getValue("webWorkerTest_gistSrc"); | |
try { | |
throw new Error("Great, it looks like we need to try and trick \`new Worker\` into using an overridden \`new URL\` which lies about its origin."); | |
} catch(e) { | |
console.error(e); | |
supportsGistURL = false; | |
} | |
} | |
if (!supportsGistURL) { | |
alert("Sorry bud, it's not gonna work. -David"); | |
return; | |
} | |
const workerMessageHandler = ( event ) => { | |
const msg = event.data; | |
switch (msg[0]) { | |
case "GM_getValue": | |
worker.postMessage([ | |
msg[0], | |
GM_getValue(msg[1], msg[2]) | |
]); | |
break; | |
} | |
}; | |
worker.onmessage = workerMessageHandler; | |
} | |
main(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// This text becomes the JIT target of the Web Worker | |
let listenerIds = 0; | |
const funcListeners = { | |
GM_getValue: {} | |
}; | |
self.onmessage = (event) => { | |
const msg = event.data; | |
for (let listener of Object.values(funcListeners[msg[0]])) { | |
listener(...msg.slice(1)); | |
} | |
} | |
function log(...vars) { | |
console.log(self.name + ": ", ...vars); | |
} | |
function GM_getValue(storeKey, defaultValue) { | |
const listenerId = ++listenerIds; | |
self.postMessage(["GM_getValue", storeKey, defaultValue]); | |
return new Promise((resolve, reject) => { | |
funcListeners["GM_getValue"][listenerId] = (res) => { | |
resolve(res); | |
delete funcListeners["GM_getValue"][listenerId]; | |
}; | |
}); | |
} | |
// Our logic for awaiting the notification DOM node(s) and their nested "Accept" | |
// buttons to appear | |
function waitForElm(selector) { | |
return new Promise(resolve => { | |
let it = document.querySelector(selector); | |
if (it) { | |
return resolve(it); | |
} | |
const observer = new MutationObserver(mutations => { | |
if (document.querySelector(selector)) { | |
observer.disconnect(); | |
resolve(document.querySelector(selector)); | |
} | |
}); | |
observer.observe(document.body, { | |
childList: true, | |
subtree: true | |
}); | |
}); | |
} | |
async function main() { | |
const ACCEPT_BUTTON = ".accept-btn" | |
console.log("Auto-clicker is initialized!"); | |
console.log(await GM_getValue("webWorkerTest_workerSrc_es5")); | |
console.log(await GM_getValue("webWorkerTest_workerSrc")); | |
function sleep(ms) { | |
return new Promise(resolve => setTimeout(resolve, ms)); | |
} | |
for (;;) { | |
waitForElm(ACCEPT_BUTTON).then((_arrived) => { | |
let acceptButton = document.querySelector(ACCEPT_BUTTON); | |
console.log("Clicking accept"); | |
acceptButton.click(); | |
}); | |
sleep(60000).then((_) => {}); | |
continue; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment