From f424787db789a0edeacfb368ab1973a92489b3a6 Mon Sep 17 00:00:00 2001 From: Abhorrent_Anger Date: Sun, 16 Aug 2026 22:13:47 +0300 Subject: [PATCH] CSRF fetching if needed --- ManncoStoreGiveawayAutojoiner.user.js | 101 +++++++++++++++++--------- 1 file changed, 67 insertions(+), 34 deletions(-) diff --git a/ManncoStoreGiveawayAutojoiner.user.js b/ManncoStoreGiveawayAutojoiner.user.js index 56ffc2c..20b79ee 100644 --- a/ManncoStoreGiveawayAutojoiner.user.js +++ b/ManncoStoreGiveawayAutojoiner.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name Mann Co. Store Giveaway Autojoiner // @namespace http://tampermonkey.net/ -// @version 2026-08-20 +// @version 2026-08-21 // @description Tries to join giveaways on page load // @author Abhorrent_Anger // @include /^https?:\/\/mannco\.store\/giveaways.?$/ @@ -14,46 +14,79 @@ setTimeout(function () { location.reload(); }, 90 * 60 * 1000); +const OPEN_GIVEAWAY_SELECTOR = '.giveaways-list-item:not(.giveaways-list-item--joined)'; + waitForKeyElements('.giveaways__content', () => { - setTimeout(function () { - $('.giveaways-list-item:not(.giveaways-list-item--joined)').each(function () { - let giveawayURL = $(this).attr('href'); - let giveaway = /[^/]*$/.exec(giveawayURL)[0]; - let giveawayJoinURL = 'https://api.mannco.store/giveaways/join/' + giveaway; + if ($(OPEN_GIVEAWAY_SELECTOR).len == 0) { + return true; + } + updateTokensandJoin(); - let bearerToken = getTokenFromCookie('auth'); - let csrfToken = getTokenFromCookie('csrf'); - - let xJoin = new GM_xmlhttpRequest({ - method: 'POST', - url: giveawayJoinURL, - headers: { 'Authorization': 'Bearer ' + bearerToken, 'X-Csrf-Token': csrfToken }, - onreadystatechange: function (response) { - if (response.readyState == 4 && response.status == 200) { - console.log('Successfully joined ' + giveaway, response.response); - } else { - console.log("Couldn't join " + giveaway, response); - } - } - }); - }); - console.log('Done with giveaway join attempts'); - }, 2000); + console.log('Done with giveaway join attempts'); }); -const getCookieValue = (name) => ( - document.cookie.match('(^|;)\\s*' + name + '\\s*=\\s*([^;]+)')?.pop() || '' -) +function updateTokensandJoin() { + var bearerToken = getTokenFromCookie('auth'); + var csrfToken = getTokenFromCookie('csrf'); + if (csrfToken) { + console.log('Fetched the CSRF token from cookies: ', csrfToken) + joinGiveaways(bearerToken, csrfToken); + return true; + } + let xCSRF = new GM_xmlhttpRequest({ + method: 'GET', + url: 'https://api.mannco.store/csrf/token', + headers: { 'Authorization': 'Bearer ' + bearerToken }, + onreadystatechange: function (response) { + if (response.readyState == 4) { + if (response.status == 200) { + let array = JSON.parse(response.response); + csrfToken = array['content']['csrf_token']; + console.log('Successfully updated the CSRF token: ', csrfToken) + joinGiveaways(bearerToken, csrfToken); + } else { + console.log('Couldn\'t get a CSRF token!') + } + } + } + }); +} + +function joinGiveaways(bearerToken, csrfToken) { + $(OPEN_GIVEAWAY_SELECTOR).each(function () { + let giveawayURL = $(this).attr('href'); + let giveaway = /[^/]*$/.exec(giveawayURL)[0]; + let giveawayJoinURL = 'https://api.mannco.store/giveaways/join/' + giveaway; + let xJoin = new GM_xmlhttpRequest({ + method: 'POST', + url: giveawayJoinURL, + headers: { 'Authorization': 'Bearer ' + bearerToken, 'X-Csrf-Token': csrfToken }, + onreadystatechange: function (response) { + if (response.readyState == 4) { + if (response.status == 200) { + console.log('Successfully joined ' + giveaway, response.response); + } else { + console.log("Couldn't join " + giveaway, response, bearerToken, csrfToken); + } + } + } + }); + }); +} + +function getCookie(name) { + const value = `; ${document.cookie}`; + const parts = value.split(`; ${name}=`); + if (parts.length === 2) return parts.pop().split(';').shift(); +} function getTokenFromCookie(tokenName) { - let tokenArray = getCookieValue(tokenName); - let decodedTokenArray = decodeURIComponent(tokenArray); + let cookieArray = getCookie(tokenName); + + let decodedTokenArray = decodeURIComponent(cookieArray); if (typeof decodedTokenArray !== 'string' || !decodedTokenArray) { return false; } - let array = JSON.parse(decodedTokenArray); - if (Array.isArray(array)) { - return array['token']; - } - return false; + let array = JSON.parse(decodedTokenArray, true); + return array['token']; } \ No newline at end of file