Steam User Manager: Скрипты для летней распродажи 2022 (рекомендации и ивент)

DemeIIIus

Опытный
Дней с нами
3.664
Розыгрыши
0
Сообщения
179
Репутация
38
Реакции
151
Расширение:
актуальная версия 0.0.5

Ссылка на тему с описанием расширения:

Запускать с popup окна расширения в консоли (F12)
Ссылка на страницу popup
или кликнуть на логотип в меню расширения


Для тех кто пользовался расширением и у кого битые аватарки (скрипт чистит базу аватарок):
JavaScript:
open();
chrome.storage.local.get(null, result => {
    for(let id in result.accounts){
        result.accounts[id].avatar = undefined;
        result.accounts[id].video = undefined;
        result.accounts[id].frame = undefined;
        result.accounts[id].name = undefined;
        result.accounts[id].level = undefined;
    }
    chrome.storage.local.set(result, () => chrome.runtime.reload());
});

Для автоматической переавторизации в расширении:
JavaScript:
let n = 0;
chrome.runtime.sendMessage({type: 're_auth', id: document.querySelectorAll('.users>.user')[n++].dataset.id});

chrome.runtime.onMessage.addListener(message => {
    if(message.type == "auth" && message.data.success){
        if(document.querySelectorAll('.users>.user')[n]){
            document.querySelectorAll('.users>.user')[n - 1].scrollIntoView();
            setTimeout(() => chrome.runtime.sendMessage({type: 're_auth', id: document.querySelectorAll('.users>.user')[n++].dataset.id}), 3500);
        }else{
            console.log(true);
        }
    }
});

Скрипт для ивента (поиск игр и получение игрового профиля):
JavaScript:
let store = 'https://store.steampowered.com',
ajaxopendoor = [
    {
        link: '/category/arcade_rhythm/?snr=1_614_615_clorthaxquest_1601',
        door_index: 1
    },
    {
        link: '/category/strategy_cities_settlements/?snr=1_614_615_clorthaxquest_1601',
        door_index: 2
    },
    {
        link: '/category/sports/?snr=1_614_615_clorthaxquest_1601',
        door_index: 3
    },
    {
        link: '/category/simulation/?snr=1_614_615_clorthaxquest_1601',
        door_index: 4
    },
    {
        link: '/category/multiplayer_coop/?snr=1_614_615_clorthaxquest_1601',
        door_index: 5
    },
    {
        link: '/category/casual/?snr=1_614_615_clorthaxquest_1601',
        door_index: 6
    },
    {
        link: '/category/rpg/?snr=1_614_615_clorthaxquest_1601',
        door_index: 7
    },
    {
        link: '/category/horror/?snr=1_614_615_clorthaxquest_1601',
        door_index: 8
    },
    {
        link: '/vr/?snr=1_614_615_clorthaxquest_1601',
        door_index: 9
    },
    {
        link: '/category/strategy/?snr=1_614_615_clorthaxquest_1601',
        door_index: 10
    }
];

