Bot sender

Sends a bot that always feeds you!

目前为 2023-05-02 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Bot sender
  3. // @version 0.1
  4. // @description Sends a bot that always feeds you!
  5. // @author You
  6. // @match *://agario.miami/*
  7. // @match *://agar.cc/*
  8. // @icon https://www.google.com/s2/favicons?sz=64&domain=agario.miami
  9. // @run-at document-start
  10. // @grant none
  11. // @namespace https://gf.qytechs.cn/users/761829
  12. // @supportURL https://discord.gg/NMS3YR9Q5R
  13. // @homepage https://github.com/NuroC
  14. // ==/UserScript==
  15.  
  16. // cell
  17. class Cell {
  18. constructor(s, i, t, h, c, l) {
  19. this.id = s;
  20. this.x = i;
  21. this.y = t;
  22. this.size = h;
  23. this.color = c;
  24. this.name = l
  25. }
  26. }
  27.  
  28. let myPlayer = {
  29. x: null, // int
  30. y: null, // int
  31. };
  32.  
  33. let playerCells = [];
  34. let nodesOnScreen = [];
  35. let nodes = {};
  36.  
  37. let hooked = false;
  38. let detectedSocket;
  39. let hookSocket = WebSocket;
  40. let websocketQueue = [];
  41.  
  42. window.WebSocket = function (...args) {
  43. const newSocket = new hookSocket(...args);
  44.  
  45. if (!hooked) {
  46. hooked = true;
  47. detectedSocket = newSocket;
  48. setupDetection();
  49. } else {
  50. websocketQueue.push(newSocket);
  51. }
  52.  
  53. return newSocket;
  54. };
  55.  
  56. function setupDetection() {
  57. let detect = new Proxy(detectedSocket, {
  58. set() {
  59. const messageReference = detectedSocket.onmessage;
  60. const closeReference = detectedSocket.onclose;
  61.  
  62. detectedSocket.onmessage = function (event) {
  63. handleWsMessage(new DataView(event.data));
  64. messageReference.apply(this, arguments);
  65. };
  66.  
  67. detectedSocket.onclose = function () {
  68. console.log("close");
  69. closeReference.apply(this, arguments);
  70. };
  71.  
  72. detectedSocket.send = new Proxy(detectedSocket.send, {
  73. apply(target, thisArg, argumentsList) {
  74. return Reflect.apply(target, thisArg, argumentsList);
  75. },
  76. });
  77. },
  78. });
  79.  
  80. detect.change = 1;
  81. const interval = setInterval(() => {
  82. if (detectedSocket.readyState > 2) {
  83. if (websocketQueue.length > 0) {
  84. detectedSocket = websocketQueue.shift();
  85. setupDetection();
  86. } else {
  87. hooked = false;
  88. clearInterval(interval);
  89. }
  90. detect.change = 1;
  91. }
  92. }, 100);
  93. }
  94.  
  95.  
  96.  
  97. function prepareData(a) {
  98. return new DataView(new ArrayBuffer(a))
  99. }
  100.  
  101. function wsSend(ws, a) {
  102. ws.send(a.buffer)
  103. }
  104.  
  105. function onWsOpen(ws) {
  106. let msg;
  107.  
  108. msg = prepareData(5);
  109. msg.setUint8(0, 254);
  110. msg.setUint32(1,5 , true);
  111. wsSend(ws, msg)
  112. msg = prepareData(5);
  113. msg.setUint8(0, 255);
  114. msg.setUint32(1, 123456789, true);
  115. wsSend(ws, msg);
  116. setTimeout(() => {
  117. sendNickName(ws, "skid")
  118. }, 1000)
  119. }
  120.  
  121. function sendNickName(ws, name) {
  122. var msg = prepareData(1 + 2 * name.length);
  123. msg.setUint8(0, 192);
  124. for (var i = 0; i < name.length; ++i) msg.setUint16(1 + 2 * i, name.charCodeAt(i), true);
  125. wsSend(ws, msg);
  126. }
  127. let mouseX = 0;
  128. let mouseY = 0;
  129.  
  130. document.addEventListener("mousemove", event => {
  131. mouseX = event.x;
  132. mouseY = event.y
  133. })
  134.  
  135. function sendUint8(ws, a) {
  136. var msg = prepareData(1);
  137. msg.setUint8(0, a);
  138. wsSend(ws, msg)
  139. }
  140.  
  141. function connectBot() {
  142. let ws = new WebSocket(detectedSocket.url);
  143. ws.binaryType = 'arraybuffer';
  144.  
  145. ws.onopen = function() {
  146. onWsOpen(ws)
  147. }
  148.  
  149. ws.addEventListener("message", event => {
  150. let msg;
  151. // movement
  152. msg = prepareData(21);
  153. msg.setUint8(0, 16);
  154. msg.setFloat64(1, myPlayer.nodeX, true);
  155. msg.setFloat64(9, myPlayer.nodeY, true);
  156. msg.setUint32(17, 0, true);
  157. wsSend(ws, msg);
  158.  
  159. // splitting
  160. sendUint8(ws, 17)
  161.  
  162. // respawning
  163. sendNickName(ws, "skid")
  164. })
  165. }
  166.  
  167.  
  168. function handleWsMessage(msg) {
  169. let offset = 0;
  170.  
  171. if (msg.getUint8(offset) === 240) {
  172. offset += 5;
  173. }
  174.  
  175. let index = msg.getUint8(offset++);
  176.  
  177. switch (index) {
  178. case 16: // update nodes
  179. Object.assign(myPlayer, getNodeXY(msg, offset, nodesOnScreen, playerCells))
  180. break;
  181. case 20: // clear nodes
  182. playerCells = [];
  183. nodesOnScreen = [];
  184. break;
  185. case 32: // add node
  186. nodesOnScreen.push(msg.getUint32(offset, true));
  187. offset += 4;
  188. connectBot()
  189. break;
  190. }
  191. }
  192.  
  193. function getNodeXY(view, offset, ns, ps) {
  194. let nodeX, nodeY;
  195.  
  196. const queueLength = view.getUint16(offset, true);
  197. offset += 2;
  198. offset += queueLength * 8; // Skip unnecessary data
  199.  
  200. while (true) {
  201. const nodeid = view.getUint32(offset, true);
  202. offset += 4;
  203. if (nodeid === 0) break;
  204.  
  205. const posX = view.getInt16(offset, true);
  206. offset += 2;
  207. const posY = view.getInt16(offset, true);
  208. offset += 2;
  209. const size = view.getInt16(offset, true);
  210. offset += 2;
  211.  
  212. // Skip color data
  213. offset += 3;
  214.  
  215. const flags = view.getUint8(offset++);
  216. flags & 2 && (offset += 4);
  217. flags & 4 && (offset += 8);
  218. flags & 8 && (offset += 16);
  219.  
  220. // Skip name
  221. while (view.getUint16(offset, true) !== 0) {
  222. offset += 2;
  223. }
  224. offset += 2;
  225.  
  226. let node;
  227. if (nodes.hasOwnProperty(nodeid)) {
  228. node = nodes[nodeid];
  229. node.x = posX;
  230. node.y = posY;
  231. node.size = size;
  232. } else {
  233. node = new Cell(nodeid, posX, posY, size, null, null);
  234. nodes[nodeid] = node;
  235. }
  236.  
  237. if (-1 !== ns.indexOf(nodeid) && -1 === ps.indexOf(node)) {
  238. nodeX = posX;
  239. nodeY = posY;
  240. }
  241. }
  242.  
  243. return { nodeX, nodeY };
  244. }
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址