index.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. var request_fiddler = {
  2. url: "https://www.mxc.io/api/member/order",
  3. headers: {
  4. Host: "www.mxc.io",
  5. Connection: "keep-alive",
  6. "Content-Length": "54",
  7. "x-mxc-nonce": "1581605390444",
  8. "x-mxc-sign": "3afff0f76ba2974576d3d54f6cad4ac6",
  9. Origin: "https://www.mxc.io",
  10. language: "zh-CN",
  11. "User-Agent":
  12. "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
  13. "Content-Type": "application/x-www-form-urlencoded",
  14. Accept: "*/*",
  15. "Sec-Fetch-Site": "same-origin",
  16. "Sec-Fetch-Mode": "cors",
  17. Referer: "https://www.mxc.io/trade/easy",
  18. "Accept-Encoding": "gzip, deflate, br",
  19. "Accept-Language": "zh-CN,zh;q=0.9",
  20. Cookie:
  21. "aliyungf_tc=AQAAALLEnBsWvAYABfWyJ96sVR6QwB17; Hm_lvt_bfc2c0a173378480991465c3626cc9b9=1581592076,1581586327; __guid=80454929.3940374504297067500.1581592047298.8274; _ga=GA1.2.1331008568.1581592060; 1d3385c1-4b59-4849-894d-fe519261429e=webim-visitor-X27GKYETXE4XVTP9VJEG; _gid=GA1.2.1232965346.1581776323; monitor_count=2; Hm_lpvt_bfc2c0a173378480991465c3626cc9b9=1581776324; u_id=WEBc358c9d9316ab0b0a0aeb3a60bfdf2d1e60a4857dc42e49644b36f51f5228e43; account=x********%40163.com"
  22. },
  23. body: "price=2000&quantity=0.01&symbol=VI_USDT&tradeType=SELL"
  24. };
  25. var startTime = "2020-2-15 22:50:30"; // 开始时间
  26. var stopTime = "2020-2-15 22:50:35"; // 结束时间
  27. var delaytime = 20; //间隔时间毫秒
  28. request_fiddler["time"] = "true";
  29. request_fiddler["rejectUnauthorized"] = "false";
  30. request_fiddler["method"] = "POST";
  31. var inputArr = [];
  32. var order_type;
  33. var instrument_id;
  34. var side;
  35. var match_price;
  36. var price;
  37. var size;
  38. var currentAccountNum;
  39. var xunhuancishu;
  40. var xunhuanjiange;
  41. var myVar;
  42. var xuhao = 0;
  43. function xiadan() {
  44. request(request_fiddler, (error, response, body) => {
  45. xuhao++;
  46. if (!error && response.statusCode == 200) {
  47. if (response.headers["content-encoding"] == "gzip") {
  48. console.log(xuhao + "有响应,但响应已压缩");
  49. } else {
  50. console.log(xuhao + response.body);
  51. }
  52. }
  53. });
  54. }
  55. const request = require("request");
  56. const rp = require("request-promise");
  57. const log4js = require("log4js");
  58. const fs = require("fs");
  59. const config = require("./config");
  60. const WebSocket = require("ws");
  61. const isPortReachable = require("is-port-reachable");
  62. fs.writeFileSync("autoTrade.log", "");
  63. const logger = log4js.getLogger();
  64. log4js.configure({
  65. appenders: {
  66. out: { type: "stdout" },
  67. file: { type: "file", filename: "autoTrade.log" }
  68. },
  69. categories: {
  70. default: { appenders: ["out", "file"], level: "debug" }
  71. }
  72. });
  73. let index;
  74. try {
  75. index = parseInt(process.argv.slice(2));
  76. if (!(index >= 0)) {
  77. throw "";
  78. }
  79. logger.info(`${index}号服务器开始运行`);
  80. } catch (e) {
  81. logger.error("参数错误,缺少序号");
  82. return;
  83. }
  84. let accounts = divideArray(config.accounts, config.servers.length)[index];
  85. //logger.info('账号', accounts);
  86. let challenges = divideArray(config.challenges, config.servers.length)[index];
  87. //logger.info('challenges', challenges);
  88. let purchaseAccount =
  89. config.purchaseAccounts[index % config.purchaseAccounts.length];
  90. let wsClients = [];
  91. let ws;
  92. async function initWs() {
  93. if (index == 0) {
  94. const wss = new WebSocket.Server({
  95. port: 8080
  96. });
  97. wss.on("connection", function connection(ws) {
  98. logger.info("websocket client已连接");
  99. ws.on("message", function incoming(message) {
  100. logger.info("received message:", message);
  101. if (message.startsWith("secretStr:")) {
  102. wsSend(message);
  103. if (interval) {
  104. clearInterval(interval);
  105. }
  106. let secretStr = message.replace("secretStr:", "");
  107. cancel();
  108. purchase(secretStr);
  109. }
  110. });
  111. wsClients.push(ws);
  112. });
  113. process.on("exit", function() {
  114. try {
  115. wss.close();
  116. } catch (e) {}
  117. });
  118. } else {
  119. await new Promise((resolve, reject) => {
  120. let ii = setInterval(async () => {
  121. logger.info("等待", config.servers[0]);
  122. let reachable = await isPortReachable(8080, {
  123. host: config.servers[0]
  124. });
  125. if (reachable) {
  126. clearInterval(ii);
  127. resolve();
  128. }
  129. }, 500);
  130. });
  131. ws = new WebSocket(`ws://${config.servers[0]}:8080`);
  132. ws.on("open", function open() {
  133. console.log("websocket已连接");
  134. });
  135. ws.on("message", function incoming(message) {
  136. logger.info("received message:", message);
  137. if (message.startsWith("secretStr:")) {
  138. let secretStr = message.replace("secretStr:", "");
  139. logger.info("收到secretStr", secretStr);
  140. if (interval) {
  141. clearInterval(interval);
  142. }
  143. cancel();
  144. purchase(secretStr);
  145. }
  146. });
  147. }
  148. }
  149. function wsSend(msg) {
  150. if (index == 0) {
  151. wsClients.forEach(client => {
  152. client.send(msg);
  153. });
  154. } else {
  155. ws.send(msg);
  156. }
  157. }
  158. let reqs = [];
  159. let count = 0;
  160. let interval;
  161. function cancel() {
  162. for (let req of reqs) {
  163. req.abort();
  164. }
  165. }
  166. async function start() {
  167. //await initWs();
  168. var timmer = setInterval(() => {
  169. xiadan();
  170. clearTimeout(check.timer);
  171. // 计算还剩多少时间开始
  172. let theDate = new Date(stopTime).getTime();
  173. let now = new Date().getTime();
  174. let deta = Math.floor((theDate - now) / 1000);
  175. //console.log( `距离结束还剩${deta}秒` )
  176. if (deta <= 0) {
  177. clearInterval(timmer);
  178. return;
  179. }
  180. }, delaytime);
  181. }
  182. var df = require("./date.format");
  183. var check = () => {
  184. // 先清除timer
  185. clearTimeout(check.timer);
  186. // 计算还剩多少时间开始
  187. let theDate = new Date(startTime).getTime();
  188. let now = new Date().getTime();
  189. let deta = Math.floor((theDate - now) / 1000);
  190. console.log(`距离发送还剩${deta}秒`);
  191. if (deta <= 0) {
  192. start();
  193. return;
  194. }
  195. check.timer = setTimeout(() => {
  196. check();
  197. }, 200);
  198. };
  199. check();
  200. function divideArray(arr, size) {
  201. let newArr = Array.from({ length: size }, () => []);
  202. for (let i = 0; i < arr.length; i++) {
  203. newArr[i % size].push(arr[i]);
  204. }
  205. return newArr;
  206. }