斗鱼鱼塘商城兑换工具

斗鱼鱼塘商城自动兑换工具 (注意手动设置个人用户ID以及房间号)

< Părere la script-ul 斗鱼鱼塘商城兑换工具

Recenzie: Bun, script-ul merge

§
Postat în: 06-01-2025

大佬 我凌晨试了很久 只能兑换那些库存有的 不会自动刷新

ahmeng97Autor
§
Postat în: 06-01-2025

啊 库存有的 不会自动刷新是啥, 应该是延迟功能又飘移了 之前测试过 在循环一定次数后, 延迟1秒 3秒 会变成1~60秒一次 导致无法卡点发送兑换请求, 我目前个人用的是做的另一个脚本 通过Ctrl 多选指定奖品后 自己卡点 58秒之类的 点击启动兑换 发送请求的循环也做了一些更改好像.. 看截图, 唔 忘记了心动卡1点钟有没有刷新, 反正昨晚卡点启动一次 全兑换完了 除了心动卡和1鱼翅 在1点钟的时候没刷新
自动兑换功能的话 因为之前的延迟功能有问题 修改成了检测倒计时元素的变化来检测(也是偶尔会出现问题 所以这个版本你暂时先用手动启动兑换的 有空再看看怎么改)
房间ID记得修改为你有粉丝牌高于3级的房间ID, 不一定要当前页面的ID, ctnID已经通过Cookies获取了 可以无视

// ==UserScript==
// @name 斗鱼鱼塘商城兑换工具(多选版)
// @namespace YourNamespaceHere
// @version 1.4
// @description 斗鱼鱼塘商城自动兑换工具 (注意手动设置个人用户ID以及房间号),支持下拉菜单多选兑换
// @match https://www.douyu.com/pages/fish-act/mine*
// @grant GM_addStyle
// @grant GM_xmlhttpRequest
// @license MIT
// ==/UserScript==

