Skip to content

Instantly share code, notes, and snippets.

@dmgolembiowski
Last active April 21, 2024 17:26
Show Gist options
  • Save dmgolembiowski/6c5dc3deb9c7fa0b119b8439806e147e to your computer and use it in GitHub Desktop.
Save dmgolembiowski/6c5dc3deb9c7fa0b119b8439806e147e to your computer and use it in GitHub Desktop.
// ==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);
})();
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 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