Neopets Auto-haggler

Neopets autohaggler

  1. // ==UserScript==
  2. // @name Neopets Auto-haggler
  3. // @version 2.0.1
  4. // @namespace npm
  5. // @description Neopets autohaggler
  6. // @Match http://www.neopets.com/haggle.phtml*
  7. // @Match http://www.neopets.com/haggle.phtml
  8. // @include http://www.neopets.com/objects.phtml?obj_type=*&type=shop
  9. // @include http://www.neopets.com/objects.phtml?type=shop&obj_type=*
  10. // ==/UserScript==
  11.  
  12. var url = document.URL;
  13. var OCR = true;
  14. var return_ab = true;
  15. var min = 800;
  16. var max = 1500;
  17.  
  18. function solve_captcha(url) {
  19. return new Promise( resolve => {
  20. var captcha = new Image();
  21. captcha.src = url;
  22. captcha.onload = () => {
  23. var width = captcha.width;
  24. var height = captcha.height;
  25.  
  26. var canvas = unsafeWindow.document.createElement('canvas');
  27. canvas.width = width;
  28. canvas.height = width;
  29. canvas.getContext("2d").drawImage(captcha, 0, 0);
  30.  
  31. var imgData = canvas.getContext("2d").getImageData(0, 0, width, height);
  32. var lowy = 999;
  33. var lowx = 999;
  34. var low = 999;
  35.  
  36. for (var x = 0; x < imgData.width; x++){
  37. for (var y = 0; y < imgData.height; y++){
  38. var i = x*4+y*4*imgData.width;
  39. var avg = Math.floor((imgData.data[i]+imgData.data[i+1]+imgData.data[i+2])/3);
  40. if (avg < low){
  41. low = avg;
  42. lowx = x;
  43. lowy = y;
  44. }
  45. }
  46. }
  47. resolve({lowx, lowy});
  48. };
  49. });
  50. }
  51.  
  52. function smart_haggle(haggle_price){
  53. console.log('haggle_price', haggle_price);
  54. var val = new Array(2);
  55. val[0] = haggle_price.substr(0, 1);
  56. val[1] = haggle_price.substr(1, 1);
  57. console.log('val0', val[0]);
  58. console.log('val1', val[1]);
  59.  
  60. var x = 0;
  61. var end_price = "";
  62.  
  63. for(x=0; x<haggle_price.length; x++){
  64. end_price += val[(x%2)];
  65. }
  66. return end_price;
  67. }
  68.  
  69. (async () => {
  70. var $;
  71. if (typeof $ === 'undefined') $ = unsafeWindow.$;
  72.  
  73. const html = $('html').html();
  74.  
  75. if(url === 'http://www.neopets.com/haggle.phtml'){
  76. if(return_ab) $.find('input[type="submit"]')[1].click();
  77. return;
  78. }
  79.  
  80. if(url.includes('objects.phtml')){
  81. var content = $('table[align="center"][cellpadding="4"][border="0"]').get(0);
  82. $(content).find('tr').each((index, tr) => {
  83.  
  84. $(tr).find('td').each((index, td) => {
  85. const b = $(td).find('b').first().html();
  86. if(b === 'Toy Train'){
  87. $(td).remove();
  88. } else {
  89. $(td).find('a').first().removeAttr('onclick');
  90. }
  91. });
  92.  
  93. });
  94. return;
  95. }
  96.  
  97. if(url.includes('haggle.phtml')){
  98.  
  99. if(html.includes('SOLD OUT!')){
  100. if(return_ab) $.find('input[type="submit"]')[1].click();
  101. return;
  102. }
  103.  
  104. var haggle_price = $('#shopkeeper_makes_deal').find('b').get(0).innerHTML;
  105. haggle_price = (haggle_price.match("([0-9-,]+)")[0]).replace(",", "");
  106. $('input[name=current_offer]').val(smart_haggle(haggle_price));
  107.  
  108. if(OCR){
  109. const {lowx: x, lowy: y} = await solve_captcha(document.querySelector('input[type="image"]').src);
  110. setTimeout(()=> {
  111. var haggleform = document.querySelector('form[name="haggleform"]');
  112. var newInput = document.createElement("input");
  113. var newInput2 = document.createElement("input");
  114.  
  115. newInput.type="hidden";
  116. newInput.name="x";
  117. newInput.value=x;
  118. haggleform.appendChild(newInput);
  119.  
  120. newInput2.type="hidden";
  121. newInput2.name="y";
  122. newInput2.value=y;
  123. haggleform.appendChild(newInput2);
  124. haggleform.submit();
  125. }, (min, max) => { return Math.floor(Math.random() * (max - min + 1)) + min; });
  126. }
  127. return;
  128. }
  129. })();