chrome.runtime.sendMessage('getAccs', accs => {
    let sha1 = (login, cb) => window.crypto.subtle.digest({name: "SHA-1"}, new Uint8Array(login.match(/.{1}/g).map(s => s.charCodeAt()))).then(result => cb([...new Uint8Array(result)].map(n => n.toString(16)).join(''))),
    chrome_id = `${chrome.runtime.id}_id`,
    save = (accs, cb) => {
        if(accs.length){
            let acc = accs.shift();
            req('get', `${store}/sale/clorthax_quest`, null, {[chrome_id]: acc.id}).done(data => {
                let firstdoor = () => {
                    req('post', `${store}/saleaction/ajaxopendoor`, {
                        sessionid,
                        authwgtoken: config.userinfo.authwgtoken,
                        door_index: 0,
                        clan_accountid: 41316928
                    }, {[chrome_id]: acc.id}).done(data => {
                        opendoor(acc, ajaxopendoor.filter(door => !config.doorinfo[door.door_index].opened).map(door => door.link));
                    }).fail(() => setTimeout(firstdoor, 5000));
                },
                lastdoor = () => {
                    req('get', `${store}/sale/clorthax_quest`, null, {[chrome_id]: acc.id}).done(data => {
                        let clorthax_quest = document.createElement('html');
                        clorthax_quest.innerHTML = data;
                        let authwgtoken = JSON.parse(clorthax_quest.querySelector('#application_config').dataset.userinfo).authwgtoken;
                        req('post', `${store}/saleaction/ajaxopendoor`, {
                            sessionid,
                            authwgtoken,
                            door_index: 11,
                            clan_accountid: 39049601
                        }, {[chrome_id]: acc.id}).done(data => {
                            setTimeout(() => save(accs, cb), 5000);
                        }).fail(() => {
                            setTimeout(lastdoor, 5000);
                        });
                    }).fail(() => {
                        setTimeout(lastdoor, 5000);
                    });
                },
                opendoor = (acc, links) => {
                    if(links.length){
                        let link = links.shift();
                        req('get', `${store}${link}`, null, {[chrome_id]: acc.id}).done(data => {
                            let clorthax_quest = document.createElement('html');
                            clorthax_quest.innerHTML = data;
                            let config = JSON.parse(JSON.stringify(clorthax_quest.querySelector('#application_config').dataset));
                            for(let key in config){
                                config[key] = JSON.parse(config[key]);
                            }
                            if(!config.capsuleinsert){
                                return opendoor(acc, links);
                            }
                            req('post', `${store}/saleaction/ajaxopendoor`, {
                                sessionid,
                                authwgtoken: config.userinfo.authwgtoken,
                                door_index: config.capsuleinsert.payload,
                                clan_accountid: 41316928,
                                datarecord: config.capsuleinsert.datarecord
                            }, {[chrome_id]: acc.id}).done(data => {
                                acc.err = 0;
                                opendoor(acc, links);
                            }).fail(() => {
                                if(acc.err++ < 3){
                                    links.unshift(link);
                                }
                                setTimeout(() => opendoor(acc, links), 5000);
                            });
                        }).fail(() => {
                            if(acc.err++ < 3){
                                links.unshift(link);
                            }
                            setTimeout(() => opendoor(acc, links), 5000);
                        });
                    }else{
                        if(!config.doorinfo[11].opened){
                            lastdoor();
                        }else{
                            setTimeout(() => save(accs, cb), 5000);
                        }
                    }
                };
                let sessionid = data.match(/var g_sessionID = "([\da-f]{24})";/);
                sessionid = sessionid && sessionid[1];
                let clorthax_quest = document.createElement('html');
                clorthax_quest.innerHTML = data;
                let config = JSON.parse(JSON.stringify(clorthax_quest.querySelector('#application_config').dataset));
                for(let key in config){
                    config[key] = JSON.parse(config[key]);
                }
                console.log(`login: ${acc.login}; logged_in:`, config.userinfo.logged_in);
                if(config.userinfo.logged_in && sessionid){
                    if(!config.doorinfo[0].opened){
                        firstdoor();
                    }else{
                        opendoor(acc, ajaxopendoor.filter(door => !config.doorinfo[door.door_index].opened).map(door => door.link));
                    }
                }
            }).fail(() => {
                if(acc.err++ < 3){
                    accs.unshift(acc);
                }
                setTimeout(() => save(accs, cb), 5000);
            });
        }else{
            cb();
        }
    };
    let ids = 0;
    for(let acc of accs){
        sha1(acc.login, id => {
            ids++;
            acc.id = id;
            acc.err = 0;
            if(accs.length == ids){
                save(accs, () => console.log(true));
            }
        });
    }
});


Скрипт для прохождения списка рекомендаций:
 

Вложения

  • sale 22.txt
    2,7 KB · Просмотры: 167
Последнее редактирование:
Спасибо, все четко работает, а есть скрипт для сума для передачи карточек на 1 акк?
 
  • Like
Реакции: DemeIIIus
Спасибо, все четко работает, а есть скрипт для сума для передачи карточек на 1 акк?

JavaScript:
const subtle = window.crypto.subtle,
importKey = s => subtle.importKey('raw', new Uint8Array(typeof s == 'string' ? /^[\da-f]{40}$/.test(s) ? s.match(/.{1,2}/g).map(h => parseInt(h, 16)) : [...atob(s)].map(s => s.charCodeAt()) : s), {name: 'HMAC', hash: { name: 'SHA-1'}}, false, ['sign']);

async function genConfKey(identity_secret, time, tag = 'conf'){
    let key = await importKey(identity_secret);
    let HMAC = await subtle.sign('HMAC', key, new Uint8Array([...new Uint8Array(new Uint32Array([time, 0]).buffer).reverse(), ...[...tag].map(s => s.charCodeAt())]));
    return btoa([...new Uint8Array(HMAC)].map(n => String.fromCharCode(n)).join(''));
};

