1
0

chore: add automation to perform clicks on rewards.bing.com

This commit is contained in:
2026-04-30 12:53:05 +02:00
parent 33e159815f
commit c0cc47dd5c
+120 -66
View File
@@ -1,84 +1,138 @@
// ==UserScript== // ==UserScript==
// @name Bing Rewarder // @name Bing Rewarder
// @namespace bing // @namespace bing
// @description Search for 30 random words on bing to rack up reward points, just search bing once to start script // @description Utilities to semiautomate Bing reward point redemption
// @include https://www.bing.com/* // @include https://www.bing.com/*
// @version 1.5 // @match https://rewards.bing.com/
// @version 1.6
// @updateURL https://git.alexbcberio.com/alexbcberio/userscripts/raw/branch/main/bing-rewarder/index.js // @updateURL https://git.alexbcberio.com/alexbcberio/userscripts/raw/branch/main/bing-rewarder/index.js
// @downloadURL https://git.alexbcberio.com/alexbcberio/userscripts/raw/branch/main/bing-rewarder/index.js // @downloadURL https://git.alexbcberio.com/alexbcberio/userscripts/raw/branch/main/bing-rewarder/index.js
// @grant GM.registerMenuCommand // @grant GM.registerMenuCommand
// ==/UserScript== // ==/UserScript==
(function() {
GM.registerMenuCommand("Start searching", doSearch); switch (location.host) {
case "rewards.bing.com":
const urlSearchParams = new URLSearchParams(location.search); break;
const maxSearch = 30; case "bing.com":
const wordMinLength = 4; case "www.bing.com":
const wordMaxLength = 10; bingSearch();
const minWaitSecondsToSearch = 5; break;
const maxWaitSecondsToSearch = 20;
if (location.pathname === "/search" && !urlSearchParams.get("rnoreward")) {
newSearch();
}
function newSearch() {
let brNum = urlSearchParams.get("brNum");
if (brNum == null){
brNum = 0;
}
brNum = parseInt(brNum) + 1;
if (isNaN(brNum)) {
brNum = 1;
} }
if (brNum > maxSearch){ function bingRewards() {
return false; // Wait times to close tab
const minBaseTimeout = 3000;
const maxBaseTimeout = 5000;
// Extra time to wait to perform next click
const minExtraTimeout = 500;
const maxExtraTimeout = 1750;
const pendingElements = document.querySelectorAll("mee-rewards-points .mee-icon-AddMedium");
if (pendingElements.length > 0) {
GM.registerMenuCommand("Collect points", collectPoints);
}
function collectPoints() {
collectPoint(0);
}
function collectPoint(num) {
if (!pendingElements[num]) {
return;
}
const link = pendingElements[num].closest("a");
const timeoutMs = minBaseTimeout + Math.random() * (maxBaseTimeout - minBaseTimeout);
if (link) {
const linkLocation = link.getAttribute("href");
const tab = window.open(linkLocation);
setTimeout(() => {
tab.close();
}, timeoutMs);
}
setTimeout(() => {
collectPoint(num+1);
}, timeoutMs + minExtraTimeout + Math.random() * (maxExtraTimeout - minExtraTimeout));
}
} }
// timeout to help disguise this as being a script function bingSearch() {
setTimeout(() => { GM.registerMenuCommand("Start searching", doSearch);
doSearch(brNum);
}, (Math.random() * (maxWaitSecondsToSearch - minWaitSecondsToSearch) * 1e3) + minWaitSecondsToSearch * 1e3);
}
function doSearch(iteration = 0) { const urlSearchParams = new URLSearchParams(location.search);
const wordLength = Math.floor((Math.random() * (wordMaxLength - wordMinLength)) + wordMinLength); const maxSearch = 30;
const newQuery = createRandomWord(wordLength); const wordMinLength = 4;
const wordMaxLength = 10;
const minWaitSecondsToSearch = 5;
const maxWaitSecondsToSearch = 20;
if (location.pathname === "/") { if (location.pathname === "/search" && !urlSearchParams.get("rnoreward")) {
const form = document.querySelector("form"); newSearch();
const searchInput = form.querySelector("[name=q]"); }
searchInput.value = newQuery; function newSearch() {
form.submit(); let brNum = urlSearchParams.get("brNum");
return;
if (brNum == null){
brNum = 0;
}
brNum = parseInt(brNum) + 1;
if (isNaN(brNum)) {
brNum = 1;
}
if (brNum > maxSearch){
return false;
}
// timeout to help disguise this as being a script
setTimeout(() => {
doSearch(brNum);
}, (Math.random() * (maxWaitSecondsToSearch - minWaitSecondsToSearch) * 1e3) + minWaitSecondsToSearch * 1e3);
}
function doSearch(iteration = 0) {
const wordLength = Math.floor((Math.random() * (wordMaxLength - wordMinLength)) + wordMinLength);
const newQuery = createRandomWord(wordLength);
if (location.pathname === "/") {
const form = document.querySelector("form");
const searchInput = form.querySelector("[name=q]");
searchInput.value = newQuery;
form.submit();
return;
}
urlSearchParams.set("q", newQuery);
urlSearchParams.set("brNum", iteration);
location.search = urlSearchParams.toString();
}
// random word generator script, original source url
// http://james.padolsey.com/javascript/random-word-generator/
function createRandomWord(desiredLength) {
var consonants = 'bcdfghjklmnpqrstvwxyz'.split(''),
vowels = 'aeiou'.split(''),
rand = function(limit) {
return Math.floor(Math.random()*limit);
},
i, word='', length = parseInt(desiredLength,10);
for (i=0;i<length/2;i++) {
var randConsonant = consonants[rand(consonants.length)],
randVowel = vowels[rand(vowels.length)];
word += (i===0) ? randConsonant.toUpperCase() : randConsonant;
word += i*2<length-1 ? randVowel : '';
}
return word;
}
} }
urlSearchParams.set("q", newQuery); })();
urlSearchParams.set("brNum", iteration);
location.search = urlSearchParams.toString();
}
// random word generator script, original source url
// http://james.padolsey.com/javascript/random-word-generator/
function createRandomWord(desiredLength) {
var consonants = 'bcdfghjklmnpqrstvwxyz'.split(''),
vowels = 'aeiou'.split(''),
rand = function(limit) {
return Math.floor(Math.random()*limit);
},
i, word='', length = parseInt(desiredLength,10);
for (i=0;i<length/2;i++) {
var randConsonant = consonants[rand(consonants.length)],
randVowel = vowels[rand(vowels.length)];
word += (i===0) ? randConsonant.toUpperCase() : randConsonant;
word += i*2<length-1 ? randVowel : '';
}
return word;
}