// ==UserScript== // @name 二定重复X9 // @namespace http://tampermonkey.net/ // @version 0.4 // @description 上一期位置有重复号码时下单 // //@require https://cdn.bootcdn.net/ajax/libs/tesseract.js/2.1.1/tesseract.min.js // //@require https://cdn.bootcdn.net/ajax/libs/tesseract.js/2.1.1/worker.min.js // @author You // @include http*://ub*.ppa168.com/* // @include http*://f*.tt6699.xyz/* // @include http*://k*.aa369.xyz/* // @include http*://f*.aa369.xyz/* // @include http*://f1.tt777.xyz/* // @grant GM_xmlhttpRequest // @grant GM.getTab // @grant GM.saveTab // @grant GM.setValue // @grant GM.getValue // @run-at document-body // @downloadURL none // ==/UserScript== (function() { 'use strict'; const LEAST_END_TIME = 5; // 最后30秒不要下单 const SEARCH_KEY = "ttt369"; const SEARCH_KEY2 = "jjj777"; const BET_STYLE = ['abXXX', 'aXbXX', 'aXXbX', 'aXXXb', 'XabXX', 'XaXbX', 'XaXXb', 'XXabX', 'XXaXb', 'XXXab']; const LEN = BET_STYLE.length; // 10条道 var gameData; // global var var gameResult; // global var var gameType = 3; var lastOpenedGameID = 0; var gameEndTime = 0; // 一排--排除乘2, 如为0则排除3 const POOL0 = (gameResult, idx) => { let holder = BET_STYLE[idx]; let pools = []; let aIdx = holder.indexOf('a'); let num = gameResult[0].nums[aIdx]; for (let i = 1; i <= 9; i++) { let num2 = (parseInt(num) + i) % 10; [...Array(10).keys()].forEach(a => { [...Array(10).keys()].forEach(b => { if (a != num && b != num && a!= num2 && b != num2 && a != b) { pools.push(holder.replace('a', a).replace('b', b)); } }); }); } pools = pools.sort(); return pools; }; function signalA(gameResult, idx) { if (!gameData || !gameData.openDateList|| !gameResult || gameResult.length < 1) { return false; } let holder = BET_STYLE[idx]; let aIdx = holder.indexOf('a'); let bIdx = holder.indexOf('b'); if (gameResult[0].nums[aIdx] != gameResult[0].nums[bIdx]) { return false; } // 多于二重,只取最先的,四重取先两对 let preCount = 0; for (let i = aIdx - 1; i >= 0; i--) { if (gameResult[0].nums[aIdx] == gameResult[0].nums[i]) { preCount++; } } if (preCount % 2 != 0) { return false; } // 多于二重,只取相邻 for (let i = aIdx + 1; i < bIdx; i++) { if (gameResult[0].nums[aIdx] == gameResult[0].nums[i]) { return false; } } return true; } const SIGNALS = [signalA]; const POOLS = [POOL0]; const OPTIONS_DESC = ['二定重复']; var wait = ms => new Promise(resolve => setTimeout(resolve, ms)); function isPromise(obj) { return !!obj && ((typeof obj === 'object' && typeof obj.then === 'function') || (typeof obj === 'function' && typeof obj().then === 'function')); } /** * Wait Resource. * * @param {Function} resourceFn pred function to check resource * @param {Object} options * @returns Promise */ function waitResource(resourceFn, options) { var optionsRes = Object.assign( { interval: 2000, max: 10 }, options ); var current = 0; return new Promise((resolve, reject) => { var timer = setInterval(() => { if (isPromise(resourceFn)) { resourceFn().then(res => { if(res) { clearInterval(timer); resolve(); } }); } else if (resourceFn()) { clearInterval(timer); resolve(); } current++; if (current >= optionsRes.max) { clearInterval(timer); reject('Time out'); } }, optionsRes.interval); }); } function ajaxAsync(url, data) { return new Promise((resolve, reject) => { $.ajax({ type: "post", url: url, cache: false, timeout: 1000 * 30, dataType: 'json', data: data, success: function (msg) { if (!msg || msg.error) { reject(`Request ${url} => Error ${msg.error}`); } else { resolve(msg); } }, error: function () { reject(`Fail to request ${url} with data ${data}`); } }); }); } function resToMask(res, idx) { let a = BET_STYLE[idx]; let mask = 'XXXXX'.split(''); for(let i = 0; i < BET_STYLE.length; i++) { if (a[i] !== 'X') { mask[i] = res[i]; } } return mask.join(''); } function isPreviousOpened(gameData) { if (!gameData || !gameData.openDateList|| !gameResult || gameResult.length < 1) { return false; } return (gameResult[0].gameId + 1 ) % 10 === gameData.openDateList.number % 10; } async function requestGameData(gameType) { return await ajaxAsync('membergamedata', { __: "membergamedata", gameIndex: gameType, type: 2, isNumTo: 1, t: __sysinfo.autoTid }); } async function requestGameResult(gameType) { return await ajaxAsync('Result', { __: "Result", gameIndex: gameType, t: __sysinfo.autoTid }); } function parseResult(gameResult) { return gameResult.table.map(a => { let gameIdMatch = /\d+/.exec(a); let numRegx = /SSCNo_(\d)/mg; let nums = []; let match; while((match = numRegx.exec(a)) !== null) { nums.push(parseInt(match[1])); } return { gameId: parseInt(gameIdMatch[0]), nums: nums } }); } function parseAmounts(amountStr) { if (!amountStr) { return []; } let amounts = amountStr.split('-').map(a => parseInt(a)).map(a => (a >= 0) ? a : 0); if (amounts.some(a => !(a >= 0))) { amounts = []; } return amounts; } async function bet(pools, amount, gameType, gameNumber) { let count = pools.length; pools = pools.map(a => `${getDWTypeByName(a)}:${amount}`); const REQ_DATA = { __: "DownEntry", gameIndex: gameType, betType: 5, number: gameNumber, sortAry: pools.join(','), t: __sysinfo.autoTid }; console.log(REQ_DATA); // return {}; return await ajaxAsync('DownEntry', REQ_DATA); } function addUI() { let divAll=document.createElement("div"); divAll.setAttribute("style", "float:left;z-index:100000;position:absolute;background-color: #229ACB"); let controlBtn = document.createElement("BUTTON"); controlBtn.innerText = "隐藏"; controlBtn.onclick = (event) => { if (event.target.innerText === "隐藏") { event.target.innerText = "打开"; document.querySelector('#betAssitInfos').style.display = 'none'; } else { event.target.innerText = "隐藏"; document.querySelector('#betAssitInfos').style.display = 'block'; } } divAll.appendChild(controlBtn); let divList=document.createElement("div"); divList.setAttribute("id", "betAssitInfos"); divAll.appendChild(divList); for(let i = 0; i < OPTIONS_DESC.length; i++) { let div=document.createElement("div"); div.setAttribute("style", "width:280px"); let btn=document.createElement("BUTTON"); btn.setAttribute("id", `betBtn${i}`); btn.setAttribute("style", "width:130px"); div.appendChild(btn); let select = document.createElement("INPUT"); //select.setAttribute("id", `strategy`); if(OPTIONS_DESC[i].includes('hide')) { select.value = ""; } else { select.value = OPTIONS_DESC[i];//OPTIONS_DESC.map(a => ``).join(''); } select.setAttribute("type", "text"); select.setAttribute("style", "width:60px"); select.setAttribute('readonly',''); div.appendChild(select); let amount = document.createElement("INPUT"); amount.setAttribute("id", `betAmount${i}`); amount.setAttribute("style", "width:80px"); amount.setAttribute("placeholder", "金额:1-2-4-8"); amount.setAttribute("type", "text"); div.appendChild(amount); divList.appendChild(div); } let node = document.querySelector('div'); let parentNode = node.parentNode; parentNode.insertBefore(divAll, node); } async function updateUI(tabObj, idx) { if (!tabObj[idx]) { tabObj[idx] = {}; } let btnId = `#betBtn${idx}`; if (tabObj[idx].started) { let lenInfo = ''; if (tabObj[idx].betInfos) { let betInfoArr = [] for (let bi = 0; bi < tabObj[idx].betInfos.length; bi++) { if (tabObj[idx].betInfos[bi].length > 0) { betInfoArr.push(BET_STYLE[bi] + ':' + tabObj[idx].betInfos[bi].length); } } lenInfo = betInfoArr.join(','); } document.querySelector(btnId).innerText = `结束(${lenInfo})`; // document.querySelector("#strategy").selectedIndex = tabObj.selectedIndex; document.querySelector(`#betAmount${idx}`).value = tabObj[idx].amounts.join('-'); document.querySelector(btnId).onclick = async () => { tabObj[idx].started = false; // tabObj.betInfos = null; await GM.saveTab(tabObj); document.querySelector(btnId).innerText = "..."; } } else { document.querySelector(btnId).innerText = "开始"; document.querySelector(btnId).onclick = async () => { tabObj[idx].started = true; // tabObj.selectedIndex = document.querySelector("#strategy").selectedIndex; tabObj[idx].amounts = parseAmounts(document.querySelector(`#betAmount${idx}`).value); tabObj[idx].betInfos = Array(LEN).fill([]); tabObj[idx].betPools = Array(LEN).fill([]); // tabObj.gameType = document.querySelector('#menuText').getAttribute('data-index'); // 澳五的gameType是3 tabObj[idx].lastGameID = 0; tabObj[idx].lastOpenedGameID = 0; await GM.saveTab(tabObj); document.querySelector(btnId).innerText = "..."; } } } async function work(tabObj, idx) { // work if(!tabObj[idx].started) { return; } for (let i = 0; i < LEN; i++) { let pool = POOLS[idx](tabObj.result, i); if (!!tabObj[idx].betInfos[i] && tabObj[idx].betInfos[i].length === 0) { // 初始下单 if (SIGNALS[idx](tabObj.result, i) && tabObj[idx].amounts.length > 0) { if (tabObj[idx].amounts[0] > 0) { let res = await bet(pool, tabObj[idx].amounts[0], gameType, gameData.openDateList.number); console.log(res); if (res.result !== 1 && res.result !== '余额不足') { throw(res); } } tabObj[idx].betInfos[i] = [gameData.openDateList.number]; tabObj[idx].betPools[i] = [pool]; updateUI(tabObj, idx); await GM.saveTab(tabObj); continue; } } let betMaxIdx = tabObj[idx].betInfos[i].length - 1; if (tabObj[idx].betInfos[i][betMaxIdx] > tabObj.result[0].gameId) { // 还没有开奖 continue; } if (!!tabObj[idx].betInfos[i] && tabObj[idx].betInfos[i].length > 0) { // 加码 let resultedLen = tabObj.result.length; let resIdx = -1; // 防止跳期 for (let gameIdx = resultedLen - 1; gameIdx >= 0; gameIdx--) { if (tabObj[idx].betInfos[i][betMaxIdx] === tabObj.result[gameIdx].gameId) { resIdx = gameIdx; break; } } let betRes = [-1, -1, -1, -1, -1]; if (resIdx !== -1) { betRes = tabObj.result[resIdx].nums; } let betMaskRes = resToMask(betRes, i); console.log(`方案${idx}开奖结果:`, i, betMaskRes, `resIdx:${resIdx}`); let poolMaxIdx = tabObj[idx].betPools[i].length - 1; if (tabObj[idx].betPools[i][poolMaxIdx].includes(betMaskRes)) { // 中奖 console.log("中奖", i, betRes); tabObj[idx].betInfos[i] = []; tabObj[idx].betPools[i] = []; await GM.saveTab(tabObj); } else { // 不中奖 if (tabObj[idx].betInfos[i].length < tabObj[idx].amounts.length && SIGNALS[idx](tabObj.result, i)) { // 加码 let betInfosLen = tabObj[idx].betInfos[i].length; if (tabObj[idx].amounts[betInfosLen] > 0) { let res = await bet(pool, tabObj[idx].amounts[betInfosLen], gameType, gameData.openDateList.number); console.log(res); if (res.result !== 1 && res.result !== '余额不足') { throw(res); } } tabObj[idx].betInfos[i].push(gameData.openDateList.number); tabObj[idx].betPools[i].push(pool); updateUI(tabObj, idx); await GM.saveTab(tabObj); } else if (tabObj[idx].betInfos[i].length >= tabObj[idx].amounts.length) { // 已经加到最大 重新开始 tabObj[idx].betInfos[i] = []; tabObj[idx].betPools[i] = []; updateUI(tabObj, idx); await GM.saveTab(tabObj); } } } } // end work } async function main() { if (window !== top) { console.log("NOT THE TOP"); return; } console.log("START...", new Date()); if (window.location.pathname === "/login" || window.location.pathname === "/login/") { // login let user = await GM.getTab(); console.log("DEBUG ", user); if (document.querySelector('#btnSearch')) { if (document.location.host == "f1.tt777.xyz") { document.querySelector('#search').value = SEARCH_KEY2; } else { document.querySelector('#search').value = SEARCH_KEY; } document.querySelector('#btnSearch').click(); return; } if (!!user && !!user.name) { await wait(1000); document.querySelector('#userName').value = user.name; await wait(500); document.querySelector('#passWord').value = user.password; await wait(500); // close all let tabObj = await GM.getTab(); for(let i = 0; i < OPTIONS_DESC.length; i++) { if (tabObj[i]) { tabObj[i].started = false; } } await GM.saveTab(tabObj); // document.querySelector('.btn-primary').click(); } else { document.querySelector('.login100-form-btn').onclick = async () => { user.name = document.querySelector('#userName').value; user.password = document.querySelector('#passWord').value; await GM.saveTab(user); } } return; } if (window.location.pathname === "/loginvalidate") { await wait(500); document.querySelector('.hotBtn').click(); return; } await waitResource(async () => { console.log(document.querySelector('#userName')); return typeof __sysinfo !== "undefined" && !!__sysinfo.data && !!__sysinfo.data.userName; }); // update game Data setInterval(async () => { try { if (gameEndTime != 0 && gameEndTime + 1000 * 100 < new Date().getTime()) { location.reload(); } // don't need to update if (gameData && isPreviousOpened(gameData) && gameEndTime > new Date().getTime()) { return; } gameData = await requestGameData(gameType); gameEndTime = new Date().getTime() + 1000 * gameData.openDateList.endTime; console.log('DEBUG:', gameData); } catch (err) { console.log(err); // ignore err } }, 10000); // update game history result setInterval(async () => { try { if (!!gameData && lastOpenedGameID < gameData.openNumList.newnumber) { gameResult = parseResult(await requestGameResult(gameType)); lastOpenedGameID = gameResult[0].gameId; console.log('DEBUG:', gameResult) } } catch (err) { console.log(err); } }, 5000); addUI(); while (true) { if (document.querySelector('.myLayerOk') && document.querySelector('.myLayerTitle').innerText === '通知') { // clear 通知 document.querySelector('.myLayerOk').click() } let tabObj = await GM.getTab(); // console.log('tabObj: ', tabObj); for (let i = 0; i < OPTIONS_DESC.length; i++) { await updateUI(tabObj, i); } if (!gameData || !gameResult) { await wait(1000); continue; } if (gameData.openDateList.endTime < LEAST_END_TIME || !isPreviousOpened(gameData)) { await wait(1000); continue; } // update result let tabResult = tabObj.result ? tabObj.result : []; if (tabResult.length === 0 || tabResult[0].gameId < gameResult[0].gameId) { for (let i = gameResult.length - 1; i >= 0; i--) { if (tabResult.length === 0 || tabResult[0].gameId < gameResult[i].gameId) { tabResult.unshift(gameResult[i]); } } tabObj.result = tabResult.slice(0,120); console.log("Results:", tabObj.result); await GM.saveTab(tabObj); } if (tabObj.result.length >= 11) { for (let i = 0; i < OPTIONS_DESC.length; i++) { await work(tabObj, i); } } await wait(1000); } } main() .then(() => console.log("Main Done")) .catch((err) => { console.error(err, "Restart in 6 secs ..."); setTimeout(() => location.reload(), 6 * 1000); }); })();