// ==UserScript== // @name MCBBS自动售卖机 // @namespace http://tampermonkey.net/ // @version 0.2 // @description 自动售卖道具 // @author MiaoWoo // @match https://www.mcbbs.net/home.php?mod=magic** // @grant none // ==/UserScript== (async function () { let store = window.localStorage const lastOrderKey = 'circlebox:lastorder' let checkTimes = 0 async function sleep(time) { return new Promise((resolve, reject) => setTimeout(resolve, time)) } async function main() { try { let params = location.href.split('?')[1].split('&').map(s => s.split('=')).reduce((pre, cur, index) => { pre[cur[0]] = cur[1]; return pre }, {}) if (!params.action) { return location.href = '/home.php?mod=magic&action=mybox' } console.log(params) switch (params.action || "shop") { case "shop": await shopAction(params) break case "mybox": await myboxAction(params) break case "log": await logAction(params) break } } catch (ex) { await sleep(1500) location.href = '/home.php?mod=magic&action=mybox' } } async function shopAction() { await sendOrderAction(() => window.showWindow('magics', 'home.php?mod=magic&action=shop&operation=give&mid=mcbbs_mcserver_plus:serverBump'), true) } async function myboxAction() { await sendOrderAction(() => window.showWindow('magics', 'home.php?mod=magic&action=mybox&operation=give&magicid=32', 'get', 0)) } async function lowStockNotify() { await fetch('https://reward.yumc.pw/mcbbs/lowStockNotify').then(r => r.json()) } async function clearOrderCache() { await fetch('https://reward.yumc.pw/mcbbs/clearOrderCache').then(r => r.json()) } async function duplicateNotify(order_id) { await fetch('https://reward.yumc.pw/mcbbs/duplicateNotify/order_id/' + order_id).then(r => r.json()) } async function sendOrderAction(openFn, back = false) { let count = 0 let result = await fetch('https://reward.yumc.pw/mcbbs/needSendOrder').then(r => r.json()) if (result.code != 200) { if (++checkTimes > 30 || back) { location.href = '/home.php?mod=magic&action=mybox' } return setTimeout(() => sendOrderAction(openFn), 15000) } try { openFn() } catch (ex) { } let order = result.data // if (store.getItem(lastOrderKey) == order.order_id) { // console.error('重复发送订单: ' + order.order_id + ' 5秒后刷新重试...') // duplicateNotify(order.order_id) // await sleep(5000) // return location.href = '/home.php?mod=magic&action=mybox' // } console.log(`开始发送订单 ${order.order_id}`) let username = undefined while ((username = jq('#selectedusername')[0]) == undefined) { if (count > 3) { console.log('检测窗口超时!') if (!back) { if (order.allowAutoBuy) { await clearOrderCache() await sleep(1500) location.href = '/home.php?mod=magic&action=shop' } else { await lowStockNotify() await sleep(10000) location.href = '/home.php?mod=magic&action=mybox' } } return } await sleep(1000) count++ } username.value = order.reciver_name let amount = username.parentNode.parentNode.nextElementSibling.childNodes[3].childNodes[0] amount.value = order.goods_amount let remark = username.parentNode.parentNode.nextElementSibling.nextElementSibling.childNodes[3].childNodes[0] remark.value = `圈云盒子 自动发货订单: ${order.order_id} 物品: ${order.goods_name} 数量: ${order.goods_amount}` store.setItem(lastOrderKey, order.order_id) await sleep(300) jq('#operatesubmit').click() await sleep(500) jq('#fwin_dialog_submit').click() let info = '' let error = '' while ((info = jq('.alert_info').text()) == '') { if (count > 5) { error = jq('#ntcwin').text() if (error == "抱歉,操作数量不合法") { if (order.allowAutoBuy) { await clearOrderCache() await sleep(1500) location.href = '/home.php?mod=magic&action=shop' return } else { lowStockNotify() await sleep(10000) location.href = '/home.php?mod=magic&action=mybox' } } break } await sleep(1000) count++ } try { let finish = await fetch('https://reward.yumc.pw/mcbbs/updateOrder', { method: "POST", headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify({ "order_id": order.order_id, "status": error ? 3 : 2, "remark": info || error || "未获取到结果!" }) }).then(r => r.json()) console.log(finish) } catch (ex) { console.log(ex) } await sleep(800) if (back || error) { return location.href = '/home.php?mod=magic&action=mybox' } jq('#fwin_dialog_submit').click() } async function logAction(params) { switch (params.operation) { case "givelog": await givelogOperation() break } } async function givelogOperation() { let logs = jq('table.dt').children().children().map((index, item) => { let line = jq(item).text().split('\n').filter(f => f) return line.join(' ') }).splice(1)//去除第一行无效数据 console.log(logs) } main() })()