Revadike Posted July 26, 2018 Report Posted July 26, 2018 global._mckay_statistics_opt_out = true; // opting out any statistical collection program // modules being used const SteamUser = require("steam-user"); const path = require("path"); const fs = require("fs"); const config = require(path.join(__dirname, "config.js")); process.on('unhandledRejection', (reason, p) => { console.error(reason, 'Unhandled Rejection at Promise', p); }).on('uncaughtException', err => { console.error(err, 'Uncaught Exception thrown'); }); const appTokens = fs.existsSync(path.join(__dirname, "apptokens.json")) ? JSON.parse(fs.readFileSync(path.join(__dirname, "apptokens.json"), "utf8").toString() || "{}") : {}; const depotKeys = fs.existsSync(path.join(__dirname, "depotkeys.json")) ? JSON.parse(fs.readFileSync(path.join(__dirname, "depotkeys.json"), "utf8").toString() || "{}") : {}; const running = { apptokens: false, depotkeys: false, }; const user = new SteamUser({ enablePicsCache: true }); user.logOn(config.loginAnonymous ? undefined : require(path.join(__dirname, "login.js"))); // logging in using your username and password, more info about this function: https://github.com/DoctorMcKay/node-steam-user/blob/master/components/logon.js#L9 user.on("loggedOn", () => { console.log("Logged onto Steam as " + user.steamID.getSteamID64()); const chunksize = 10000; // seems best chunk size const idList = []; for (let i = chunksize; i < 1000000; i += chunksize) { const idSubList = []; for (let j = i - chunksize; j < i; j++) { idSubList.push(j); } idList.push(idSubList); } // doing this for all appids or packages just hangs forever running.apptokens = true; getTokens(); function getTokens() { const idSubList = idList.shift(); user.getProductAccessToken(idSubList.filter(id => !appTokens.hasOwnProperty(id)), [], (apps, packageTokens, appDeniedTokens) => { console.log("Tokens denied for " + appDeniedTokens.length + " apps of range " + idSubList[0] + "-" + idSubList[idSubList.length - 1]); for (let appid in apps) { if (apps.hasOwnProperty(appid)) { const token = apps[appid].toString(); appTokens[appid] = token; if (token !== "0") { // otherwise it'd be too spammy console.log("App " + appid + ": " + apps[appid].toString()); } } } if (idList.length > 0) { getTokens(); } else { fs.writeFileSync(path.join(__dirname, "apptokens.json"), JSON.stringify(appTokens, null, 4), "utf8"); console.log("Dumped product access tokens to apptokens.json!"); running.apptokens = false; if (!running.apptokens && !running.depotkeys) { console.log("Logging off of Steam"); user.logOff(); } } }); } }); user.on("appOwnershipCached", getDepotKeys); function getDepotKeys() { console.log("App ownership cached. Requesting appinfos..."); let logger = setInterval(console.log, 6000, "Still requesting appinfos..."); running.depotkeys = true; user.getProductInfo(user.getOwnedApps().map(appid => parseInt(appid, 10)), [], true, (apps, packages, unknownApps) => { clearInterval(logger); console.log("Got appinfos of " + Object.keys(apps).length + " apps"); if (unknownApps.length > 0) { console.log("Found " + unknownApps.length + " unknown apps"); } const depots = {}; for (let appid in apps) { if (!apps.hasOwnProperty(appid) || !apps[appid].hasOwnProperty(`appinfo`) || !apps[appid].appinfo.hasOwnProperty(`depots`)) { // skip if no depot info continue; } Object.keys(apps[appid].appinfo.depots).filter(id => !isNaN(id)).forEach(depotid => depots[depotid] = appid); } console.log("Requesting depot decryption keys of " + Object.keys(depots).length + " depots"); for (let depotid in depots) { if (depotKeys.hasOwnProperty(depotid)) { depots[depotid] = true; continue; } const appid = depots[depotid]; try { user.getDepotDecryptionKey(parseInt(appid, 10), parseInt(depotid, 10), (error, key) => { if (error) { console.log("Depot " + depotid + ": " + error.message); } else { depotKeys[depotid] = key.toString("base64"); console.log("Depot " + depotid + ": " + depotKeys[depotid]); } depots[depotid] = true; if (Object.keys(depots).length === Object.values(depots).filter(v => v === true).length) { fs.writeFileSync(path.join(__dirname, "depotkeys.json"), JSON.stringify(depotKeys, null, 4), "utf8"); console.log("Dumped depot keys to depotkeys.json!"); running.depotkeys = false; if (!running.apptokens && !running.depotkeys) { console.log("Logging off of Steam"); user.logOff(); } } }); } catch (error) { console.log(error); depots[depotid] = true; if (Object.keys(depots).length === Object.values(depots).filter(v => v === true).length) { fs.writeFileSync(path.join(__dirname, "depotkeys.json"), JSON.stringify(depotKeys, null, 4), "utf8"); console.log("Dumped depot keys to depotkeys.json!"); running.depotkeys = false; if (!running.apptokens && !running.depotkeys) { console.log("Logging off of Steam"); user.logOff(); } } } } }); } The app token dumping works just fine, but the depot key dumping thows RangeError's left and right: RangeError: Index out of range at checkOffset (buffer.js:851:11) at Buffer.readUInt32LE (buffer.js:913:5) at node_modules\steam-user\components\cdn.js:80:58 at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:439:3) At buffer.js:851.Any idea why? And how we can fix that? Quote
Revadike Posted July 26, 2018 Author Report Posted July 26, 2018 So seems you take an invalid index here for readUInt32LE: if (file && Math.floor(Date.now() / 1000) - file.readUInt32LE(0) < (60 * 60 * 24 * 14)) { ... } Quote
Dr. McKay Posted July 26, 2018 Report Posted July 26, 2018 One of the files in your local cache appears to be corrupted. I'll push a fix to handle this case. Revadike 1 Quote
Revadike Posted July 26, 2018 Author Report Posted July 26, 2018 One of the files in your local cache appears to be corrupted. I'll push a fix to handle this case.Will disabling the storage, like below, also fix the problem? user.storage.on("save", (filename, contents, callback) => callback()); user.storage.on("read", (filename, callback) => callback()); Quote
Dr. McKay Posted July 26, 2018 Report Posted July 26, 2018 Yes, but that's a bit like cutting off your leg because you got a cut. Quote
Revadike Posted July 26, 2018 Author Report Posted July 26, 2018 Yes, but that's a bit like cutting off your leg because you got a cut.Not really, I also cache my data. So, it's all good. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.