Neopets Auto-haggler

Neopets autohaggler

当前为 2019-11-28 提交的版本,查看 最新版本

// ==UserScript==
// @name        Neopets Auto-haggler
// @version     2.0.0
// @namespace   npm
// @description Neopets autohaggler
// @Match       http://www.neopets.com/haggle.phtml*
// @Match       http://www.neopets.com/haggle.phtml
// @include     http://www.neopets.com/objects.phtml?obj_type=*&type=shop
// @include     http://www.neopets.com/objects.phtml?type=shop&obj_type=*
// ==/UserScript==

var url = document.URL;
var OCR = true;
var return_ab = true;
var min = 700;
var max = 1500;

function solve_captcha(url, callback) {
    var captcha = new Image();
    captcha.src = url;
    captcha.onload = function(){
        var width = captcha.width;
        var height = captcha.height;

        var canvas = unsafeWindow.document.createElement('canvas');
        canvas.width = width;
        canvas.height = width;
        canvas.getContext("2d").drawImage(captcha, 0, 0);

        var imgData = canvas.getContext("2d").getImageData(0, 0, width, height);
        var lowy = 999;
        var lowx = 999;
        var low = 999;

        for (var x = 0; x < imgData.width; x++){
            for (var y = 0; y < imgData.height; y++){
              var i = x*4+y*4*imgData.width;
            var avg = Math.floor((imgData.data[i]+imgData.data[i+1]+imgData.data[i+2])/3);
            if (avg < low){
                low = avg;
              lowx = x;
              lowy = y;
            }
          }
        }
        callback(lowx, lowy);
    };
}

function smart_haggle(haggle_price){
    var val = new Array(2);
    val[0] = haggle_price.substr(0, 1);
    val[1] = haggle_price.substr(1, 1);

    var x = 0;
    var end_price = "";

    for(x=0; x<haggle_price.length; x++){
        end_price += val[(x%2)];
    }
    return end_price;
}

(function () {
    var $;
    if (typeof $ === 'undefined') $ = unsafeWindow.$;

    if(url === 'http://www.neopets.com/haggle.phtml'){
        if(return_ab) $.find('input[type="submit"]')[1].click();
        return;
    }

    if(url.includes('objects.phtml')){
       var content = $('table[align="center"][cellpadding="4"][border="0"]').get(0);
       $(content).find('tr').each((index, tr) => {
           $(tr).find('td').each((index, td) => {
                $(td).find('a').each((index, a) => {
                    $(a).removeAttr('onclick');
                });
           });
       });
       return;
    }

    if(url.includes('haggle.phtml')){
        var haggle_price = $('#shopkeeper_makes_deal').find('b').get(0).innerHTML;
        haggle_price = (haggle_price.match("([0-9-,]+)")[0]).replace(",", "");
        $('input[name=current_offer]').val(smart_haggle(haggle_price));

        if(OCR){
            solve_captcha(document.querySelector('input[type="image"]').src, function(x, y) {
                setTimeout(()=> {
                    var haggleform = document.querySelector('form[name="haggleform"]');
                    var newInput = document.createElement("input");
                    var newInput2 = document.createElement("input");

                    newInput.type="hidden";
                    newInput.name="x";
                    newInput.value=x;
                    haggleform.appendChild(newInput);

                    newInput2.type="hidden";
                    newInput2.name="y";
                    newInput2.value=y;
                    haggleform.appendChild(newInput2);
                    haggleform.submit();
                }, (min, max) => { return Math.floor(Math.random() * (max - min + 1)) + min; });
            });
        }
        return;
    }

})();