Skip to content

Instantly share code, notes, and snippets.

@petersvp
Created February 3, 2021 20:30
Show Gist options
  • Save petersvp/270f7d5d7d548448f4897586a0d389c0 to your computer and use it in GitHub Desktop.
Save petersvp/270f7d5d7d548448f4897586a0d389c0 to your computer and use it in GitHub Desktop.
Batch Query Steam Keys for activation on SteamWorks
// 1. GO TO SteamWorks, into the Query CD Key page, here: https://partner.steamgames.com/querycdkey/
// 2. Fill in your keys below:
// 3. Go to DevTools, Console, and paste all of this here there!
// 4. Report will be printed to the console.
keys = `
0ZQR4-N0H7K-AEJ77
D05V5-P47AP-4ET3Q
GGJZ5-ZN0BR-F74C5
FWZP4-2IXHB-GYV3A
`
var keylist = keys.split("\n");
keylist.forEach(key => {
if(key.length<17) return;
function reqListener () {
let body = this.responseText;
let result = body.split('<h2>Activation Details</h2>')[1];
if (!result && !err) {
console.log('Error quering CD Key ' + key);
}
result = result.split('</table>')[0];
result = result.match(/<td>.*<\/td>/g);
result = result.map(function (line) {
return line.replace(/<[^>]*>/g, '');
});
let line = [key, (result[0] === 'Activated') ? '"' + result[1] + '"' : result[0]].join('\t');
console.log(line);
}
var oReq = new XMLHttpRequest();
oReq.addEventListener("load", reqListener);
oReq.open("GET", "https://partner.steamgames.com/querycdkey/cdkey?cdkey="+key+"&method=Query");
oReq.send();
});
@Jimbly
Copy link

Jimbly commented Feb 4, 2021

Nice idea! You might want to rate limit this or add a warning though - checking 1000 keys at once will look a lot like a DoS attack on partnern.steamgames.com and will get this kind of querying banned quickly =).

@Wikzo
Copy link

Wikzo commented Feb 10, 2022

@petersvp @Jimbly Did you make a version with a rate limiter? My JS skills are not good enough. I tried to look into Underscore via https://stackoverflow.com/questions/5031501/how-to-rate-limit-ajax-requests, but didn't manage to make a JS version I could plug into the DevTools browser console without an HTML file.

@petersvp
Copy link
Author

petersvp commented Feb 10, 2022 via email

@Wikzo
Copy link

Wikzo commented Feb 10, 2022

Thanks for the quick reply! Do you have an idea of how many keys is "safe" to check in one chunk?

And what did you mean with wrapping the code in spiletter? (sorry, I don't know a lot about JS)

@Jimbly
Copy link

Jimbly commented Feb 10, 2022

If you've got a ton of keys to query, the Node.js version that does this is inherently rate limited (limits to one request in-flight at a time), though it takes a little more to set up https://gist.github.com/Jimbly/9f6c6a0d9414310347f2803902ac7bb7

I think it'd be pretty straightforward to change this one to do the same (and reduce a ton of code) now that await fetch() is something that works in modern browsers, instead of using XMLHttpRequest... but that sounds like work, so this is what you've got ;).

@Wikzo
Copy link

Wikzo commented Feb 10, 2022

@Jimbly Thank you. We've been using your Node.js tool for a few years to great success. I was recently put in charge of it and then I saw the comment from Peter and thought I'd look into the updated version. Guess we'll stick to Node.js for now :)

@petersvp
Copy link
Author

petersvp commented Feb 10, 2022 via email

@Jimbly
Copy link

Jimbly commented Feb 10, 2022

Yeah, a couple hundred keys should be fine in the browser, it's not that much traffic. Also, most browsers usually rate limit to 7 connections per host, although in modern days if Valve has switched to a load balancer/server that supports HTTP2 that goes out the window. If you're querying thousands of keys I might be a little careful =).

@petersvp
Copy link
Author

Chrome does rate-limit too, I managed to batch-check 500 keys with no issue. I want to keep this implementation as CLEAN as possible, so people can read what it do and not fear of self-xss attack towards them - after all, pasting untrusted code in the browser console is real concern nowadays, so i at least tried to make my implementation clear what it does :)

@tcurtis526
Copy link

Appreciate this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment