Auto fishing

Fish with all your pets in one click

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Auto fishing
// @namespace    neopets
// @version      2021.02.01
// @author       jiejie
// @description  Fish with all your pets in one click
// @match        http://www.neopets.com/water/fishing.phtml
// ==/UserScript==

const $form = $("form[action='/water/fishing.phtml']");

$form.css({"height": "250px"}).before(`<button id="fish-all" class="button-default__2020 button-green__2020 btn-single__2020" type="button">Fish all</button>`);

$("#fish-all").on("click", async function () {

    const delay = (min, max) => Math.floor(Math.random() * max) + min;

    $(this)
    .prop("disabled", true)
    .toggleClass("button-green__2020")
    .toggleClass("button-purple__2020")
    .html(`Processing...`);

    $form.html(`
<style>
    #fish-result {
        margin: auto;
        text-align: center;
        border-collapse: collapse;
        border: 1px solid black;
    }
    #fish-result th, td {
        padding: 5px;
    }
    #fish-result tbody tr:nth-child(odd) {
        background-color : #dfdfdf;
    }
</style>
<table id="fish-result">
    <thead>
    <tr>
        <th style="width: 150px;">Pet</th>
        <th style="width: 250px">Item</th>
        <th style="width: 150px">Skill level up?</th>
    </tr>
    </thead>
    <tbody></tbody>
</table>
`);

    const refck = $("body").html().match(/"_ref_ck":'(.{32})'/)[1];

    $(this).html("Getting pet list...");
    const pets = await getPetNames();

    for (let i = 0; i < pets.length; i++) {

        $(this).html(`${pets[i]} fishing...`);
        const outcome = await goFish(pets[i]);

        $("#fish-result tbody").append(outcome);

        $(this).html(`Switching active pet...`);

        if (pets.length === 1) {
            // No need to switch pets if only one pet
            break;
        }

        if (i < pets.length - 1) {
            // Not last pet yet, switch to next pet
            await changePet(pets[i + 1]);
        } else {
            // Reached last pet, switch back to first pet
            await changePet(pets[0]);
        }

    }

    $(this)
    .html("Done!")
    .toggleClass("button-purple__2020")
    .toggleClass("button-green__2020");


    //-------------------------------------------------------------------------
    // Functions
    //-------------------------------------------------------------------------


    function getPetNames() {
        return new Promise(resolve => {
            $.ajax({
                type: "GET",
                url: "/index.phtml",
                success: data => {
                    const response = $.parseHTML(data);
                    let pets = [];
                    $(response).find(".hp-carousel-pet").each(function (index, element) {
                        const petname = $(element).attr("data-name");
                        pets.push(petname);
                    });
                    resolve(pets);
                }
            });
        });
    }

    function changePet(pet) {
        return new Promise(resolve => {
            setTimeout(() => {
                $.ajax({
                    type: "POST",
                    url: "/np-templates/ajax/changepet.php",
                    data: {
                        "_ref_ck": refck,
                        "new_active_pet": pet
                    },
                    success: data => {
                        const response = JSON.parse(data);
                        if (response["error"] === false) {
                            resolve();
                        }
                    }
                });
            }, delay(100, 500));
        })
    }

    function goFish(pet) {
        return new Promise(resolve => {
            setTimeout(() => {
                $.ajax({
                    type: "POST",
                    url: "/water/fishing.phtml",
                    data: {"go_fish": "1"},
                    success: data => {
                        const response = $.parseHTML(data);
                        const outcome = $(response).find(".page-title__2020 ~ p").text();

                        const item = outcome.match(/\.{3}(.+?)!/)[1];
                        const level = (() => {
                            let lvlup;
                            try {
                                lvlup = outcome.match(/increases to (\d+)/)[1];
                            } catch (e) {
                                lvlup = "-";
                            }
                            return lvlup;
                        })();

                        resolve(`<tr><td><b>${pet}</b></td><td>${item}</td><td>${level}</td></tr>`);
                    }
                });
            }, delay(100, 500));
        })
    }

});