您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add autoupgrades and autokeys
// ==UserScript== // @name Bot for Hamster // @namespace http://tampermonkey.net/ // @version 0.21 // @description Add autoupgrades and autokeys // @author SPomodor // @match *://*.hamsterkombat.io/* // @match *://*.hamsterkombatgame.io/* // ==/UserScript== (function() { 'use strict'; var maxUpgrades = 10; var statusUpgrades = false // for (var i = 0; i < localStorage.length; i++){ // console.log(localStorage.getItem(localStorage.key(i))); // }; const games = { 1: { name: 'Riding Extreme 3D', appToken: 'd28721be-fd2d-4b45-869e-9f253b554e50', promoId: '43e35910-c168-4634-ad4f-52fd764a843f', timing: 30000, // 30 seconds attempts: 25, }, 2: { name: 'Chain Cube 2048', appToken: 'd1690a07-3780-4068-810f-9b5bbf2931b2', promoId: 'b4170868-cef0-424f-8eb9-be0622e8e8e3', timing: 30000, // 30 seconds attempts: 20, }, 3: { name: 'My Clone Army', appToken: '74ee0b5b-775e-4bee-974f-63e7f4d5bacb', promoId: 'fe693b26-b342-4159-8808-15e3ff7f8767', timing: 180000, // 180 seconds attempts: 30, }, 4: { name: 'Train Miner', appToken: '82647f43-3f87-402d-88dd-09a90025313f', promoId: 'c4480ac7-e178-4973-8061-9ed5b2e17954', timing: 30000, // 30 seconds attempts: 15, }, 5: { name: 'Merge Away', appToken: '8d1cc2ad-e097-4b86-90ef-7a27e19fb833', promoId: 'dc128d28-c45b-411c-98ff-ac7726fbaea4', timing: 30000, // 30 seconds attempts: 25, }, 6: { name: 'Twerk Race 3D', appToken: '61308365-9d16-4040-8bb0-2f4a4c69074c', promoId: '61308365-9d16-4040-8bb0-2f4a4c69074c', timing: 30000, // 30 seconds attempts: 20, }, 7: { name: 'Polysphere', appToken: '2aaf5aee-2cbc-47ec-8a3f-0962cc14bc71', promoId: '2aaf5aee-2cbc-47ec-8a3f-0962cc14bc71', timing: 20000, // 20 seconds attempts: 20, }, 8: { name: 'Mow and Trim', appToken: 'ef319a80-949a-492e-8ee0-424fb5fc20a6', promoId: 'ef319a80-949a-492e-8ee0-424fb5fc20a6', timing: 20000, // 20 seconds attempts: 20, }, 9: { name: 'Mud Racing', appToken: '8814a785-97fb-4177-9193-ca4180ff9da8', promoId: '8814a785-97fb-4177-9193-ca4180ff9da8', timing: 20000, // 20 seconds attempts: 20, }, 10: { name: 'Tile Trio', appToken: 'e68b39d2-4880-4a31-b3aa-0393e7df10c7', promoId: 'e68b39d2-4880-4a31-b3aa-0393e7df10c7', timing: 20000, // 20 seconds attempts: 20, }, 11: { name: 'Zoopolis', appToken: 'b2436c89-e0aa-4aed-8046-9b0515e1c46b', promoId: 'b2436c89-e0aa-4aed-8046-9b0515e1c46b', timing: 20000, // 20 seconds attempts: 20, }, 12: { name: 'Fluff Crusade', appToken: '112887b0-a8af-4eb2-ac63-d82df78283d9', promoId: '112887b0-a8af-4eb2-ac63-d82df78283d9', timing: 20000, // 20 seconds attempts: 30, }, 13: { name: 'Stone Age', appToken: '04ebd6de-69b7-43d1-9c4b-04a6ca3305af', promoId: '04ebd6de-69b7-43d1-9c4b-04a6ca3305af', timing: 20000, // 20 seconds attempts: 30, }, 14: { name: 'Bouncemasters', appToken: 'bc72d3b9-8e91-4884-9c33-f72482f0db37', promoId: 'bc72d3b9-8e91-4884-9c33-f72482f0db37', timing: 20000, // 20 seconds attempts: 30, }, 15: { name: 'Hide Ball', appToken: '4bf4966c-4d22-439b-8ff2-dc5ebca1a600', promoId: '4bf4966c-4d22-439b-8ff2-dc5ebca1a600', timing: 40000, // 30 seconds attempts: 30, }, 16: { name: 'Pin Out Master', appToken: 'd2378baf-d617-417a-9d99-d685824335f0', promoId: 'd2378baf-d617-417a-9d99-d685824335f0', timing: 20000, // 30 seconds attempts: 30, }, 17: { name: 'Count Masters', appToken: '4bdc17da-2601-449b-948e-f8c7bd376553', promoId: '4bdc17da-2601-449b-948e-f8c7bd376553', timing: 20000, // 30 seconds attempts: 30, }, 18: { name: 'Infected Frontier', appToken: 'eb518c4b-e448-4065-9d33-06f3039f0fcb', promoId: 'eb518c4b-e448-4065-9d33-06f3039f0fcb', timing: 20000, // 30 seconds attempts: 30, }, 19: { name: 'Among Water', appToken: 'daab8f83-8ea2-4ad0-8dd5-d33363129640', promoId: 'daab8f83-8ea2-4ad0-8dd5-d33363129640', timing: 20000, // 30 seconds attempts: 30, }, 20: { name: 'Factory World', appToken: 'd02fc404-8985-4305-87d8-32bd4e66bb16', promoId: 'd02fc404-8985-4305-87d8-32bd4e66bb16', timing: 20000, // 30 seconds attempts: 30, } }; let longestString = ""; let secondLongestString = ""; for (let i = 0; i < localStorage.length; i++) { const value = localStorage.getItem(localStorage.key(i)); if (value.length > longestString.length) { secondLongestString = longestString; longestString = value; } else if (value.length > secondLongestString.length && value !== longestString) { secondLongestString = value; } } const auth = longestString; function getRandomNumber(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } // Function to be executed when the first button is clicked // Create the buttons and input fields const buttonContainer = document.createElement("div"); buttonContainer.style.position = "fixed"; buttonContainer.style.top = "50%"; buttonContainer.style.right = "10px"; buttonContainer.style.transform = "translateY(-50%)"; buttonContainer.style.padding = "10px"; buttonContainer.style.zIndex = "9999"; buttonContainer.style.display = "flex"; buttonContainer.style.flexDirection = "column"; buttonContainer.style.alignItems = "center"; buttonContainer.style.gap = "10px"; const button1 = document.createElement("button"); button1.textContent = "Upgrade"; button1.addEventListener("click", buttonOneClicked); button1.style.borderRadius = "20px"; button1.style.padding = "6px 12px"; button1.style.backgroundColor = "red"; button1.style.border = "none"; button1.style.cursor = "pointer"; button1.style.opacity = "0.5"; const button2 = document.createElement("button"); button2.textContent = "autoKeys"; button2.addEventListener("click", buttonTwoClicked); button2.style.borderRadius = "20px"; button2.style.padding = "6px 12px"; button2.style.backgroundColor = "#f1f1f1"; button2.style.border = "none"; button2.style.cursor = "pointer"; button2.style.opacity = "0.5"; function buttonOneClicked() { if (statusUpgrades == false) { button1.style.backgroundColor = "green"; statusUpgrades = true autoUpgrades(); console.log("Upgrades started!"); } else { statusUpgrades = false button1.style.backgroundColor = "red"; console.log("Upgrades disabled!"); } // Add your function logic here } // Function to be executed when the second button is clicked function buttonTwoClicked() { keys(); // Add your function logic here console.log("Auto Keys started!"); } buttonContainer.appendChild(button1); buttonContainer.appendChild(button2); document.body.appendChild(buttonContainer); function autoUpgrades() { console.log(statusUpgrades); if (statusUpgrades == false) { console.log("return"); return; } console.log("next?"); let longestString = ""; for (let i = 0; i < localStorage.length; i++) { const value = localStorage.getItem(localStorage.key(i)); if (value.length > longestString.length) { longestString = value; } } const auth = longestString; fetch("https://api.hamsterkombat.io/interlude/upgrades-for-buy", { "headers": { "authorization": "Bearer "+auth, }, "method": "POST", }) .then(response => response.json()) .then(data => { console.log(data); const upgrades = data.upgradesForBuy; const ProfInHour = []; for (const up of upgrades) { //(up.isAvailable && !up.isExpired && up.cooldownSeconds == 0) if (up.isAvailable && !up.isExpired) { if (up.price !== 0 && up.profitPerHour !== 0) { const hours = up.price / (up.profitPerHour + up.profitPerHourDelta); ProfInHour.push({ section: up.section, id: up.id, name: up.name, hours: hours, price: up.price, profitPerHour: up.profitPerHour+up.profitPerHourDelta, cooldownSeconds: up.cooldownSeconds }); } } } const sorted = ProfInHour.sort((a, b) => a.hours - b.hours); //https://api.hamsterkombatgame.io/interlude/sync console.log("sync"); const response = fetch("https://api.hamsterkombatgame.io/interlude/sync", { "headers": { "authorization": "Bearer " + auth, "Content-Type": "application/json;charset=utf-8" }, "method": "POST", }) .then(response => response.json()) .then(data => { console.log("data"); console.log(data); console.log(data.interludeUser.balanceDiamonds); for (let i = 0; i < maxUpgrades; i++) { console.log(i); if (sorted[i].price < data.interludeUser.balanceDiamonds && (sorted[i].cooldownSeconds == 0 || sorted[i].cooldownSeconds == null)) { console.log("if yes"); console.log(sorted[i].id); const response = fetch("https://api.hamsterkombatgame.io/interlude/buy-upgrade", { "headers": { "authorization": "Bearer " + auth, "Content-Type": "application/json;charset=utf-8" }, "method": "POST", "body": JSON.stringify({ timestamp : Date.now(), upgradeId: sorted[i].id }) }) .then(response => { console.log(response); }) .catch(error => { console.error(error); }); console.log("time out : this is good"); setTimeout(autoUpgrades, getRandomNumber(3000, 3500)); break; } else if (sorted[i].price > data.interludeUser.balanceDiamonds) { if (i == maxUpgrades-1) { setTimeout(autoUpgrades, getRandomNumber(250000, 300000)); break; } continue; } // проверить // else if ((sorted[i].cooldownSeconds != 0 || sorted[i].cooldownSeconds != null) && sorted[i].price > data.interludeUser.balanceDiamonds) { // continue; // } else if (i == maxUpgrades-1 && (sorted[i].cooldownSeconds != 0 || sorted[i].cooldownSeconds != null)) { console.log("time out : i == 9 && sorted[i].cooldownSeconds != 0"); var newSort = sorted.slice(0, maxUpgrades); newSort.sort((a, b) => a.cooldownSeconds - b.cooldownSeconds); console.log(newSort); console.log("------------------"); console.log(newSort[0]); console.log(newSort[0].cooldownSeconds); setTimeout(autoUpgrades, newSort[0].cooldownSeconds*1000); break; } else if (sorted[i].cooldownSeconds != 0 || sorted[i].cooldownSeconds != null) { console.log("sorted[i].cooldownSeconds != 0"); continue; } } }) for (let i = 0; i < maxUpgrades; i++) { const priceString = sorted[i].price.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }); const profitString = sorted[i].profitPerHour.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 0 }); console.log( `seconds: ${sorted[i].cooldownSeconds} | name: ${sorted[i].name} | hours: ${Math.round(sorted[i].hours)} | price: ${priceString} | profitPerHour: ${profitString}` //`seconds: ${sorted[i].cooldownSeconds} | name: ${sorted[i].name}` ); } }) } function keys() { const response = fetch('https://api.hamsterkombatgame.io/interlude/get-promos', { method: 'POST', headers: { 'Authorization': `Bearer ${auth}`, } }).then(response => response.json()) .then(data => { console.log(data); const result = data.states.map(state => { const gameKey = Object.keys(games).find(key => games[key].promoId === state.promoId); return { gameNo: gameKey ? parseInt(gameKey) : 0, receiveKeysToday: state.receiveKeysToday }; }); for (const { gameNo, receiveKeysToday } of result) { autoKeys(gameNo, 4-receiveKeysToday); } }) //console.log(response.json()) } function autoKeys(gameChoice, keyCount) { //const EVENTS_DELAY = 20000; console.log('start'); console.log(gameChoice); console.log(keyCount); const game = games[gameChoice]; const generateClientId = () => { console.log("generateClientId"); const timestamp = Date.now(); const randomNumbers = Array.from({ length: 19 }, () => Math.floor(Math.random() * 10)).join(''); return `${timestamp}-${randomNumbers}`; }; const login = async (clientId, appToken) => { console.log("login"); const response = await fetch('https://api.gamepromo.io/promo/login-client', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ appToken, clientId, clientOrigin: 'deviceid' }) }); if (!response.ok) { throw new Error('Failed to login'); } const data = await response.json(); return data.clientToken; }; const emulateProgress = async (clientToken, promoId) => { console.log("emulateProgress"); const response = await fetch('https://api.gamepromo.io/promo/register-event', { method: 'POST', headers: { 'Authorization': `Bearer ${clientToken}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ promoId, eventId: generateUUID(), eventOrigin: 'undefined' }) }); if (!response.ok) { return false; } const data = await response.json(); return data.hasCode; }; const generateKey = async (clientToken, promoId) => { console.log("generateKey"); const response = await fetch('https://api.gamepromo.io/promo/create-code', { method: 'POST', headers: { 'Authorization': `Bearer ${clientToken}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ promoId }) }); if (!response.ok) { throw new Error('Failed to generate key'); } const data = await response.json(); console.log(data.promoCode); fetch("https://api.hamsterkombatgame.io/interlude/apply-promo", { "headers": { "authorization": "Bearer " + auth, "Content-Type": "application/json;charset=utf-8" }, "method": "POST", "body": JSON.stringify({ promoCode: data.promoCode }) }) .then(response => { // обработка ответа для каждого запроса console.log(response); }) .catch(error => { // обработка ошибок для каждого запроса console.error(error); }); return data.promoCode; }; const generateUUID = () => { console.log("generateUUID"); return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { const r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); }; const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); const delayRandom = () => Math.random() / 3 + 1; const generateKeyProcess = async () => { console.log("generateKeyProcess"); const clientId = generateClientId(); let clientToken; try { clientToken = await login(clientId, game.appToken); } catch (error) { alert(`Failed to login: ${error.message}`); return null; } for (let i = 0; i < game.attempts; i++) { await sleep(game.timing * delayRandom()); const hasCode = await emulateProgress(clientToken, game.promoId); if (hasCode) { break; } } try { const key = await generateKey(clientToken, game.promoId); return key; } catch (error) { alert(`Failed to generate key: ${error.message}`); return null; } }; const keys = Array.from({ length: keyCount }, generateKeyProcess); console.log(keys); } })();