(function () {
'use strict';
// ---------- 重要 ----------//
let previousAcfCcnValue = null;
let ctnid = '112233'; ///用户ID 在发送请求的时候会自动在Cookies获取最新的ID
const roomid = '112233'; //房间ID

// 用于判断页面是否加载完成的标志变量
let pageLoaded = false;

// 监听页面加载状态改变事件
window.addEventListener('load', function () {
pageLoaded = true;
initScript();
});

// 初始化脚本的函数,在页面加载完成后执行具体操作
function initScript() {
// 添加悬浮窗样式
GM_addStyle(`
#overlay {
position: fixed;
top: 26%;
left: 50%;
transform: translate(-50%, -50%);
background-color: rgba(255, 255, 255, 0.9);
padding: 20px;
border-radius: 10px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
display: none;
z-index: 9999;
}

button {
margin: 5px;
padding: 10px 20px;
font-size: 16px;
cursor: pointer;
border: none;
border-radius: 5px;
}

button.controlExchange {
background-color: red;
color: white;
margin: 5px;
padding: 10px 20px;
font-size: 16px;
cursor: pointer;
border: none;
border-radius: 5px;
}

button.autoExchange {
background-color: red;
color: white;
margin: 5px;
padding: 10px 20px;
font-size: 16px;
cursor: pointer;
border: none;
border-radius: 5px;
}

select {
margin: 5px;
padding: 10px;
font-size: 16px;
border: 1px solid #ccc;
border-radius: 5px;
height: auto; /* 调整高度以适应多选展示 */
overflow-y: auto; /* 出现滚动条 */
width: 200px; /* 设置合适宽度 */
-webkit-appearance: none; /* 去除默认样式(webkit浏览器) */
-moz-appearance: none; /* 去除默认样式(firefox浏览器) */
appearance: none; /* 去除默认样式 */
}
`);

// 创建悬浮窗元素及按钮
const overlay = document.createElement('div');
overlay.id = 'overlay';

// 创建控制兑换的按钮(集成启动和停止功能)
const controlExchangeButton = document.createElement('button');
controlExchangeButton.textContent = '启动兑换 ✔';
controlExchangeButton.className = 'controlExchange';


// 创建自动兑换按钮
const autoExchangeButton = document.createElement('button');
autoExchangeButton.textContent = '自动兑换 ✖';
autoExchangeButton.className = 'autoExchange';

// 创建下拉菜单元素,设置为多选模式(multiple属性)
const selectMenu = document.createElement('select');
selectMenu.setAttribute('multiple', 'multiple');

// 我只换了每种类型的第一个 再根据斗鱼的尿性推算的后面几个数字
const items = [
{ value: 'hahahahha', text: '请选择需要兑换的奖品' },
{ value: 'PROP_1', text: '3级粉丝牌 初级水手' },
{ value: 'PROP_2', text: '3级粉丝牌 精英士官' },
{ value: 'PROP_3', text: '6级粉丝牌 心动卡' },
{ value: 'FREE_PROP_1', text: '10 陪伴印章' },
{ value: 'FREE_PROP_2', text: '30 陪伴印章' },
{ value: 'FREE_PROP_3', text: '50 陪伴印章' },
{ value: 'YC_TY_1', text: '0.1 鱼翅' },
{ value: 'YC_TY_2', text: '0.5 鱼翅' },
{ value: 'YC_TY_3', text: '1 鱼翅' },
{ value: 'YW_1', text: '100 鱼丸' },
{ value: 'YW_2', text: '200 鱼丸' },
{ value: 'YW_3', text: '500 鱼丸' },
{ value: 'YC_CHIP_1', text: '2 鱼翅碎片' },
{ value: 'YC_CHIP_2', text: '5 鱼翅碎片' }
];

// 循环创建下拉菜单选项
items.forEach(item => {
const option = document.createElement('option');
option.value = item.value;
option.textContent = item.text;
selectMenu.appendChild(option);
});

overlay.appendChild(controlExchangeButton);
overlay.appendChild(autoExchangeButton);
overlay.appendChild(selectMenu);
document.body.appendChild(overlay);

// 用于记录鼠标按下时的坐标以及悬浮窗初始坐标
let startX, startY, offsetX, offsetY;

// 为悬浮窗添加鼠标按下事件监听器
overlay.addEventListener('mousedown', function (e) {
startX = e.pageX;
startY = e.pageY;
offsetX = overlay.offsetLeft;
offsetY = overlay.offsetTop;
document.addEventListener('mousemove', drag);
document.addEventListener('mouseup', stopDrag);
});

// 拖动时的处理函数
function drag(e) {
overlay.style.left = offsetX + e.pageX - startX + 'px';
overlay.style.top = offsetY + e.pageY - startY + 'px';
}

// 停止拖动的处理函数
function stopDrag() {
document.removeEventListener('mousemove', drag);
document.removeEventListener('mouseup', stopDrag);
}

// 用于存储当前选中的多个选项值的数组
let selectedIndexValues = [];

// 监听下拉菜单选项改变事件,更新选中的多个选项值
selectMenu.addEventListener('change', function () {
selectedIndexValues = Array.from(selectMenu.selectedOptions).map(option => option.value);
console.log(`目前选择的奖品:`, selectedIndexValues.map(value => {
const selectedOption = Array.from(selectMenu.options).find(opt => opt.value === value);
return selectedOption.textContent;
}));
});

// 用于控制兑换代码是否执行的标志变量,初始设为false表示未运行
let isRunning = false;

// 用于标记自动兑换功能是否开启,初始设为false
let autoExchangeEnabled = false;

// 显示悬浮窗
function showOverlay() {
overlay.style.display = 'block';
}

// 隐藏悬浮窗
function hideOverlay() {
overlay.style.display = 'none';
}

// 点击控制兑换按钮的处理函数
controlExchangeButton.addEventListener('click', function () {
if (isRunning) {
isRunning = false;
this.textContent = '启动兑换 ✔';
this.style.backgroundColor ='red';
console.log(`停止兑换 ${isRunning}`);
} else {
isRunning = true;
this.textContent = '停止兑换 ✖';
this.style.backgroundColor = 'green';
console.log(`开始兑换 ${isRunning}`);
runExchangeLoop();
}
});

// 点击自动兑换按钮的处理函数
autoExchangeButton.addEventListener('click', function () {
autoExchangeEnabled =!autoExchangeEnabled;
if (autoExchangeEnabled) {
this.textContent = '自动兑换中 ✔';
this.style.backgroundColor = 'green';
startAutoExchange();
} else {
this.textContent = '自动兑换 ✖';
this.style.backgroundColor = 'red';
stopAutoExchange();
}
});

// 获取当前时间的分钟和秒数
function getCurrentTime() {
const now = new Date();
const minutes = now.getMinutes();
const seconds = now.getSeconds();
return { minutes, seconds };
}

// 模拟兑换代码执行的函数(这里简化了之前的fetch请求,实际要替换成完整准确的)
async function exchange(selectedIndexValue) {
try {
const cookies = document.cookie;
const acf_ccn = cookies.split('; ').find(cookie => cookie.startsWith('acf_ccn='));
if (acf_ccn) {
let acf_ccnValue = acf_ccn.split('=')[1];
if (previousAcfCcnValue!== acf_ccnValue) {
console.log(`CtnID 已经刷新 \n 旧ID:${ctnid} \n 新ID:${acf_ccnValue}`);
previousAcfCcnValue = acf_ccnValue;
ctnid = acf_ccnValue;
}
}
console.log(`兑换请求属性设置 ctn=${ctnid}&rid=${roomid}&index=${selectedIndexValue}`);
await fetch("https://www.douyu.com/japi/revenuenc/web/actfans/convert/convertOpt", {
"headers": {
"accept": "application/json, text/plain, */*",
"accept-language": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7",
"content-type": "application/x-www-form-urlencoded",
"priority": "u=1, i",
"sec-ch-ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin"
},
"referrer": "https://www.douyu.com/pages/fish-act/shop",
"referrerPolicy": "strict-origin-when-cross-origin",
"body": `ctn=${ctnid}&rid=${roomid}&index=${selectedIndexValue}`,
"method": "POST",
"mode": "cors",
"credentials": "include"
});
} catch (error) {
console.error('兑换出现错误:', error);
}
await sleep(50); //0.1 秒运行一次 避免CPU占用过高崩溃
}

// 循环执行兑换代码的函数(根据标志变量控制)
async function runExchangeLoop() {
let count = 1;
let targetCount = 200 //0,1秒运行一次 10次=1秒 100次=10秒 默认200次= 20秒 建议在 59分50秒点击启动, 会在大约00分10~13秒结束
while (isRunning) {
for (const selectedIndexValue of selectedIndexValues) {
//await
exchange(selectedIndexValue);
}
await sleep(50);
console.log(`目前兑换请求发送次数 ${count}`);
count++;
updateControlExchangeButton(isRunning, targetCount - count);
if (count - 1 >= targetCount) {
isRunning = false;
updateControlExchangeButton(isRunning, targetCount - count);
}
}
}

let autoExchangeCount = 0;
let lastTriggerTime = 0;
const countdownElement = document.querySelector('div[class*="time--"]');

function autoExchangeObserver(callback) {
const targetNode = countdownElement; // 使用获取到的倒计时元素
//const targetNode = document.body;
const observer = new MutationObserver((mutationsList, observer) => {
const currentTime = performance.now();
const currentTtime = getCurrentTime();
console.log(`测试 ${currentTtime.seconds}`);
if (currentTime - lastTriggerTime >= 1000) {
lastTriggerTime = currentTime;
callback();
}
});
const config = {
characterData: true, // 监听文本节点内容变化,因为倒计时文本会改变
subtree: true, // 子树变化也监听,以防倒计时元素内部结构有变化影响文本显示
};
//const config = { attributes: true, childList: true, subtree: true };
observer.observe(targetNode, config);
}

autoExchangeObserver(autoExchangeCallback);

function autoExchangeCallback() {
const currentTime = getCurrentTime();
if (isInTimeRange() && autoExchangeEnabled) {
for (let i = 0; i < 20; i++) {
for (const selectedIndexValue of selectedIndexValues) {
console.log(`目前时间 ${currentTime.minutes}分${currentTime.seconds}秒 发送兑换请求(奖品:${selectedIndexValue})`);
exchange(selectedIndexValue);
console.log(`目前时间 ${currentTime.minutes}分${currentTime.seconds}秒 发送兑换请求结束(奖品:${selectedIndexValue})`);
}
}
} else {
autoExchangeCount++;
if (autoExchangeCount % 60 === 0) {
console.log(`自动兑换运行中 每分钟提示一次 ${autoExchangeCount / 60} 目前时间 ${currentTime.minutes}分${currentTime.seconds}秒`);
}
}
}

// 启动自动兑换循环
function startAutoExchange() {
//autoExchangeLoop();
autoExchangeCallback();
console.log(`开始自动兑换${autoExchangeEnabled}`);
}

// 停止自动兑换循环
function stopAutoExchange() {
autoExchangeEnabled = false;
console.log(`停止自动兑换${autoExchangeEnabled}`);
}

// 判断当前时间是否在指定时间区间内(59分58秒 - 00分05秒)
function isInTimeRange() {
const currentTime = getCurrentTime();
return (currentTime.minutes === 59 && currentTime.seconds >= 58) || (currentTime.minutes === 0 && currentTime.seconds <= 5);
}

// 简单的异步等待函数(以毫秒为单位)
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}

function updateControlExchangeButton(isRunning, countLeft) {
if (isRunning) {
controlExchangeButton.textContent = `停止兑换 ✖ 剩余请求 ${countLeft}`;
controlExchangeButton.style.backgroundColor = 'green';
} else {
controlExchangeButton.textContent = '启动兑换 ✔';
controlExchangeButton.style.backgroundColor ='red';
}
}

// 页面加载完成后显示悬浮窗
showOverlay();
}
})();

