Skip to content

Instantly share code, notes, and snippets.

@lylatr
Last active August 31, 2024 14:56
Show Gist options
  • Save lylatr/4ebe6a1d4ba80f1348988785162e095a to your computer and use it in GitHub Desktop.
Save lylatr/4ebe6a1d4ba80f1348988785162e095a to your computer and use it in GitHub Desktop.
// ==UserScript==
// @name Download Achievement Images
// @namespace http://tampermonkey.net/
// @version 0.1.4
// @description Button to mass download achievement images
// @author lylat
// @match https://steamcommunity.com/stats/*/achievements*
// @icon https://cdn.discordapp.com/avatars/749437490883985499/7c4053deed909ec48be2656da4b12b76.png
// @require https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.5/jszip.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.0/FileSaver.min.js
// @grant GM_xmlhttpRequest
// @connect cdn.cloudflare.steamstatic.com
// @connect cdn.akamai.steamstatic.com
// ==/UserScript==
(()=>
{
'use strict';
const zip = new JSZip();
const dlBtn = document.createElement('a');
dlBtn.innerHTML = '<span>Download Achievement Images</span>';
dlBtn.classList.add('tabOn');
document.querySelector('#achievementsTabOn')?.appendChild(dlBtn);
dlBtn.addEventListener('click', ()=> {
const achImgs = [...document.querySelectorAll('.achieveRow')];
let count = 0;
achImgs.forEach(i => {
GM_xmlhttpRequest ({
method: 'GET',
url: i.querySelector('.achieveImgHolder > img').src,
responseType: 'blob',
onload: (r) => {
const achName = i.querySelector('.achieveTxtHolder > .achieveTxt > h3')?.innerText.replace(/\\|\/|:|\*|\?|"|<|>|\|/, '');
const filename = achName.length > 100 ? achName.slice(0, 100) + '...' : achName;
zip.file(`${filename}.jpg`, r.response, { binary: true });
if(++count === achImgs.length) {
zip.generateAsync({ type: 'blob' }).then(c => {
saveAs(c, document.querySelector('.profile_small_header_texture > h1')?.textContent);
});
}
}
});
});
});
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment