123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- <!DOCTYPE HTML>
- <html>
- <head>
- <meta charset="utf-8">
- <title></title>
- <script src="https://cdn.jsdelivr.net/gh/dcodeIO/[email protected]/dist/protobuf.js"></script>
- <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
- <script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
- <script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.1.1/enc-utf8.min.js"></script>
- <script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.1.1/aes.min.js"></script>
- <script src="request.js"></script>
- <script type="text/javascript">
- // 参考:
- // https://protobufjs.github.io/protobuf.js/Root.html#lookupEnum
- // http://febeacon.com/protobuf_docs_zh_cn/routes/examples.html
- var debugLocal = true
- tokenList = ['8bc766ae05120ad091e8e52c29e23c1e']
- function arrayBufferToBase64(bytes) {
- var binary = '';
- var len = bytes.byteLength;
- for (var i = 0; i < len; i++) {
- binary += String.fromCharCode(bytes[i]);
- }
- return window.btoa(binary);
- }
- function hexStringToUint8Array(hexString) {
- if (hexString.length % 2 !== 0) {
- throw "Invalid hexString";
- }/*from w w w. j av a 2s . c o m*/
- var arrayBuffer = new Uint8Array(hexString.length / 2);
- for (var i = 0; i < hexString.length; i += 2) {
- var byteValue = parseInt(hexString.substr(i, 2), 16);
- if (isNaN(byteValue)) {
- throw "Invalid hexString";
- }
- arrayBuffer[i / 2] = byteValue;
- }
- return arrayBuffer;
- }
- var decrypt = function (key, iv, crypted) {
- key = CryptoJS.enc.Utf8.parse("sBWBAyOaGqkuEhCw"); //十六位十六进制数作为密钥
- iv = CryptoJS.enc.Utf8.parse('sBWBAyOaGqkuEhCw'); //十六位十六进制数作为密钥偏移量
- encrypted2 = arrayBufferToBase64(crypted)
- var decrypted = CryptoJS.AES.decrypt(encrypted2, key, {
- iv: iv,
- mode: CryptoJS.mode.CBC,
- padding: CryptoJS.pad.Pkcs7
- });
- var originalText = decrypted.toString();
- originalText = hexStringToUint8Array(originalText)
- console.log("originalText", originalText)
- return originalText
- };
- var proto = {
- Connect: null,
- Disconnect: null,
- Ping: null,
- LogList: null,
- StatusChange: null,
- }
- protobuf.load("game.proto", function (err, root) {
- if (err)
- throw err;
- proto.Connect = root.lookupType("proto.Connect");
- proto.Disconnect = root.lookupType("proto.Disconnect");
- proto.Ping = root.lookupType("proto.Ping");
- proto.LogList = root.lookupType("proto.LogList");
- proto.StatusChange = root.lookupType("proto.StatusChange");
- proto.NotifyTypeEnum = root.lookupEnum("proto.NotifyTypeEnum");
- console.log(proto)
- for (var i = 0; i < tokenList.length; i++) {
- WebSocketTest(tokenList[i])
- }
- })
- function WebSocketTest(token) {
- if ("WebSocket" in window) {
- // 打开一个 web socket
- var ws
- if (debugLocal) {
- ws = new WebSocket("ws://localhost:18879/connect");
- }else{
- ws = new WebSocket("ws://47.57.242.154:18880/connect");
- }
- ws.onmessage = async function (evt) {
- var received_msg = evt.data;
- console.log(received_msg)
- var buffer = await received_msg.arrayBuffer()
- console.log("buffer:", buffer)
- var array = new Uint8Array(buffer);
- var arrayLen = array.length;
- var dataType = array[0]
- var eventType = array[1]
- var data = array.subarray(2)
- if (dataType != 0) {
- console.log("TODO:需要处理压缩和解密====")
- data = decrypt("sBWBAyOaGqkuEhCw", "sBWBAyOaGqkuEhCw", array.subarray(1))
- eventType = data[0]
- data = data.subarray(1)
- console.log("data==>", data)
- }
- console.log("data type:", dataType)
- console.log("event type:", eventType)
- console.log("data:", data, " len:", data.length)
- var decodedMessage = null;
- try {
- switch (eventType) {
- case proto.NotifyTypeEnum.values['NotifyTypeStatusChange']:
- decodedMessage = proto.StatusChange.decode(data);
- break;
- case proto.NotifyTypeEnum.values['NotifyTypeConnect']:
- decodedMessage = proto.Connect.decode(data);
- break;
- case proto.NotifyTypeEnum.values['NotifyTypePing']:
- decodedMessage = proto.Ping.decode(data);
- break;
- case proto.NotifyTypeEnum.values['NotifyTypeChangeLog']:
- decodedMessage = proto.LogList.decode(data);
- break;
- case proto.NotifyTypeEnum.values['NotifyTypeDisconnect']:
- decodedMessage = proto.Disconnect.decode(data);
- break;
- default:
- throw ("没找到类型")
- }
- } catch (e) {
- console.log("err:", e)
- return
- }
- console.log("decode msg", Date().toLocaleString(), "==>", decodedMessage)
- };
- ws.onopen = function () {
- // Web Socket 已连接上,使用 send() 方法发送数据
- let msg = { "type": "connect", "once": 123, "token": token }
- ws.send(JSON.stringify(msg));
- sendPing()
- randBet()
- };
- ws.onclose = function () {
- // 关闭 websocket
- console.log("连接已关闭...");
- };
- function sendPing() {
- setInterval(() => {
- let msg = { "type": "ping" }
- ws.send(JSON.stringify(msg));
- }, 5000)
- }
- function randBet() {
- let reqUrl = "http://localhost:18879/api/perform?debug_auth=ucqrjnhiyHfuUrmR"
- if (debugLocal) {
- reqUrl = "http://localhost:18879/api/perform?debug_auth=ucqrjnhiyHfuUrmR"
- }
- setInterval(() => {
- // if (Math.ceil(Math.random() * 100) % 3 != 0) {
- // return
- // }
- let now = new Date();
- let hour = now.getHours(); // 获取当前小时数(0-23)
- let minutes = now.getMinutes(); // 获取当前分钟数(0-59)
- let second = now.getSeconds()
- if (second > 45)
- return
- let month = now.getMonth() + 1
- if (month < 10)
- month = "0" + month
- let day = now.getDate()
- if (day < 10)
- day = "0" + day
- let num = (hour * 60 + minutes + 60 + 1)
- if (num < 10) num = "000" + num
- else if (num < 100) num = "00" + num
- else if (num < 1000) num = "0" + num
- let issue = now.getFullYear() + "-" + month + "-" + day + " " + num
- let msg = {
- "version": "1.0.0",
- "name": "bet",
- "body": "{\"issue\":\"" + issue + "\",\"play_type\":\"牛牛\",\"pos\":\"房1\",\"number\":\"红胜\",\"amount\":1}",
- "once": "1234",
- "token": token,
- }
- console.log("bet:", msg)
- axios.post(reqUrl, msg)
- }, 2 * 1000)
- }
- }
- }
- </script>
- </head>
- <body>
- <div id="sse">
- <a href="javascript:WebSocketTest()">运行 WebSocket</a>
- </div>
- </body>
- </html>
|