Damai - Stage 1

try to take over the world!

  1. // ==UserScript==
  2. // @name Damai - Stage 1
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.3.2 - Bham Init
  5. // @description try to take over the world!
  6. // @author Mr.FireAwayH
  7. // @match https://detail.damai.cn/item.htm*
  8. // @run-at document-end
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. 'use strict';
  14. var dates = [];
  15. var itemId = 0;
  16. var performId = 0;
  17. var skuId = 0;
  18.  
  19. var clock = function(){
  20. var clockHTML = "<div id='timedate' style='right: 0px;top: 10%; font: small-caps bold 60px/150% \"Segoe UI\", Frutiger, \"Frutiger Linotype\", \"Dejavu Sans\", \"Helvetica Neue\", Arial, sans-serif;width: 600px;color:#fff;z-index: 99999999999;position: fixed;background: red;'><a id='h'>12</a> : <a id='m'>00</a>: <a id='s'>00</a>: <a id='mi'>000</a> </div>";
  21. var clockDiv = document.createElement("div");
  22. document.body.appendChild(clockDiv);
  23. clockDiv.outerHTML = clockHTML;
  24.  
  25. Number.prototype.pad = function(n) {
  26. for (var r = this.toString(); r.length < n; r = 0 + r);
  27. return r;
  28. };
  29.  
  30. var updateClock = function() {
  31. var now = new Date();
  32. var milli = now.getMilliseconds(),
  33. sec = now.getSeconds(),
  34. min = now.getMinutes(),
  35. hou = now.getHours(),
  36. mo = now.getMonth(),
  37. dy = now.getDate(),
  38. yr = now.getFullYear();
  39. var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
  40. var tags = ["h", "m", "s", "mi"],
  41. corr = [hou.pad(2), min.pad(2), sec.pad(2), milli];
  42. for (var i = 0; i < tags.length; i++)
  43. document.getElementById(tags[i]).firstChild.nodeValue = corr[i];
  44. }
  45.  
  46. var initClock = function() {
  47. updateClock();
  48. window.setInterval(updateClock, 1);
  49. }
  50.  
  51. initClock();
  52. }
  53.  
  54. var autoClick = function(){
  55. var autoClickHandler = function(){
  56. var h = window.hour.value;
  57. var m = window.min.value;
  58. var s = window.sec.value;
  59. var time = new Date();
  60. try{
  61. time.setHours(h);
  62. time.setMinutes(m);
  63. time.setSeconds(s);
  64. var diff = time - Date.now();
  65. if(diff < 0){
  66. alert("请输入未来的时/分/秒");
  67. }else{
  68. setTimeout(function(){
  69. var subFrames = document.querySelectorAll(".subframe");
  70. subFrames.forEach(f => {
  71. var subEnter = f.contentWindow.hidden;
  72. if(subEnter){
  73. subEnter.click();
  74. subEnter.innerText = "如果没有窗口弹出 请设置允许弹出窗口(地址栏右侧,五角星左边)";
  75. subEnter.style.display = "block";
  76. }
  77. });
  78. }, diff);
  79. window.autosubmit.innerText = "设置成功";
  80. }
  81. }catch(e){
  82. alert("请输入正确的时/分/秒");
  83. }
  84. }
  85.  
  86.  
  87. var autoHTML = "<div id='autoClick' style='width: 150px;font-size: 15px;line-height: 20px;position: absolute;top: 0px;right: 0;'> <p>时<input id='hour' type='text' style='width: 90%'></p> <p>分<input id='min' type='text' style='width: 90%'></p> <p>秒<input id='sec' type='text' style='width: 90%'></p> <p><button id='autosubmit' style='width: 100%; cursor: pointer;'>设置自动提交</button></p> </div>";
  88. var autoDiv = document.createElement("div");
  89. window.timedate.appendChild(autoDiv);
  90. autoDiv.outerHTML = autoHTML;
  91. window.autosubmit.onclick = autoClickHandler;
  92.  
  93.  
  94. }
  95.  
  96. var priceHandler = function(e){
  97. skuId = e.target.value;
  98. var node = document.querySelector(".perform__order__box");
  99. if(window.enter){
  100. node.removeChild(window.enter);
  101. node.removeChild(window.hidden);
  102. }
  103. if(skuId > -1){
  104. var selectSeat = document.querySelector(".service").innerText.indexOf("不支持选座") === -1;
  105. var enterButtonHTML = "";
  106. var link = "";
  107. if(selectSeat){
  108. link = `https://seatsvc.damai.cn/tms/selectSeat?itemId=${itemId}&performId=${performId}&skuId=${skuId}&projectId=${itemId}&spm=a2oeg.project.projectinfo.dbuy`;
  109. enterButtonHTML = `<a id='enter' href='${link}' target='_blank'>点这里</a><button id='hidden' onclick='window.open("${link}")' style='display:none'></button>`;
  110. }else{
  111. var num = 1;
  112. var numDom = document.querySelector(".cafe-c-input-number-input-wrap input");
  113. if(numDom){
  114. num = numDom.value;
  115. }
  116. link = `https://buy.damai.cn/orderConfirm?exParams=%7B%22damai%22%3A%221%22%2C%22channel%22%3A%22damai_app%22%2C%22umpChannel%22%3A%2210002%22%2C%22atomSplit%22%3A%221%22%2C%22serviceVersion%22%3A%221.8.5%22%7D&buyParam=${itemId}_${num}_${skuId}&buyNow=true&spm=a2oeg.project.projectinfo.dbuy`;
  117. enterButtonHTML = `<a id='enter' href='${link}' target='_blank'>点这里</a><button id='hidden' onclick='window.open("${link}")' style='display:none'></button>`;
  118. }
  119. var enterButton = document.createElement("a");
  120. node.appendChild(enterButton);
  121. enterButton.outerHTML = enterButtonHTML;
  122. }else{
  123. node.removeChild(window.enter);
  124. node.removeChild(window.hidden);
  125. }
  126. }
  127.  
  128. var dateHandler = function(e){
  129. var value = e.target.value;
  130. var node = document.querySelector(".perform__order__box");
  131. if(window.prices){
  132. node.removeChild(window.prices);
  133. }
  134.  
  135. if(window.enter){
  136. node.removeChild(window.enter);
  137. node.removeChild(window.hidden);
  138. }
  139.  
  140. if(value > -1){
  141. var priceSelectHTML = "<select id='prices'><option value='-1'>请选择票价</option>";
  142. var perform = dates[value];
  143. itemId = perform.itemId;
  144. performId = perform.performId;
  145.  
  146. perform.skuList.forEach(n => {
  147. priceSelectHTML += `<option value="${n.skuId}">${n.skuName}</option>`;
  148. });
  149. priceSelectHTML += "</select>";
  150. var priceSelect = document.createElement("select");
  151. node.appendChild(priceSelect);
  152. priceSelect.outerHTML = priceSelectHTML;
  153. window.prices.onchange = priceHandler;
  154. }else{
  155. node.removeChild(window.prices);
  156. }
  157. }
  158.  
  159. var multiMode = function(){
  160. var num = Number(prompt("输入同时抢票数量(请输入阿拉伯数字)"));
  161. if(!Number.isNaN(num)){
  162. var link = `${location.href}&multi=${num}`;
  163. location.href = link;
  164. }else{
  165. multiMode();
  166. }
  167. }
  168.  
  169. var setup = function(){
  170. document.body.removeChild(window.hint);
  171. var data = JSON.parse(window.dataDefault.innerText).performBases;
  172. dates = data.map(s => s.performs.flat()).flat();
  173.  
  174. if(location.search.indexOf("multi") === -1){
  175. var multiHTML = "<a style='background: red; color: white; cursor: pointer' id='multi'>多开模式 暂仅建议不可选座类使用</a></br>";
  176. var dateSelectHTML = `${multiHTML}<select id='performs'><option value='-1'>请选择日期</option>`;
  177. dates.map(s => s.performName).forEach((n, i) => {
  178. dateSelectHTML += `<option value="${i}">${n}</option>`;
  179. });
  180. dateSelectHTML += "</select>";
  181.  
  182. var dateSelect = document.createElement("select");
  183. document.querySelector(".perform__order__box").appendChild(dateSelect);
  184. dateSelect.outerHTML = dateSelectHTML;
  185. window.performs.onchange = dateHandler;
  186. window.multi.onclick = multiMode;
  187.  
  188. if(location.search.indexOf("sub") === -1){
  189. clock();
  190. autoClick();
  191. }else{
  192. window.multi.parentNode.removeChild(window.multi);
  193. var css = document.createElement("style");
  194. document.body.appendChild(css);
  195. css.outerHTML = "<style> .search-header, .cover, .dm-header-wrap{display: none !important; } .cont{padding-left: 0px !important;}</style>";
  196. }
  197. }else{
  198. var link = location.href;
  199. var arr = link.split("multi=");
  200. var newLink = arr[0];
  201. var num = arr[1].split("&")[0];
  202. var container = document.createElement("div");
  203. document.body.appendChild(container);
  204. container.setAttribute("style", "position: absolute; height: 100%; background: wheat; top: 0; width: 100%;");
  205.  
  206. var width = (95 / num) + "%";
  207. var style = `width: ${width}; height: 100%; border: 5px solid red;`;
  208.  
  209. for(var i = 0; i < num; i++){
  210. var sub = document.createElement("iframe");
  211. sub.className = "subframe";
  212. sub.src = `${newLink}&sub=${i + 1}`;
  213. container.appendChild(sub);
  214. sub.setAttribute("style", style);
  215. }
  216. clock();
  217. autoClick();
  218. }
  219. }
  220.  
  221. var init = function(){
  222. var css = document.createElement("style");
  223. document.body.appendChild(css);
  224. css.outerHTML = "<style> .sidebar{display: none !important;} </style>";
  225.  
  226. var a = document.createElement("div");
  227. document.body.appendChild(a);
  228. a.outerHTML = "<div id='hint' style='position: absolute;width: 30%;background: red;top: 40%;text-align: center;left: 40%;color: white;font-size: 40px;'>抢票辅助工作中</div>";
  229. setTimeout(setup, 5000);
  230. }
  231.  
  232. window.onload = init;
  233. })();