async function genConfParams(identity_secret, device_id, steamid, tag = 'conf'){
    let time = Math.trunc(Date.now() / 1000);
    return `p=${device_id}&a=${steamid}&k=${await genConfKey(identity_secret, time, tag)}&t=${time}&m=android&tag=${tag}`;
};

chrome.webRequest.onBeforeSendHeaders.addListener(function(details){
    let Referer = details.requestHeaders.findIndex(o => o.name == 'Referer');
    let Origin = details.requestHeaders.findIndex(o => o.name == 'Origin');
    if(details.url == 'https://steamcommunity.com/tradeoffer/new/send' && details.requestHeaders[Origin].value == `chrome-extension://${chrome.runtime.id}`){
        if(Origin >= 0) details.requestHeaders[Origin].value = 'https://steamcommunity.com'; else details.requestHeaders.push({name: 'Origin', value: 'https://steamcommunity.com'});
        if(Referer >= 0) details.requestHeaders[Referer].value = 'https://steamcommunity.com/tradeoffer/new/'; else details.requestHeaders.push({name: 'Referer', value: 'https://steamcommunity.com/tradeoffer/new/'});
    }
    if(/https:\/\/steamcommunity.com\/tradeoffer\/\d*\/accept\/?$/.test(details.url) && (details.requestHeaders[Origin].value == 'https://steamcommunity.com' || details.requestHeaders[Origin].value == `chrome-extension://${chrome.runtime.id}`)){
    if(Origin >= 0) details.requestHeaders[Origin].value = 'https://steamcommunity.com'; else details.requestHeaders.push({name: 'Origin', value: 'https://steamcommunity.com'});
        if(Referer >= 0){
            if(details.requestHeaders[Referer].value.search('https://steamcommunity.com/tradeoffer/') < 0) details.requestHeaders[Referer].value = 'https://steamcommunity.com/tradeoffer/';
        }else details.requestHeaders.push({name: 'Referer', value: 'https://steamcommunity.com/tradeoffer/'});
    }
    return {requestHeaders: details.requestHeaders};
}, {urls: ['https://steamcommunity.com/*']}, ["requestHeaders", "blocking", "extraHeaders"]);

