demo copy.html 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title></title>
  6. <script src="https://cdn.jsdelivr.net/gh/dcodeIO/[email protected]/dist/protobuf.js"></script>
  7. <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  8. <script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
  9. <script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.1.1/enc-utf8.min.js"></script>
  10. <script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.1.1/aes.min.js"></script>
  11. <script src="request.js"></script>
  12. <script type="text/javascript">
  13. // 参考:
  14. // https://protobufjs.github.io/protobuf.js/Root.html#lookupEnum
  15. // http://febeacon.com/protobuf_docs_zh_cn/routes/examples.html
  16. var debugLocal = true
  17. tokenList = ['8bc766ae05120ad091e8e52c29e23c1e']
  18. function arrayBufferToBase64(bytes) {
  19. var binary = '';
  20. var len = bytes.byteLength;
  21. for (var i = 0; i < len; i++) {
  22. binary += String.fromCharCode(bytes[i]);
  23. }
  24. return window.btoa(binary);
  25. }
  26. function hexStringToUint8Array(hexString) {
  27. if (hexString.length % 2 !== 0) {
  28. throw "Invalid hexString";
  29. }/*from w w w. j av a 2s . c o m*/
  30. var arrayBuffer = new Uint8Array(hexString.length / 2);
  31. for (var i = 0; i < hexString.length; i += 2) {
  32. var byteValue = parseInt(hexString.substr(i, 2), 16);
  33. if (isNaN(byteValue)) {
  34. throw "Invalid hexString";
  35. }
  36. arrayBuffer[i / 2] = byteValue;
  37. }
  38. return arrayBuffer;
  39. }
  40. var decrypt = function (key, iv, crypted) {
  41. key = CryptoJS.enc.Utf8.parse("sBWBAyOaGqkuEhCw"); //十六位十六进制数作为密钥
  42. iv = CryptoJS.enc.Utf8.parse('sBWBAyOaGqkuEhCw'); //十六位十六进制数作为密钥偏移量
  43. encrypted2 = arrayBufferToBase64(crypted)
  44. var decrypted = CryptoJS.AES.decrypt(encrypted2, key, {
  45. iv: iv,
  46. mode: CryptoJS.mode.CBC,
  47. padding: CryptoJS.pad.Pkcs7
  48. });
  49. var originalText = decrypted.toString();
  50. originalText = hexStringToUint8Array(originalText)
  51. console.log("originalText", originalText)
  52. return originalText
  53. };
  54. var proto = {
  55. Connect: null,
  56. Disconnect: null,
  57. Ping: null,
  58. LogList: null,
  59. StatusChange: null,
  60. }
  61. protobuf.load("game.proto", function (err, root) {
  62. if (err)
  63. throw err;
  64. proto.Connect = root.lookupType("proto.Connect");
  65. proto.Disconnect = root.lookupType("proto.Disconnect");
  66. proto.Ping = root.lookupType("proto.Ping");
  67. proto.LogList = root.lookupType("proto.LogList");
  68. proto.StatusChange = root.lookupType("proto.StatusChange");
  69. proto.NotifyTypeEnum = root.lookupEnum("proto.NotifyTypeEnum");
  70. console.log(proto)
  71. for (var i = 0; i < tokenList.length; i++) {
  72. WebSocketTest(tokenList[i])
  73. }
  74. })
  75. function WebSocketTest(token) {
  76. if ("WebSocket" in window) {
  77. // 打开一个 web socket
  78. var ws
  79. if (debugLocal) {
  80. ws = new WebSocket("ws://localhost:18879/connect");
  81. }else{
  82. ws = new WebSocket("ws://47.57.242.154:18880/connect");
  83. }
  84. ws.onmessage = async function (evt) {
  85. var received_msg = evt.data;
  86. console.log(received_msg)
  87. var buffer = await received_msg.arrayBuffer()
  88. console.log("buffer:", buffer)
  89. var array = new Uint8Array(buffer);
  90. var arrayLen = array.length;
  91. var dataType = array[0]
  92. var eventType = array[1]
  93. var data = array.subarray(2)
  94. if (dataType != 0) {
  95. console.log("TODO:需要处理压缩和解密====")
  96. data = decrypt("sBWBAyOaGqkuEhCw", "sBWBAyOaGqkuEhCw", array.subarray(1))
  97. eventType = data[0]
  98. data = data.subarray(1)
  99. console.log("data==>", data)
  100. }
  101. console.log("data type:", dataType)
  102. console.log("event type:", eventType)
  103. console.log("data:", data, " len:", data.length)
  104. var decodedMessage = null;
  105. try {
  106. switch (eventType) {
  107. case proto.NotifyTypeEnum.values['NotifyTypeStatusChange']:
  108. decodedMessage = proto.StatusChange.decode(data);
  109. break;
  110. case proto.NotifyTypeEnum.values['NotifyTypeConnect']:
  111. decodedMessage = proto.Connect.decode(data);
  112. break;
  113. case proto.NotifyTypeEnum.values['NotifyTypePing']:
  114. decodedMessage = proto.Ping.decode(data);
  115. break;
  116. case proto.NotifyTypeEnum.values['NotifyTypeChangeLog']:
  117. decodedMessage = proto.LogList.decode(data);
  118. break;
  119. case proto.NotifyTypeEnum.values['NotifyTypeDisconnect']:
  120. decodedMessage = proto.Disconnect.decode(data);
  121. break;
  122. default:
  123. throw ("没找到类型")
  124. }
  125. } catch (e) {
  126. console.log("err:", e)
  127. return
  128. }
  129. console.log("decode msg", Date().toLocaleString(), "==>", decodedMessage)
  130. };
  131. ws.onopen = function () {
  132. // Web Socket 已连接上,使用 send() 方法发送数据
  133. let msg = { "type": "connect", "once": 123, "token": token }
  134. ws.send(JSON.stringify(msg));
  135. sendPing()
  136. randBet()
  137. };
  138. ws.onclose = function () {
  139. // 关闭 websocket
  140. console.log("连接已关闭...");
  141. };
  142. function sendPing() {
  143. setInterval(() => {
  144. let msg = { "type": "ping" }
  145. ws.send(JSON.stringify(msg));
  146. }, 5000)
  147. }
  148. function randBet() {
  149. let reqUrl = "http://localhost:18879/api/perform?debug_auth=ucqrjnhiyHfuUrmR"
  150. if (debugLocal) {
  151. reqUrl = "http://localhost:18879/api/perform?debug_auth=ucqrjnhiyHfuUrmR"
  152. }
  153. setInterval(() => {
  154. // if (Math.ceil(Math.random() * 100) % 3 != 0) {
  155. // return
  156. // }
  157. let now = new Date();
  158. let hour = now.getHours(); // 获取当前小时数(0-23)
  159. let minutes = now.getMinutes(); // 获取当前分钟数(0-59)
  160. let second = now.getSeconds()
  161. if (second > 45)
  162. return
  163. let month = now.getMonth() + 1
  164. if (month < 10)
  165. month = "0" + month
  166. let day = now.getDate()
  167. if (day < 10)
  168. day = "0" + day
  169. let num = (hour * 60 + minutes + 60 + 1)
  170. if (num < 10) num = "000" + num
  171. else if (num < 100) num = "00" + num
  172. else if (num < 1000) num = "0" + num
  173. let issue = now.getFullYear() + "-" + month + "-" + day + " " + num
  174. let msg = {
  175. "version": "1.0.0",
  176. "name": "bet",
  177. "body": "{\"issue\":\"" + issue + "\",\"play_type\":\"牛牛\",\"pos\":\"房1\",\"number\":\"红胜\",\"amount\":1}",
  178. "once": "1234",
  179. "token": token,
  180. }
  181. console.log("bet:", msg)
  182. axios.post(reqUrl, msg)
  183. }, 2 * 1000)
  184. }
  185. }
  186. }
  187. </script>
  188. </head>
  189. <body>
  190. <div id="sse">
  191. <a href="javascript:WebSocketTest()">运行 WebSocket</a>
  192. </div>
  193. </body>
  194. </html>