§
Postat în: 07-01-2025

好的 谢谢大佬

§
Postat în: 07-01-2025

肥肠好用

§
Postat în: 11-01-2025

啊 库存有的 不会自动刷新是啥, 应该是延迟功能又飘移了 之前测试过 在循环一定次数后, 延迟1秒 3秒 会变成1~60秒一次 导致无法卡点发送兑换请求, 我目前个人用的是做的另一个脚本 通过Ctrl 多选指定奖品后 自己卡点 58秒之类的 点击启动兑换 发送请求的循环也做了一些更改好像.. 看截图, 唔 忘记了心动卡1点钟有没有刷新, 反正昨晚卡点启动一次 全兑换完了 除了心动卡和1鱼翅 在1点钟的时候没刷新
自动兑换功能的话 因为之前的延迟功能有问题 修改成了检测倒计时元素的变化来检测(也是偶尔会出现问题 所以这个版本你暂时先用手动启动兑换的 有空再看看怎么改)
房间ID记得修改为你有粉丝牌高于3级的房间ID, 不一定要当前页面的ID, ctnID已经通过Cookies获取了 可以无视

// ==UserScript==
// @name 斗鱼鱼塘商城兑换工具(多选版)
// @namespace YourNamespaceHere
// @version 1.4
// @description 斗鱼鱼塘商城自动兑换工具 (注意手动设置个人用户ID以及房间号),支持下拉菜单多选兑换
// @match https://www.douyu.com/pages/fish-act/mine*
// @grant GM_addStyle
// @grant GM_xmlhttpRequest
// @license MIT
// ==/UserScript==

