├── Proxy Version ├── layernet.js ├── proxy.txt └── tokens.txt ├── README.md ├── layernet.js └── tokens.txt /Proxy Version/layernet.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const WebSocket = require('ws'); 3 | const crypto = require('crypto'); 4 | const readline = require('readline'); 5 | const { HttpsProxyAgent } = require('https-proxy-agent'); // Updated import 6 | 7 | const uri = 'wss://tongame-service-roy7ocqnoq-ew.a.run.app/socket.io/?EIO=4&transport=websocket'; 8 | const options = (accessToken, proxy) => { 9 | const proxyUrl = `http://${proxy.trim()}`; 10 | const agent = new HttpsProxyAgent(proxyUrl); 11 | console.log(`Using proxy: ${proxyUrl}`); // Log the proxy being used 12 | return { 13 | headers: { 14 | 'Authorization': `Bearer ${accessToken}`, 15 | 'Origin': 'https://netcoin.layernet.ai', 16 | 'User-Agent': 'Mozilla/5.0 (Linux; Android 13; M2012K11AG Build/TKQ1.220829.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.6478.134 Mobile Safari/537.36', 17 | 'Sec-WebSocket-Key': crypto.randomBytes(16).toString('base64'), 18 | 'Sec-WebSocket-Version': '13' 19 | }, 20 | agent: agent 21 | }; 22 | }; 23 | 24 | const logLines = {}; 25 | let proxies = []; 26 | 27 | // Load proxies from file 28 | fs.readFile('proxy.txt', 'utf8', (err, data) => { 29 | if (err) { 30 | console.error('Failed to read proxy file:', err); 31 | return; 32 | } 33 | proxies = data.split('\n').filter(proxy => proxy.trim().length > 0); 34 | }); 35 | 36 | function getRandomColor() { 37 | const colors = [ 38 | '\x1b[31m', // Red 39 | '\x1b[32m', // Green 40 | '\x1b[33m', // Yellow 41 | '\x1b[34m', // Blue 42 | '\x1b[35m', // Magenta 43 | '\x1b[36m', // Cyan 44 | ]; 45 | return colors[Math.floor(Math.random() * colors.length)]; 46 | } 47 | 48 | function logMessage(accountNumber, message) { 49 | const durabilityColor = getRandomColor(); 50 | const goldColor = getRandomColor(); 51 | const progressColor = getRandomColor(); 52 | const rankColor = getRandomColor(); 53 | const perHourColor = getRandomColor(); 54 | const dogsColor = getRandomColor(); // New color for Dogs 55 | const resetColor = '\x1b[0m'; 56 | 57 | message = message.replace(/Durability: (\d+)/, `${durabilityColor}Durability: $1${resetColor}`); 58 | message = message.replace(/Gold: (\d+)/, `${goldColor}Gold: $1${resetColor}`); 59 | message = message.replace(/Progress: ([\d.]+)/, `${progressColor}Progress: $1${resetColor}`); 60 | message = message.replace(/Rank: ([\w]+)/, `${rankColor}Rank: $1${resetColor}`); // Updated regex for Rank 61 | message = message.replace(/Per Hour: ([\d.]+)/, `${perHourColor}Per Hour: $1${resetColor}`); 62 | message = message.replace(/Dogs: (\d+)/, `${dogsColor}Dogs: $1${resetColor}`); // New regex for Dogs 63 | 64 | logLines[accountNumber] = message; 65 | updateConsole(); 66 | } 67 | 68 | function updateConsole() { 69 | readline.cursorTo(process.stdout, 0, 0); 70 | readline.clearScreenDown(process.stdout); 71 | Object.keys(logLines).forEach(accountNumber => { 72 | console.log(logLines[accountNumber]); 73 | }); 74 | } 75 | 76 | fs.readFile('tokens.txt', 'utf8', async (err, data) => { 77 | if (err) { 78 | console.error('Failed to read tokens file:', err); 79 | return; 80 | } 81 | 82 | const tokens = data.split('\n').filter(token => token.trim().length > 0); 83 | 84 | await Promise.all(tokens.map((token, index) => 85 | new Promise((resolve) => { 86 | setTimeout(() => { 87 | connect(token.trim(), index + 1, resolve); // Pass the resolve function to connect 88 | }, index * 5000); // Delay of 5 seconds between each connection 89 | }) 90 | )); 91 | 92 | logMessage('All accounts connected.'); 93 | }); 94 | 95 | async function connect(accessToken, accountNumber, resolve) { 96 | let ws; 97 | let reconnectAttempts = 0; 98 | const maxReconnectAttempts = 5; 99 | 100 | let eventTypeNumber = 0; 101 | let totalCoinsEarned = 0; 102 | let currentRound = 5; 103 | let gameStarted = false; 104 | let homeDataSent = false; 105 | let isSendingMessage = false; 106 | let shouldSendInGameMessages = true; 107 | 108 | // Object to store user rank data 109 | const userRankData = {}; 110 | const proxy = proxies[Math.floor(Math.random() * proxies.length)]; 111 | const proxyHost = proxy.trim().replace(/^http:\/\//, ''); // Remove http prefix and trim any whitespace 112 | console.log(`Connecting with proxy: ${proxyHost}`); // Log the selected proxy 113 | 114 | function attachWebSocketHandlers() { 115 | ws.on('open', function open() { 116 | logMessage(accountNumber, `Account #${accountNumber} | WebSocket connection opened for token: ${accessToken} | Proxy: ${proxyHost}`); 117 | reconnectAttempts = 0; 118 | ws.send('40{"token": "Bearer ' + accessToken + '"}'); 119 | }); 120 | 121 | ws.on('message', function incoming(data) { 122 | const message = data.toString(); 123 | const typeMatch = message.match(/^(\d+)/); 124 | if (typeMatch) { 125 | const type = typeMatch[1]; 126 | const content = message.substring(type.length); 127 | try { 128 | if (content.startsWith('[') || content.startsWith('{')) { 129 | const json = JSON.parse(content); 130 | if (Array.isArray(json) && json.length > 0) { 131 | const data = json[0]; 132 | if (data.userRank) { 133 | // Store user rank data 134 | userRankData.rank = data.userRank.role; 135 | userRankData.profitPerHour = data.userRank.profitPerHour; 136 | userRankData.gold = data.gold; 137 | userRankData.dogs = data.dogs; 138 | 139 | logMessage(accountNumber, `Account #${accountNumber} | Rank: ${userRankData.rank} | Per Hour: ${userRankData.profitPerHour} | Gold: ${(userRankData.gold / 1000).toFixed(3)} | Dogs: ${userRankData.dogs}`); 140 | } 141 | if (!gameStarted) { 142 | logMessage(accountNumber, `Account #${accountNumber} | Starting game...`); 143 | startGame(); 144 | gameStarted = true; 145 | } 146 | } 147 | if (json[0] && json[0].duration) { 148 | const gameData = json[0]; 149 | logMessage(accountNumber, `Account #${accountNumber} | Proxy: ${proxyHost} | Durability: ${gameData.durability} | Gold: ${gameData.gold} | Rank: ${userRankData.rank} | Per Hour: ${userRankData.profitPerHour} | Dogs: ${userRankData.dogs}`); 150 | 151 | if (gameData.durability === 0 && gameData.gameover) { 152 | logMessage(accountNumber, `Account #${accountNumber} | Game Selesai | Coin: ${gameData.gold}`); 153 | totalCoinsEarned += gameData.gold; 154 | currentRound = 5; 155 | eventTypeNumber = 0; 156 | gameStarted = false; 157 | startGame(); 158 | } else if (gameData.durability >= 0) { 159 | sendInGameMessage(gameData); 160 | } 161 | } 162 | } else { 163 | logMessage(accountNumber, `Account #${accountNumber} | Non-JSON Message Content: ${content}`); 164 | } 165 | } catch (err) { 166 | logMessage(accountNumber, `Account #${accountNumber} | Failed to parse JSON: ${err}`); 167 | } 168 | } else { 169 | logMessage(accountNumber, `Account #${accountNumber} | Failed to extract type from message: ${message}`); 170 | } 171 | 172 | if (message.includes('40') && !homeDataSent) { 173 | sendHomeData(); 174 | homeDataSent = true; 175 | } 176 | }); 177 | 178 | ws.on('error', function error(err) { 179 | logMessage(accountNumber, `Account #${accountNumber} | WebSocket error for token: ${accessToken} ${err}`); 180 | }); 181 | 182 | ws.on('close', function close(code, reason) { 183 | logMessage(accountNumber, `Account #${accountNumber} | WebSocket connection closed for token: ${accessToken}`); 184 | logMessage(accountNumber, 'Close code: ' + code); 185 | logMessage(accountNumber, 'Close reason: ' + (reason ? reason.toString() : 'No reason provided')); 186 | shouldSendInGameMessages = false; 187 | if (reconnectAttempts < maxReconnectAttempts) { 188 | reconnectAttempts++; 189 | setTimeout(reconnect, 5000); 190 | } else { 191 | logMessage(accountNumber, 'Max reconnect attempts reached. Giving up.'); 192 | resolve(); // Resolve the promise when max reconnect attempts are reached 193 | } 194 | }); 195 | } 196 | 197 | function reconnect() { 198 | logMessage(accountNumber, 'Attempting to reconnect...'); 199 | connect(accessToken, accountNumber, resolve); 200 | } 201 | 202 | function sendHomeData() { 203 | ws.send(`42${eventTypeNumber}["homeData"]`); 204 | eventTypeNumber++; 205 | } 206 | 207 | function startGame() { 208 | if (!gameStarted) { 209 | logMessage(accountNumber, `Account #${accountNumber} | Sending startGame message...`); 210 | ws.send(`42${eventTypeNumber}["startGame"]`); 211 | eventTypeNumber++; 212 | gameStarted = true; 213 | } else { 214 | logMessage(accountNumber, `Account #${accountNumber} | Game already started, not sending startGame message.`); 215 | } 216 | } 217 | 218 | function sendInGameMessage(gameData) { 219 | if (isSendingMessage || !shouldSendInGameMessages) return; 220 | 221 | isSendingMessage = true; 222 | 223 | const timestamp = Date.now(); 224 | const message = `42${eventTypeNumber}["inGame",{"round":${currentRound},"time":${timestamp},"gameover":false}]`; 225 | // logMessage(accountNumber, `Account #${accountNumber} | Sending in-game message: ${message}`); 226 | ws.send(message); 227 | eventTypeNumber++; 228 | 229 | if (!gameData.gameover && gameData.durability > 0) { 230 | setTimeout(() => { 231 | isSendingMessage = false; 232 | sendInGameMessage(gameData); 233 | }, 500); 234 | } else { 235 | isSendingMessage = false; 236 | } 237 | } 238 | 239 | ws = new WebSocket(uri, options(accessToken, proxyHost)); // Use proxyHost in options 240 | 241 | attachWebSocketHandlers(); 242 | } -------------------------------------------------------------------------------- /Proxy Version/proxy.txt: -------------------------------------------------------------------------------- 1 | ip:port -------------------------------------------------------------------------------- /Proxy Version/tokens.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sirkel-testnet/netcoin_layernet/1fcb7bffc5af99f00da4a5dec264dfab4f804fa3/Proxy Version/tokens.txt -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Netcoin Layernet 3 | Netcoin Layernet BOT 4 | 5 | Register Here : [Netcoin](https://t.me/layernet_netcoin_bot?start=968480911) 6 | 7 | 8 | ## Features 9 | 10 | - Auto Start Game 11 | - Auto Battle 12 | - Bypass Round 13 | - Multi Account 14 | - Multi Thread 15 | 16 | ## Installation 17 | 18 | Install with python 19 | 20 | 1. Download Node JS 21 | 2. Install Module (npm install fs ws crypto) 22 | 3. Buka Bot Netcoin di PC (Override) 23 | 4. Jika sudah terbuka > Klik kanan Inspect 24 | 5. Di network > cari network apa aja 25 | 6. Cek Request Headers > Authorization Bearer xxx 26 | 7. Ambil token tanpa bearer Paste di tokens.txt 27 | 8. node layernet.js 28 | -------------------------------------------------------------------------------- /layernet.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const WebSocket = require('ws'); 3 | const crypto = require('crypto'); 4 | const readline = require('readline'); 5 | 6 | const uri = 'wss://tongame-service-roy7ocqnoq-ew.a.run.app/socket.io/?EIO=4&transport=websocket'; 7 | const options = (accessToken) => ({ 8 | headers: { 9 | 'Authorization': `Bearer ${accessToken}`, 10 | 'Origin': 'https://netcoin.layernet.ai', 11 | 'User-Agent': 'Mozilla/5.0 (Linux; Android 13; M2012K11AG Build/TKQ1.220829.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.6478.134 Mobile Safari/537.36', 12 | 'Sec-WebSocket-Key': crypto.randomBytes(16).toString('base64'), 13 | 'Sec-WebSocket-Version': '13' 14 | } 15 | }); 16 | 17 | const logLines = {}; 18 | 19 | function getRandomColor() { 20 | const colors = [ 21 | '\x1b[31m', // Red 22 | '\x1b[32m', // Green 23 | '\x1b[33m', // Yellow 24 | '\x1b[34m', // Blue 25 | '\x1b[35m', // Magenta 26 | '\x1b[36m', // Cyan 27 | ]; 28 | return colors[Math.floor(Math.random() * colors.length)]; 29 | } 30 | 31 | function logMessage(accountNumber, message) { 32 | const durabilityColor = getRandomColor(); 33 | const goldColor = getRandomColor(); 34 | const progressColor = getRandomColor(); 35 | const rankColor = getRandomColor(); 36 | const perHourColor = getRandomColor(); 37 | const dogsColor = getRandomColor(); // New color for Dogs 38 | const resetColor = '\x1b[0m'; 39 | 40 | message = message.replace(/Durability: (\d+)/, `${durabilityColor}Durability: $1${resetColor}`); 41 | message = message.replace(/Gold: (\d+)/, `${goldColor}Gold: $1${resetColor}`); 42 | message = message.replace(/Progress: ([\d.]+)/, `${progressColor}Progress: $1${resetColor}`); 43 | message = message.replace(/Rank: ([\w]+)/, `${rankColor}Rank: $1${resetColor}`); // Updated regex for Rank 44 | message = message.replace(/Per Hour: ([\d.]+)/, `${perHourColor}Per Hour: $1${resetColor}`); 45 | message = message.replace(/Dogs: (\d+)/, `${dogsColor}Dogs: $1${resetColor}`); // New regex for Dogs 46 | 47 | logLines[accountNumber] = message; 48 | updateConsole(); 49 | } 50 | 51 | function updateConsole() { 52 | readline.cursorTo(process.stdout, 0, 0); 53 | readline.clearScreenDown(process.stdout); 54 | Object.keys(logLines).forEach(accountNumber => { 55 | console.log(logLines[accountNumber]); 56 | }); 57 | } 58 | 59 | fs.readFile('tokens.txt', 'utf8', async (err, data) => { 60 | if (err) { 61 | console.error('Failed to read tokens file:', err); 62 | return; 63 | } 64 | 65 | const tokens = data.split('\n').filter(token => token.trim().length > 0); 66 | 67 | await Promise.all(tokens.map((token, index) => 68 | new Promise((resolve) => { 69 | setTimeout(() => { 70 | connect(token.trim(), index + 1, resolve); // Pass the resolve function to connect 71 | }, index * 5000); // Delay of 5 seconds between each connection 72 | }) 73 | )); 74 | 75 | logMessage('All accounts connected.'); 76 | }); 77 | 78 | async function connect(accessToken, accountNumber, resolve) { 79 | let ws; 80 | let reconnectAttempts = 0; 81 | const maxReconnectAttempts = 5; 82 | 83 | let eventTypeNumber = 0; 84 | let totalCoinsEarned = 0; 85 | let currentRound = 5; 86 | let gameStarted = false; 87 | let homeDataSent = false; 88 | let isSendingMessage = false; 89 | let shouldSendInGameMessages = true; 90 | 91 | // Object to store user rank data 92 | const userRankData = {}; 93 | 94 | function attachWebSocketHandlers() { 95 | ws.on('open', function open() { 96 | logMessage(accountNumber, `Account #${accountNumber} | WebSocket connection opened for token: ${accessToken}`); 97 | reconnectAttempts = 0; 98 | ws.send('40{"token": "Bearer ' + accessToken + '"}'); 99 | }); 100 | 101 | ws.on('message', function incoming(data) { 102 | const message = data.toString(); 103 | const typeMatch = message.match(/^(\d+)/); 104 | if (typeMatch) { 105 | const type = typeMatch[1]; 106 | const content = message.substring(type.length); 107 | try { 108 | if (content.startsWith('[') || content.startsWith('{')) { 109 | const json = JSON.parse(content); 110 | if (Array.isArray(json) && json.length > 0) { 111 | const data = json[0]; 112 | if (data.userRank) { 113 | // Store user rank data 114 | userRankData.rank = data.userRank.role; 115 | userRankData.profitPerHour = data.userRank.profitPerHour; 116 | userRankData.gold = data.gold; 117 | userRankData.dogs = data.dogs; 118 | 119 | logMessage(accountNumber, `Account #${accountNumber} | Rank: ${userRankData.rank} | Per Hour: ${userRankData.profitPerHour} | Gold: ${(userRankData.gold / 1000).toFixed(3)} | Dogs: ${userRankData.dogs}`); 120 | } 121 | if (!gameStarted) { 122 | logMessage(accountNumber, `Account #${accountNumber} | Starting game...`); 123 | startGame(); 124 | gameStarted = true; 125 | } 126 | } 127 | if (json[0] && json[0].duration) { 128 | const gameData = json[0]; 129 | logMessage(accountNumber, `Account #${accountNumber} | Durability: ${gameData.durability} | Gold: ${gameData.gold} | Rank: ${userRankData.rank} | Per Hour: ${userRankData.profitPerHour} | Dogs: ${userRankData.dogs}`); 130 | 131 | if (gameData.durability === 0 && gameData.gameover) { 132 | logMessage(accountNumber, `Account #${accountNumber} | Game Selesai | Coin: ${gameData.gold}`); 133 | totalCoinsEarned += gameData.gold; 134 | currentRound = 5; 135 | eventTypeNumber = 0; 136 | gameStarted = false; 137 | startGame(); 138 | } else if (gameData.durability >= 0) { 139 | sendInGameMessage(gameData); 140 | } 141 | } 142 | } else { 143 | logMessage(accountNumber, `Account #${accountNumber} | Non-JSON Message Content: ${content}`); 144 | } 145 | } catch (err) { 146 | logMessage(accountNumber, `Account #${accountNumber} | Failed to parse JSON: ${err}`); 147 | } 148 | } else { 149 | logMessage(accountNumber, `Account #${accountNumber} | Failed to extract type from message: ${message}`); 150 | } 151 | 152 | if (message.includes('40') && !homeDataSent) { 153 | sendHomeData(); 154 | homeDataSent = true; 155 | } 156 | }); 157 | 158 | ws.on('error', function error(err) { 159 | logMessage(accountNumber, `Account #${accountNumber} | WebSocket error for token: ${accessToken} ${err}`); 160 | }); 161 | 162 | ws.on('close', function close(code, reason) { 163 | logMessage(accountNumber, `Account #${accountNumber} | WebSocket connection closed for token: ${accessToken}`); 164 | logMessage(accountNumber, 'Close code: ' + code); 165 | logMessage(accountNumber, 'Close reason: ' + (reason ? reason.toString() : 'No reason provided')); 166 | shouldSendInGameMessages = false; 167 | if (reconnectAttempts < maxReconnectAttempts) { 168 | reconnectAttempts++; 169 | setTimeout(reconnect, 5000); 170 | } else { 171 | logMessage(accountNumber, 'Max reconnect attempts reached. Giving up.'); 172 | resolve(); // Resolve the promise when max reconnect attempts are reached 173 | } 174 | }); 175 | } 176 | 177 | function reconnect() { 178 | logMessage(accountNumber, 'Attempting to reconnect...'); 179 | connect(accessToken, accountNumber, resolve); 180 | } 181 | 182 | function sendHomeData() { 183 | ws.send(`42${eventTypeNumber}["homeData"]`); 184 | eventTypeNumber++; 185 | } 186 | 187 | function startGame() { 188 | if (!gameStarted) { 189 | logMessage(accountNumber, `Account #${accountNumber} | Sending startGame message...`); 190 | ws.send(`42${eventTypeNumber}["startGame"]`); 191 | eventTypeNumber++; 192 | gameStarted = true; 193 | } else { 194 | logMessage(accountNumber, `Account #${accountNumber} | Game already started, not sending startGame message.`); 195 | } 196 | } 197 | 198 | function sendInGameMessage(gameData) { 199 | if (isSendingMessage || !shouldSendInGameMessages) return; 200 | 201 | isSendingMessage = true; 202 | 203 | const timestamp = Date.now(); 204 | const message = `42${eventTypeNumber}["inGame",{"round":${currentRound},"time":${timestamp},"gameover":false}]`; 205 | // logMessage(accountNumber, `Account #${accountNumber} | Sending in-game message: ${message}`); 206 | ws.send(message); 207 | eventTypeNumber++; 208 | 209 | if (!gameData.gameover && gameData.durability > 0) { 210 | setTimeout(() => { 211 | isSendingMessage = false; 212 | sendInGameMessage(gameData); 213 | }, 500); 214 | } else { 215 | isSendingMessage = false; 216 | } 217 | } 218 | 219 | ws = new WebSocket(uri, options(accessToken)); 220 | attachWebSocketHandlers(); 221 | } -------------------------------------------------------------------------------- /tokens.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sirkel-testnet/netcoin_layernet/1fcb7bffc5af99f00da4a5dec264dfab4f804fa3/tokens.txt --------------------------------------------------------------------------------