您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Мини клиент без интерфейса для игры hero-wars
// ==UserScript== // @name HWClient // @namespace HWClient // @version 2024-05-01 // @description Мини клиент без интерфейса для игры hero-wars // @author ZingerY // @match https://www.hero-wars.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=hero-wars.com // @grant none // @homepage https://zingery.ru/scripts/HWClient.user.js // ==/UserScript== (function() { class HWClient { headers = { "X-Request-Id": 1, "X-Auth-Token": '', "X-Auth-Session-Id": '', "X-Env-Unique-Session-Id": '', "X-Auth-Session-Key": '', "X-Env-Library-Version": 1, } constructor(login, password) { this.login = login; this.password = password; } getToken() { return decodeURIComponent(Object.fromEntries(document.cookie.split(';').map(e => e.split('=').map(n => n.trim())))['XSRF-TOKEN']); } getSesstionId() { return ('000000' + (~~(2147483647 * Math.random())).toString(36)).slice(-7) + ('000000' + (Math.floor(Date.now() / 1E3) & 2147483647).toString(36)).slice(-7); } async logout() { return await fetch('https://www.hero-wars.com/logout', { method: "POST", headers: { "Content-Type": "application/json; charset=UTF-8", "X-Xsrf-Token": this.getToken() }, body: '{}', }); } async auth() { const result = await fetch('https://www.hero-wars.com/login', { method: "POST", headers: { "Content-Type": "application/json; charset=UTF-8", "X-Xsrf-Token": this.getToken() }, body: JSON.stringify({ email: this.login, password: this.password, remember: 1 }), }); if (result.status == 204) { const mainPage = await fetch('https://www.hero-wars.com/').then(e => e.text()); const dom = new DOMParser().parseFromString(mainPage, 'text/html'); eval(dom.querySelector('script').innerText) this.headers["X-Auth-Token"] = NXFlashVars.auth_key; this.headers["X-Auth-Session-Id"] = this.getSesstionId(); this.headers["X-Env-Unique-Session-Id"] = NXAppInfo.visiting_uid; this.headers["X-Auth-Application-Id"] = NXPushDSettings.app_id; this.headers["X-Auth-Network-Ident"] = NXUserInfo.platform; this.headers["X-Auth-User-Id"] = NXUserInfo.platform_id; this.apiUrl = NXFlashVars.rpc_url; this.sessionId = NXAppInfo?.session_id || null; return true; } return false; } async send(body) { if (typeof body == 'string') { body = JSON.parse(body); } for (const call of body.calls) { if (!call?.context?.actionTs) { call.context = { actionTs: Math.floor(performance.now()) } } } body = JSON.stringify(body); const headers = { "Content-Type": "application/json; charset=UTF-8", ...this.headers } if (this.headers["X-Request-Id"] == 1) { headers["X-Auth-Session-Init"] = 1; } headers["X-Auth-Signature"] = getSignature(headers, body); const result = await fetch(this.apiUrl, { method: "POST", headers, body, }).then(e => e.json()) this.headers["X-Request-Id"]++; if (result.error) { return result.error; } return result.results; } async registration(giftId = null) { const body = { calls: [{ name: "registration", args: { user: { referrer: {} }, giftId }, context: { actionTs: Math.floor(performance.now()), cookie: this.sessionId }, ident: 'body' }] }; return await this.send(body); } async getUserInfo() { const result = await this.send({ calls: [{ name: "userGetInfo", args: {}, ident: "body" }] }); return result[0].result.response; } } this.HWClient = HWClient; /** * Собрать подарки на переданных аккаунтах * @param {*} keys [ { pass: 'pass1', login: 'login1' }, { pass: 'pass2', login: 'login3' }, { pass: 'pass4', login: 'login5' }, ] * @param {*} gifts [ 'a97a03998d590a957eb5627f0dd38b36', ] */ this.getGiftAllKeys = async function(keys = [], gifts = []) { for (const key of keys) { console.log(key.login) const client = new HWClient(key.login, key.pass); await client.logout(); if (await client.auth()) { //console.log(await client.getUserInfo()); for (const gift of gifts) { await client.registration(gift); } } else { console.error('Что-то пошло не так') } const delay = Math.random() * 5000; await new Promise((e) => setTimeout(e, delay)); } } })();