(function () {
'use strict';
// ---------- 重要 ----------//
let previousAcfCcnValue = null;
let ctnid = '112233'; ///用户ID 在发送请求的时候会自动在Cookies获取最新的ID
const roomid = '112233'; //房间ID

// 用于判断页面是否加载完成的标志变量
let pageLoaded = false;

// 监听页面加载状态改变事件
window.addEventListener('load', function () {
pageLoaded = true;
initScript();
});

// 初始化脚本的函数,在页面加载完成后执行具体操作
function initScript() {
// 添加悬浮窗样式
GM_addStyle(`
#overlay {
position: fixed;
top: 26%;
left: 50%;
transform: translate(-50%, -50%);
background-color: rgba(255, 255, 255, 0.9);
padding: 20px;
border-radius: 10px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
display: none;
z-index: 9999;
}

button {
margin: 5px;
padding: 10px 20px;
font-size: 16px;
cursor: pointer;
border: none;
border-radius: 5px;
}

button.controlExchange {
background-color: red;
color: white;
margin: 5px;
padding: 10px 20px;
font-size: 16px;
cursor: pointer;
border: none;
border-radius: 5px;
}

button.autoExchange {
background-color: red;
color: white;
margin: 5px;
padding: 10px 20px;
font-size: 16px;
cursor: pointer;
border: none;
border-radius: 5px;
}

select {
margin: 5px;
padding: 10px;
font-size: 16px;
border: 1px solid #ccc;
border-radius: 5px;
height: auto; /* 调整高度以适应多选展示 */
overflow-y: auto; /* 出现滚动条 */
width: 200px; /* 设置合适宽度 */
-webkit-appearance: none; /* 去除默认样式(webkit浏览器) */
-moz-appearance: none; /* 去除默认样式(firefox浏览器) */
appearance: none; /* 去除默认样式 */
}
`);

// 创建悬浮窗元素及按钮
const overlay = document.createElement('div');
overlay.id = 'overlay';

// 创建控制兑换的按钮(集成启动和停止功能)
const controlExchangeButton = document.createElement('button');
controlExchangeButton.textContent = '启动兑换 ✔';
controlExchangeButton.className = 'controlExchange';


// 创建自动兑换按钮
const autoExchangeButton = document.createElement('button');
autoExchangeButton.textContent = '自动兑换 ✖';
autoExchangeButton.className = 'autoExchange';

// 创建下拉菜单元素,设置为多选模式(multiple属性)
const selectMenu = document.createElement('select');
selectMenu.setAttribute('multiple', 'multiple');

// 我只换了每种类型的第一个 再根据斗鱼的尿性推算的后面几个数字
const items = [
{ value: 'hahahahha', text: '请选择需要兑换的奖品' },
{ value: 'PROP_1', text: '3级粉丝牌 初级水手' },
{ value: 'PROP_2', text: '3级粉丝牌 精英士官' },
{ value: 'PROP_3', text: '6级粉丝牌 心动卡' },
{ value: 'FREE_PROP_1', text: '10 陪伴印章' },
{ value: 'FREE_PROP_2', text: '30 陪伴印章' },
{ value: 'FREE_PROP_3', text: '50 陪伴印章' },
{ value: 'YC_TY_1', text: '0.1 鱼翅' },
{ value: 'YC_TY_2', text: '0.5 鱼翅' },
{ value: 'YC_TY_3', text: '1 鱼翅' },
{ value: 'YW_1', text: '100 鱼丸' },
{ value: 'YW_2', text: '200 鱼丸' },
{ value: 'YW_3', text: '500 鱼丸' },
{ value: 'YC_CHIP_1', text: '2 鱼翅碎片' },
{ value: 'YC_CHIP_2', text: '5 鱼翅碎片' }
];

// 循环创建下拉菜单选项
items.forEach(item => {
const option = document.createElement('option');
option.value = item.value;
option.textContent = item.text;
selectMenu.appendChild(option);
});

overlay.appendChild(controlExchangeButton);
overlay.appendChild(autoExchangeButton);
overlay.appendChild(selectMenu);
document.body.appendChild(overlay);

// 用于记录鼠标按下时的坐标以及悬浮窗初始坐标
let startX, startY, offsetX, offsetY;

// 为悬浮窗添加鼠标按下事件监听器
overlay.addEventListener('mousedown', function (e) {
startX = e.pageX;
startY = e.pageY;
offsetX = overlay.offsetLeft;
offsetY = overlay.offsetTop;
document.addEventListener('mousemove', drag);
document.addEventListener('mouseup', stopDrag);
});

// 拖动时的处理函数
function drag(e) {
overlay.style.left = offsetX + e.pageX - startX + 'px';
overlay.style.top = offsetY + e.pageY - startY + 'px';
}

// 停止拖动的处理函数
function stopDrag() {
document.removeEventListener('mousemove', drag);
document.removeEventListener('mouseup', stopDrag);
}

// 用于存储当前选中的多个选项值的数组
let selectedIndexValues = [];

// 监听下拉菜单选项改变事件,更新选中的多个选项值
selectMenu.addEventListener('change', function () {
selectedIndexValues = Array.from(selectMenu.selectedOptions).map(option => option.value);
console.log(`目前选择的奖品:`, selectedIndexValues.map(value => {
const selectedOption = Array.from(selectMenu.options).find(opt => opt.value === value);
return selectedOption.textContent;
}));
});

// 用于控制兑换代码是否执行的标志变量,初始设为false表示未运行
let isRunning = false;

// 用于标记自动兑换功能是否开启,初始设为false
let autoExchangeEnabled = false;

// 显示悬浮窗
function showOverlay() {
overlay.style.display = 'block';
}

// 隐藏悬浮窗
function hideOverlay() {
overlay.style.display = 'none';
}

// 点击控制兑换按钮的处理函数
controlExchangeButton.addEventListener('click', function () {
if (isRunning) {
isRunning = false;
this.textContent = '启动兑换 ✔';
this.style.backgroundColor ='red';
console.log(`停止兑换 ${isRunning}`);
} else {
isRunning = true;
this.textContent = '停止兑换 ✖';
this.style.backgroundColor = 'green';
console.log(`开始兑换 ${isRunning}`);
runExchangeLoop();
}
});

// 点击自动兑换按钮的处理函数
autoExchangeButton.addEventListener('click', function () {
autoExchangeEnabled =!autoExchangeEnabled;
if (autoExchangeEnabled) {
this.textContent = '自动兑换中 ✔';
this.style.backgroundColor = 'green';
startAutoExchange();
} else {
this.textContent = '自动兑换 ✖';
this.style.backgroundColor = 'red';
stopAutoExchange();
}
});

// 获取当前时间的分钟和秒数
function getCurrentTime() {
const now = new Date();
const minutes = now.getMinutes();
const seconds = now.getSeconds();
return { minutes, seconds };
}

// 模拟兑换代码执行的函数(这里简化了之前的fetch请求,实际要替换成完整准确的)
async function exchange(selectedIndexValue) {
try {
const cookies = document.cookie;
const acf_ccn = cookies.split('; ').find(cookie => cookie.startsWith('acf_ccn='));
if (acf_ccn) {
let acf_ccnValue = acf_ccn.split('=')[1];
if (previousAcfCcnValue!== acf_ccnValue) {
console.log(`CtnID 已经刷新 \n 旧ID:${ctnid} \n 新ID:${acf_ccnValue}`);
previousAcfCcnValue = acf_ccnValue;
ctnid = acf_ccnValue;
}
}
console.log(`兑换请求属性设置 ctn=${ctnid}&rid=${roomid}&index=${selectedIndexValue}`);
await fetch("https://www.douyu.com/japi/revenuenc/web/actfans/convert/convertOpt", {
"headers": {
"accept": "application/json, text/plain, */*",
"accept-language": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7",
"content-type": "application/x-www-form-urlencoded",
"priority": "u=1, i",
"sec-ch-ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin"
},
"referrer": "https://www.douyu.com/pages/fish-act/shop",
"referrerPolicy": "strict-origin-when-cross-origin",
"body": `ctn=${ctnid}&rid=${roomid}&index=${selectedIndexValue}`,
"method": "POST",
"mode": "cors",
"credentials": "include"
});
} catch (error) {
console.error('兑换出现错误:', error);
}
await sleep(50); //0.1 秒运行一次 避免CPU占用过高崩溃
}

// 循环执行兑换代码的函数(根据标志变量控制)
async function runExchangeLoop() {
let count = 1;
let targetCount = 200 //0,1秒运行一次 10次=1秒 100次=10秒 默认200次= 20秒 建议在 59分50秒点击启动, 会在大约00分10~13秒结束
while (isRunning) {
for (const selectedIndexValue of selectedIndexValues) {
//await
exchange(selectedIndexValue);
}
await sleep(50);
console.log(`目前兑换请求发送次数 ${count}`);
count++;
updateControlExchangeButton(isRunning, targetCount - count);
if (count - 1 >= targetCount) {
isRunning = false;
updateControlExchangeButton(isRunning, targetCount - count);
}
}
}

let autoExchangeCount = 0;
let lastTriggerTime = 0;
const countdownElement = document.querySelector('div[class*="time--"]');

function autoExchangeObserver(callback) {
const targetNode = countdownElement; // 使用获取到的倒计时元素
//const targetNode = document.body;
const observer = new MutationObserver((mutationsList, observer) => {
const currentTime = performance.now();
const currentTtime = getCurrentTime();
console.log(`测试 ${currentTtime.seconds}`);
if (currentTime - lastTriggerTime >= 1000) {
lastTriggerTime = currentTime;
callback();
}
});
const config = {
characterData: true, // 监听文本节点内容变化,因为倒计时文本会改变
subtree: true, // 子树变化也监听,以防倒计时元素内部结构有变化影响文本显示
};
//const config = { attributes: true, childList: true, subtree: true };
observer.observe(targetNode, config);
}

autoExchangeObserver(autoExchangeCallback);

function autoExchangeCallback() {
const currentTime = getCurrentTime();
if (isInTimeRange() && autoExchangeEnabled) {
for (let i = 0; i < 20; i++) {
for (const selectedIndexValue of selectedIndexValues) {
console.log(`目前时间 ${currentTime.minutes}分${currentTime.seconds}秒 发送兑换请求(奖品:${selectedIndexValue})`);
exchange(selectedIndexValue);
console.log(`目前时间 ${currentTime.minutes}分${currentTime.seconds}秒 发送兑换请求结束(奖品:${selectedIndexValue})`);
}
}
} else {
autoExchangeCount++;
if (autoExchangeCount % 60 === 0) {
console.log(`自动兑换运行中 每分钟提示一次 ${autoExchangeCount / 60} 目前时间 ${currentTime.minutes}分${currentTime.seconds}秒`);
}
}
}

// 启动自动兑换循环
function startAutoExchange() {
//autoExchangeLoop();
autoExchangeCallback();
console.log(`开始自动兑换${autoExchangeEnabled}`);
}

// 停止自动兑换循环
function stopAutoExchange() {
autoExchangeEnabled = false;
console.log(`停止自动兑换${autoExchangeEnabled}`);
}

// 判断当前时间是否在指定时间区间内(59分58秒 - 00分05秒)
function isInTimeRange() {
const currentTime = getCurrentTime();
return (currentTime.minutes === 59 && currentTime.seconds >= 58) || (currentTime.minutes === 0 && currentTime.seconds <= 5);
}

// 简单的异步等待函数(以毫秒为单位)
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}

function updateControlExchangeButton(isRunning, countLeft) {
if (isRunning) {
controlExchangeButton.textContent = `停止兑换 ✖ 剩余请求 ${countLeft}`;
controlExchangeButton.style.backgroundColor = 'green';
} else {
controlExchangeButton.textContent = '启动兑换 ✔';
controlExchangeButton.style.backgroundColor ='red';
}
}

// 页面加载完成后显示悬浮窗
showOverlay();
}
})();




不知道是不是被斗鱼检测到了,这两天这个兑换兑换不出太多东西了。
点了不限量的物品试了试,看兑换记录大概是从整点第4秒才开始兑换,哪怕提前点也没用,前面发送的兑换请求貌似都被斗鱼吞了

Postează un raspuns

Autentifică-te pentru a posta un răspuns.