From 48982cce5d22f832c3936e1ff7e5c8d2d29c81b4 Mon Sep 17 00:00:00 2001 From: tovernaar123 Date: Sun, 3 Apr 2022 21:23:59 +0200 Subject: [PATCH 1/3] auto refresh met password passowrd en username --- bot.js | 105 +++++++++++++++++++++++++++++++++++++++++++--- package-lock.json | 2 +- 2 files changed, 100 insertions(+), 7 deletions(-) diff --git a/bot.js b/bot.js index 3f347ba..7a5ffed 100644 --- a/bot.js +++ b/bot.js @@ -1,6 +1,7 @@ import fetch from 'node-fetch'; import getPixels from "get-pixels"; import WebSocket from 'ws'; +import https from 'https' const PREFIX = process.env.PREFIX || "simple" const VERSION_NUMBER = 11; @@ -13,19 +14,35 @@ const args = process.argv.slice(2); // console.error("Missing access token.") // process.exit(1); //} -if (args.length != 1 && !process.env.REDDIT_SESSION) { - console.error("Missing reddit_session cookie.") + + +let redditSessionCookies = (process.env.REDDIT_SESSION || args[0]) +if (redditSessionCookies) redditSessionCookies = redditSessionCookies.split(';') + +let userNames = (process.env.USERNAME || false) +if (userNames) userNames = userNames.split(';'); +let passWords = (process.env.PASSWORD || false) +if (passWords) passWords = passWords.split(';'); + +if (userNames || passWords) { + if (userNames?.length !== passWords?.length) { + console.error('Een user per password graar (en ook andersom).'); + userNames = false; + passWords = false; + } +} +if (!(redditSessionCookies || (userNames && passWords))) { + console.error("Missing credintials cookie.") process.exit(1); } - -let redditSessionCookies = (process.env.REDDIT_SESSION || args[0]).split(';'); +if(!redditSessionCookies) redditSessionCookies = []; var hasTokens = false; let accessTokenHolders = []; let defaultAccessToken; -if (redditSessionCookies.length > 4) { +if (redditSessionCookies?.length > 4) { console.warn("Meer dan 4 reddit accounts per IP addres wordt niet geadviseerd!") } @@ -138,7 +155,7 @@ let getPendingWork = (work, rgbaOrder, rgbaCanvas) => { }; (async function () { - refreshTokens(); + await refreshTokens(); // wachten totdat je de tokens hebt (duurt nu langer); connectSocket(); startPlacement(); @@ -166,6 +183,66 @@ function startPlacement() { } } + +function request(options, body) { + let promise = new Promise((resolve, reject) => { + const req = https.request(options, (res) => { + resolve(res); + }); + + req.on('error', (e) => { + reject(error); + }); + if (body) { + req.write(body); //stuurd de pass en username + } + req.end(); + }); + return promise +} +async function GetToken(username, password) { + let place_url = "https://www.reddit.com/r/place/" + let reddit_url = "https://www.reddit.com/login/" + let response = await fetch(reddit_url); //pak de csrf token van de login form (ook nodig voor sesion cookie) + let responseText = await response.text(); + + let csrf = responseText.match(/csrf_token" value\="(.*?)">/)[1]; // crsf token + + let cookies = response.headers.raw()['set-cookie']; //alle cookie + let session = cookies[0].match(/session\=(.*?;)/)[1]; // eerste is altijd (hoop ik) de session cookie + + let body = `csrf_token=${csrf}&password=${password}&username=${username}`; //body van login request + + const options = { + hostname: 'www.reddit.com', + port: 443, + path: '/login', + method: 'POST', + headers: { + 'cookie': `session=${session}`, //login request heeft session cookie nodig (van de eerde login form) + } + }; + + //node fetch werkt hier niet want die set bepalde header die niet mogen geset worden + let result = await request(options, body); + let cookie_reddit_session; + try { + cookie_reddit_session = result.headers['set-cookie'][0].match(/reddit_session\=(.*?);/)[1]; //reddit_session cookie + } catch (error) { + console.error(error); + } + + response = await fetch(place_url, { + headers: { + cookie: `reddit_session=${cookie_reddit_session}` + } + }) + responseText = await response.text(); + + return responseText.split('\"accessToken\":\"')[1].split('"')[0]; +} + + async function refreshTokens() { if (accessTokenHolders.length === 0) { for (const _ of redditSessionCookies) { @@ -174,6 +251,22 @@ async function refreshTokens() { } let tokens = []; + if (userNames && passWords) { + for (let i = 0; i < userNames.length; i++) { + let password = passWords[i]; + let username = userNames[i]; + console.log(`Reddit session token ophalen voor ${username}`); + let token = await GetToken(username, password); + tokens.push(token); + } + console.log("Refreshed tokens: ", tokens) + + accessTokens = tokens; + defaultAccessToken = tokens[0]; + hasTokens = true; + return + } + for (const cookie of redditSessionCookies) { const response = await fetch("https://www.reddit.com/r/place/", { headers: { diff --git a/package-lock.json b/package-lock.json index 5bfedd1..ef36742 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "placenl-bot-headless", + "name": "Bot", "lockfileVersion": 2, "requires": true, "packages": { From 7408f73ae1c010f291adc3ad9abec2f11efe2e14 Mon Sep 17 00:00:00 2001 From: Koen van den Heuvel Date: Mon, 4 Apr 2022 15:06:34 +0000 Subject: [PATCH 2/3] fix(AutoRefreshToken): Fix refreshTokens() script for new user/pass feature --- bot.js | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/bot.js b/bot.js index 7a5ffed..989cde8 100644 --- a/bot.js +++ b/bot.js @@ -248,6 +248,10 @@ async function refreshTokens() { for (const _ of redditSessionCookies) { accessTokenHolders.push({}); } + + for (const _ of userNames) { + accessTokenHolders.push({}); + } } let tokens = []; @@ -259,24 +263,18 @@ async function refreshTokens() { let token = await GetToken(username, password); tokens.push(token); } - console.log("Refreshed tokens: ", tokens) - - accessTokens = tokens; - defaultAccessToken = tokens[0]; - hasTokens = true; - return - } - - for (const cookie of redditSessionCookies) { - const response = await fetch("https://www.reddit.com/r/place/", { - headers: { - cookie: `reddit_session=${cookie}` - } - }); - const responseText = await response.text() + } else if (redditSessionCookies) { + for (const cookie of redditSessionCookies) { + const response = await fetch("https://www.reddit.com/r/place/", { + headers: { + cookie: `reddit_session=${cookie}` + } + }); + const responseText = await response.text() - let token = responseText.split('\"accessToken\":\"')[1].split('"')[0]; - tokens.push(token); + let token = responseText.split('\"accessToken\":\"')[1].split('"')[0]; + tokens.push(token); + } } console.log("Refreshed tokens: ", tokens) From df7975725ef7b22e055778a11232247909339a1f Mon Sep 17 00:00:00 2001 From: Koen van den Heuvel Date: Mon, 4 Apr 2022 15:30:52 +0000 Subject: [PATCH 3/3] fixup! fix(AutoRefreshToken): Fix refreshTokens() script for new user/pass feature --- bot.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/bot.js b/bot.js index 989cde8..be025eb 100644 --- a/bot.js +++ b/bot.js @@ -248,9 +248,10 @@ async function refreshTokens() { for (const _ of redditSessionCookies) { accessTokenHolders.push({}); } - - for (const _ of userNames) { - accessTokenHolders.push({}); + if (userNames) { + for (const _ of userNames) { + accessTokenHolders.push({}); + } } }