chrome.storage.local.get(['accounts', 'ids'], result => {
    let date = Math.trunc(Date.now() / 1000),
    accounts = {},
    ids = result.ids || {},
    chrome_id = `${chrome.runtime.id}_id`;
    for(let id in result.accounts){
        if(ids[result.accounts[id].accountid]){
            accounts[id] = result.accounts[id];
        }
    }
    let SteamID = (id) => id.length == 17 ? String(id.substr(6) - 97960265728) : '765611' + (Number(id) + 97960265728);

    function send_tradeoffer(id, partner, token, cb){
        req('get', `https://steamcommunity.com/profiles/${SteamID(id)}/inventory/json/753/6/?trading=1&l=english`, null, {[chrome_id]: ids[id]}).done(function(d){
            let assets = [];
            for(let r in d.rgInventory){
                let a = d.rgInventory[r];
                if(d.rgDescriptions[`${a.classid}_${a.instanceid}`].market_fee_app == "2021850"){
                    assets.push({"appid":"753","contextid":"6","amount":1,"assetid":r});
                }
            }
            let sessionid = accounts[ids[id]].cookies.find(cookie => cookie.domain == 'steamcommunity.com' && cookie.name == 'sessionid');
            sessionid = sessionid && sessionid.value;
            if(assets.length && sessionid && partner != id){
                let json_tradeoffer = {"newversion":true,"version":3,"me":{"assets":assets,"currency":[],"ready":false},"them":{"assets":[],"currency":[],"ready":false}};
                let trade_offer_create_params = {"trade_offer_access_token":token};
                let trade = {
                    sessionid: sessionid,
                    serverid: 1,
                    partner: SteamID(partner),
                    tradeoffermessage: '',
                    json_tradeoffer: JSON.stringify(json_tradeoffer),
                    captcha: '',
                    trade_offer_create_params: JSON.stringify(trade_offer_create_params)
                };
                async function sendtradeofer(){
                    req('post', 'https://steamcommunity.com/tradeoffer/new/send', trade, {[chrome_id]: ids[id]}).done(async function(d){
                        if(!d.tradeofferid){
                            setTimeout(() => sendtradeofer(), r(15000, 30000));
                            return;
                        }
                        let tradeofferid = d.tradeofferid, l = ids[id];
                        let ConfParams = (tag = 'conf') => genConfParams(accounts[l].identity_secret, accounts[l].device_id, accounts[l].steamid, tag);
                        let par = await ConfParams();
                        mobileconf = `https://steamcommunity.com/mobileconf/conf?${par}`;
                        async function conf(){
                            req('get', mobileconf, false, {[chrome_id]: l}).done(async function(d){
                                if(/<div id="mobileconf_list">/.test(d)){
                                    let mobileconf_list = d.split(/<div\sclass="mobileconf_list_entry"\s([^>]*)/),
                                    mobileconf_list_entry = [], queryString;
                                    for(let i = 1; i < mobileconf_list.length; i = i + 2){
                                        mobileconf_list_entry.push({
                                            confid: mobileconf_list[i].match(/\sdata-confid="([\d]*)"\s/)[1],
                                            key: mobileconf_list[i].match(/\sdata-key="([\d]*)"\s/)[1],
                                            type: mobileconf_list[i].match(/\sdata-type="([\d]*)"\s/)[1],
                                            creator: mobileconf_list[i].match(/\sdata-creator="([\d]*)"\s/)[1]
                                        });
                                    }
                                    for(let entry of mobileconf_list_entry){
                                        if(entry.creator == tradeofferid){
                                            let par = await ConfParams('allow');
                                            queryString = {...Object.fromEntries(new URLSearchParams(par)), op: 'allow', cid: entry.confid, ck: entry.key};
                                            break;
                                        }
                                    }
                                    if(queryString){
                                        req('post', 'https://steamcommunity.com/mobileconf/ajaxop', queryString, {[chrome_id]: ids[id]}).done(function(d){
                                            if(d.success){
                                                cb();
                                            }else{
                                                setTimeout(() => conf(), r(5000, 7000));
                                            }
                                        }).fail(function(){
                                            setTimeout(() => conf(), r(15000, 30000));
                                        });
                                    }else{
                                        cb();
                                    }
                                }else{
                                    let par = await ConfParams();
                                    mobileconf = `https://steamcommunity.com/mobileconf/conf?${par}`;
                                    setTimeout(() => conf(), r(5000, 7000));
                                }
                            }).fail(function(){
                                setTimeout(() => sendtradeofer(), r(15000, 30000));
                            });
                        };
                        conf();
                    });
                };
                sendtradeofer();
            }else{
                setTimeout(() => cb(), r(15000, 30000));
            }
        }).fail(function(){
            setTimeout(() => send_tradeoffer(id, partner, token, cb), r(15000, 30000));
        });
    };

    let r = (mn, mx) => Math.floor(Math.random() * (mx - mn + 1 )) + mn;

    let IdKeys = Object.keys(ids);

    function sendCards(){
        if(IdKeys.length){
            setTimeout(() => send_tradeoffer(IdKeys.shift(), '1234567', 'qwerty', function(){sendCards();}), r(3000, 5000));
        }else{
            console.log(true);
        }
    };
    sendCards();

});

В конце кода найди строку с
setTimeout(() => send_tradeoffer(IdKeys.shift(), '1234567', 'qwerty', function(){sendCards();}), r(3000, 5000));
и поменяй значение партнер и токен с трейд ссылки акка на который отправляешь
steamcommunity.com/tradeoffer/new/?partner=1234567&token=qwerty
 
  • Like
Реакции: wish666
Оцените пожалуйста расширение на странице магазина хрома если оно вам понравилось
 
Скрипт для автоматической переавторизации в расширении не работает ,может со стороны стима какие ограничения или лаги. Undefined error пишет, добавите скрипт для голосования и просмотра рекомендаций к зимней распродажи?
 
Скрипт для автоматической переавторизации в расширении не работает ,может со стороны стима какие ограничения или лаги. Undefined error пишет, добавите скрипт для голосования и просмотра рекомендаций к зимней распродажи?
Они что то поменяли с авторизацией, пока что не могу разобраться в этом
---------Двойное сообщение соединено: ---------
Скрипт для автоматической переавторизации в расширении не работает ,может со стороны стима какие ограничения или лаги. Undefined error пишет, добавите скрипт для голосования и просмотра рекомендаций к зимней распродажи?
JavaScript:
const subtle = window.crypto.subtle,
importKey = s => subtle.importKey('raw', new Uint8Array(typeof s == 'string' ? /^[\da-f]{40}$/.test(s) ? s.match(/.{1,2}/g).map(h => parseInt(h, 16)) : [...atob(s)].map(s => s.charCodeAt()) : s), {name: 'HMAC', hash: { name: 'SHA-1'}}, false, ['sign']);

