|
本帖最后由 源子 于 2024-11-23 18:03 编辑
前情提要:血液批量献祭油猴脚本——合理避税,从我做起
避税的原理不再过多赘述,之前的脚本只是随手写的,有种力大砖飞的美感,也就可能随机吞掉你几次兑换量罢了。另外操作界面还是太复杂了,还要看使用说明才知道怎么用,这样不好不好。@Name
本次脚本主要有以下几项改动:
1、本次的2.0版本不再采用模拟点击的方式,直接在后端提交请求,实现了数量更精准的献祭。
2、兑换界面与泥潭原页面基本一致,仅将兑换按钮的文本修改成了“批量兑换”,方便区分脚本是否成功运行。
3、新增了提示文本,方便直观比较税前税后价。
已知BUG:因为浮点计算的问题,泥潭的计算公式在计算某些数值时会出现误差。例如兑换100旅程,实际应该消耗3450血液,但是泥潭的计算公式错误地计算成了3449。虽然无伤大雅,但是如果管理看到这里的话可以考虑修改一下计算公式,先将税率0.15放大100倍,计算完成后再截位,规避浮点计算,就不会出现这种问题。不过这跟咱的脚本没啥关系,咱们逃税只需要3400。
使用说明:最好的使用说明就是没有使用说明!看看这个界面,还需要我说明什么吗!只管放心大胆地填,逃税的事就交给脚本去执行!
万一被抓,逃税是脚本做的,关我周树人什么事?
PS:楼主的血液量较少,测试量不足,如果使用过程发现有什么BUG,不妨给楼主点个免费的评分补点血,才能更好地修BUG,这不是骗赞,真的不是骗赞!
逃税完成展示:
用了chatGPT重构了变量名并添加注释,方便有志之士复用,不得不说chatGPT在这方面真挺方便的,让我打那么老长一段变量名那可真是会要老命的
- // ==UserScript==
- // @name 批量血液献祭2.0
- // @namespace http://tampermonkey.net/
- // @version 2.0
- // @description 替换原网页功能,批量血液献祭
- // @match https://www.gamemale.com/home.php?mod=spacecp&ac=credit&op=exchange
- // @author 源子
- // ==/UserScript==
- (function() {
- 'use strict';
- function showInfo(message) {
- console.log(message); // 输出到控制台
- showError(message); // 在前端显示消息
- }
- // 获取表单元素
- const form = document.querySelector('#exchangeform'); // 兑换表单
- const submitButton = document.querySelector('#exchangesubmit_btn'); // 提交按钮
- const exchangeAmountInput = document.querySelector('#exchangeamount'); // 兑换数量输入框
- const toCreditsSelect = document.querySelector('#tocredits'); // 目标积分选择框
- const taxPercentDisplay = document.querySelector('#taxpercent'); // 显示原价、含税价和现价的区域
- const exchangedesamountInput = document.querySelector('#exchangedesamount'); // 现价显示框
- const TAX_RATE = 0.15; // 税率为 15%
- // 禁用网页自带的 exchangecalcredit 计算逻辑
- exchangeAmountInput.removeAttribute('onkeyup');
- toCreditsSelect.removeAttribute('onchange');
- // 设置提交按钮文本为“批量兑换”
- if (submitButton) {
- const buttonText = submitButton.querySelector('em');
- if (buttonText) {
- buttonText.textContent = "批量兑换";
- }
- }
- // 更新显示原价、含税价和现价的函数
- function updatePriceDisplay() {
- const exchangeAmount = parseInt(exchangeAmountInput.value) || 1;
- const selectedOption = toCreditsSelect.options[toCreditsSelect.selectedIndex];
- const ratio = parseFloat(selectedOption.getAttribute('ratio'));
- const originalPrice = exchangeAmount * ratio; // 原价
- const taxIncludedUnitPrice = Math.floor(ratio * (1 + TAX_RATE)); // 含税单价取整
- const finalPrice = Math.floor(originalPrice * (1 + TAX_RATE)); // 含税总价
- const roundedTotalPrice = taxIncludedUnitPrice * exchangeAmount; // 现价:含税单价的整数部分乘数量
- // 更新税率显示区域,显示原价、 泥潭含税价和逃税价
- taxPercentDisplay.textContent = `原价: ${originalPrice}, 泥潭含税价: ${finalPrice}, 逃税价: ${roundedTotalPrice}`;
- exchangedesamountInput.value = roundedTotalPrice;
- }
- // 添加监听器以在输入和选择变化时更新价格显示
- exchangeAmountInput.addEventListener('input', updatePriceDisplay);
- toCreditsSelect.addEventListener('change', updatePriceDisplay);
- // 替换提交按钮行为
- function replaceSubmitButton() {
- if (submitButton) {
- submitButton.onclick = (event) => {
- event.preventDefault(); // 阻止默认提交
- submitFormMultipleTimes(); // 调用自定义的提交函数
- };
- showInfo("兑换功能已升级为批量兑换");
- } else {
- console.warn("未找到提交按钮,检查选择器是否正确");
- }
- }
- // 多次提交
- async function submitFormMultipleTimes() {
- const repeatCount = parseInt(exchangeAmountInput.value) || 1;
- const actionUrl = form.action;
- const headers = {
- "User-Agent": "Mozilla/5.0",
- "Cookie": document.cookie
- };
- const exchangeAmount = parseInt(exchangeAmountInput.value) || 1;
- const totalExchangeAmount = exchangeAmount * repeatCount; // 总兑换量
- let successCount = 0; // 初始化成功次数计数器
- for (let i = 0; i < repeatCount; i++) {
- try {
- const formData = new FormData(form);
- formData.set('exchangeamount', 1); // 每次提交的 exchangeamount 值设为 1
- const response = await fetch(actionUrl, {
- method: 'POST',
- headers: headers,
- body: formData,
- });
- if (!response.ok) {
- console.error(`兑换失败:第${i + 1}次`);
- } else {
- successCount++; // 增加成功计数
- showInfo(`兑换成功:第${i + 1}次`);
- }
- } catch (error) {
- console.error(`兑换错误:第${i + 1}次`, error);
- }
- }
- // 延时 1 秒提示兑换总量、成功次数并刷新页面
- setTimeout(() => {
- alert(`兑换完成!成功次数/兑换量:${successCount}/${repeatCount},获得${toCreditsSelect.options[toCreditsSelect.selectedIndex].getAttribute('title')}:${successCount},消耗血液:${exchangedesamountInput.value}`);
- location.reload();
- }, 1000); // 延时 1 秒
- }
- // 初始化替换按钮
- replaceSubmitButton();
- // 初始化价格显示
- updatePriceDisplay();
- })();
复制代码
最后附上一个乞讨用的附件,走过路过不要错过~
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
查看全部评分
|