Greasy Fork 支持简体中文。

Acfun ThrowBanana

一键5蕉

// ==UserScript==
// @name         Acfun ThrowBanana
// @namespace    http://tampermonkey.net/
// @icon         https://tx-free-imgs.acfun.cn/content/2020_4_5/1.5860178587515075E9.png
// @version      1.3.1
// @description  一键5蕉
// @author       zyl315
// @match        *://www.acfun.cn/u/*
// @require      http://cdn.bootcss.com/jquery/1.8.3/jquery.min.js
// @grant        none
// @license MIT
// ==/UserScript==

(function () {
    'use strict';
    addView();
})();

async function addView() {
    let button = '<button id="throw-button" value="0" style="display:none;position: absolute;top: 22px;left: 245px;border: 1px solid #fd4c5d;border-radius: 5px;background: #fff;color: #fd4c5d;;">一键5蕉</button>'
    $('.ac-space-contribute-list').css('position', 'relative');
    $('.ac-space-contribute-list').append(button);
    $('#throw-button').click(function () {
        throwBanana();
    });
    let currentBananaNum = await getCurrentBananaNum();
    setButtonStatus('show', '', currentBananaNum);
}

async function throwBanana() {
    let lastBananaNum = $('#throw-button').val();
    await beginThrowBanana();
    let currentBananaNum = await getCurrentBananaNum();
    setButtonStatus('show', '', currentBananaNum);
    alert(`投蕉完毕!\n总共消费${lastBananaNum - currentBananaNum}根香蕉`)
}

function hint(bananaNum) {
    alert(`投蕉完毕!\n总共消费${bananaNum}根香蕉`)
}

function setButtonStatus(type, info = "", bananaNum = 0) {
    switch (type) {
        case 'show':
            $('#throw-button').show();
            $('#throw-button').val(bananaNum);
            $('#throw-button').html(`一键5蕉(${bananaNum})`);
            $('#throw-button').removeAttr("disabled");
            $('#throw-button').css("cursor", "pointer");
            break;
        case 'hide':
            $('#throw-button').hide();
            break
        case 'throw':
            $('#throw-button').html(info);
            $('#throw-button').attr("disabled", 'disabled');
            $('#throw-button').css("cursor", "wait");
            break;
    }
}

// 获取当前页面所有视频或文章的链接,AC号
function getUrllList() {
    let urlList = [];
    $('.tag-content.active a').each(function () {
        let url = $(this).attr("href");
        if (url != null) {
            urlList.push(url);
        }
    })
    return urlList;
}

// 获取用户的香蕉数
async function getCurrentBananaNum() {
    return new Promise((resolve, reject) => {
        $.ajax({
            url: "https://www.acfun.cn/rest/pc-direct/user/personalInfo",
            success: function (data) {
                let bananaNum = data.info['banana'];
                resolve(bananaNum);
            },
            error: function () {
                reject("error")
            }
        })
    });
}

// 投香蕉
async function beginThrowBanana() {
    let urlList = getUrllList();
    let count = 0;
    for (let i = 0; i < urlList.length; i++) {
        setButtonStatus('throw', `努力投蕉中 ${i}/${urlList.length}`);
        let data = {
            resourceId: '',
            count: 5,
            resourceType: ''
        };
        let item = urlList[i].split("/");
        data['resourceId'] = item[2].substring(2);
        switch (item[1]) {
            case 'v':
                data['resourceType'] = 2;
                break;
            case 'a':
                data['resourceType'] = 3;
                break;
        }
        let result = await new Promise((resolve, reject) => {
            setTimeout(function () {
                $.ajax({
                    url: "https://www.acfun.cn/rest/pc-direct/banana/throwBanana",
                    data: data,
                    type: 'post',
                    async: false,
                    success: function (response) {
                        if (response['result'] == 0) {
                            resolve(true);
                        } else {
                            resolve(false);
                        }
                    },
                    error: function () {
                        reject(false);
                    }
                })
            })
        });
        if (result) count++;
        // 投蕉频率太快就会失败,因此延迟0.9s,0.9几乎是最小时间间隔了
        await sleep(900);
    };
    return count;
}

async function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}