async function genAuthCode(shared_secret){
    let key = await importKey(shared_secret);
    let HMAC = await subtle.sign('HMAC', key, new Uint8Array(new Uint32Array([Math.trunc(Date.now() / 30000), 0]).buffer).reverse());
    HMAC = new Uint8Array(HMAC);
    let start = HMAC[19] & 0x0F;
    HMAC = new Uint8Array(HMAC.slice(start, start + 4));
    let fullcode = new DataView(HMAC.buffer).getUint32(0) & 0x7FFFFFFF, chars = '23456789BCDFGHJKMNPQRTVWXY', code = '';
    for(let i = 0; i < 5; i++) code += chars.charAt(fullcode % chars.length), fullcode /= chars.length;
    return code;
};
let index = 0, items = [],
copy = text => {
    let textarea = document.createElement('textarea');
    textarea.setAttribute('type', 'hidden');
    textarea.textContent = text;
    document.body.appendChild(textarea);
    textarea.select();
    document.execCommand('copy');
    document.body.removeChild(textarea);
    console.clear();
};
chrome.storage.local.get('accounts', data => {
    for(let k in data.accounts){
        items.push(data.accounts[k]);
    }
    copy('next();');
});

function next(){
    if(!items[index]) return console.log(true);
    let item = items[index++];
    chrome.runtime.sendMessage({type: 'go_over', id: item.accountid, link: 'https://steamcommunity.com/login/home/?goto=%2Fmy%2F', active: true});
    genAuthCode(item.shared_secret).then(code => {
        copy(item.login);
        console.log(index, 'of', items.length);
        console.log('-----------------------');
        console.log('login:');
        console.log(item.login);
        console.log('-----------------------');
        console.log('password:');
        console.log(item.password);
        console.log('-----------------------');
        console.log('2fa:');
        console.log(code);
    });
};

Пока что смог придумать только такое решение переавторизации,
нужно открыть окно расширения в новой вкладке, для этого нужно кликнуть на логотип в расширении, открыть и вставить в консоль и запустить скрипт после чего запустить функцию: next();, после чего откроется новая вкладка авторизации стим и в консоли вкладки с расширением выведется данные от акка, авторизоваться и закрыть окно авторизации и снова запустить next(); и он перейдет к следующему акку и так пока не пройдет все акки.
 
Последнее редактирование:
  • Like
Реакции: wish666
да добавьте скрипт для голосования и просмотра рекомендаций
 
Со вчерашнего дня не получает карточки если не открыть хотя-бы раз страницу магазина, сделал костыль, который по очереди открывает и закрывает станицу магазина
JavaScript:
let onMessage = (message, sender, sendResponse) => {
    if(message == 'onCompleted'){
        if(items[index]){
            setTimeout(() => {
                chrome.tabs.remove(sender.tab.id);
                chrome.runtime.sendMessage({
                    type: 'go_over',
                    id: items[index++].accountid,
                    link: 'https://store.steampowered.com/',
                    active: false
                });
            }, 7000);
        }else{
            setTimeout(() => {chrome.tabs.remove(sender.tab.id);}, 7000);
            chrome.runtime.onMessage.removeListener(onMessage);
            console.log(true);
        }
    }
};

chrome.runtime.onMessage.addListener(onMessage);

let index = 0, items = [];
chrome.storage.local.get('accounts', data => {
    for(let k in data.accounts){
        items.push(data.accounts[k]);
    }
    chrome.runtime.sendMessage({
        type: 'go_over',
        id: items[index++].accountid,
        link: 'https://store.steampowered.com/',
        active: false
    });
});
 
Здравствуйте , по возможности ,обновите пожалуйста скрипт для перекидывания карточек на 1 акк
 
Здравствуйте , по возможности ,обновите пожалуйста скрипт для перекидывания карточек на 1 акк
Здравствуйте, замените 999999999 и qwerty в скрипте
пример: steamcommunity.com/tradeoffer/new/?partner=999999999&token=qwerty
 

Вложения

  • send_tradeoffer_23.txt
    12,6 KB · Просмотры: 19
  • Like
Реакции: wish666 и sup_+