Advertisement
ZergLurker

Untitled

Jun 11th, 2016
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name            * Tribalwars Farm
  3. // @namespace       * Tribalwars Farm
  4. // @description     * Farm script for iMacros with anticaptcha
  5. // @author      Spieler84
  6. // ==/UserScript==
  7.  
  8.  
  9. // Задержки - Delays
  10. var delay_cycle = 900;          // пауза между циклами фарма, с. delay between cycles, seconds
  11. var delay_cycle_delta = [0, 120];   // доп. пауза между циклами, с. additional delay, seconds
  12. var delay_village = 1;          // пауза между деревнями, с. delay between villages, seconds
  13. var delay_village_delta = [0, 1];   // доп. пауза между деревнями, с. additional delay, seconds
  14. var delay_btn = 300;            // пауза между кликами, мс. delay between FA clicks, milliseconds
  15. var delay_btn_delta = [50, 300];    // доп. пауза между кликами, мс. additional delay, milliseconds
  16.  
  17. // Настройки военного советника - FA setup
  18. var max_btn_count = 100;        // количество деревень на страницу в настройках ВС, number of villages per FA page
  19. var max_FA_depth = 1;           // на сколько страниц можно углубиться (0 - без переходов), number of FA pages to dive in
  20. var light_farm_size = 1;        // размер отряда ЛК. number of Light Cavalry set at button "A"
  21. var Next_btn_txt = "Continue";      // текст на кнопке ввода капчи. Text of the capcha submit button
  22.  
  23.  
  24. // Настройки сервиса antigate - antigate setup
  25. var api_key = "c331c5a46b31c446f977baa6e14f60b2";   // ваш api-ключ, antigate key
  26. var captcha_min_len = 6;    // минимальный размер капчи, min size of capcha
  27. var captcha_max_len = 6;    // максимальный размер капчи, max size of capcha
  28.  
  29. // Общие настройки - General setup
  30. const base_url = "https://ru41.voyna-plemyon.ru/game.php?"; // для присмотра добавится параметр t, например
  31.                                // "http://ru23.voyna-plemyon.ru/game.php?t=2342321&" (for sitter)
  32. //const base_url = "ru22.voyna-plemyon.ru/game.php?t=589108&";
  33.  
  34. var start_type = 2; // 1 - автоматически фармит со всех деревень. start from any page - farm from all villages
  35.             // 2 - нужно вручную перейти в Обзор-Комбинированный и выбрать группу деревень, start from overview
  36.             // 3 - вручную указываются ссылки на советника, manual FA setup
  37.  
  38. var res = "";
  39. var jsNewLine="\n";
  40. var i=0;
  41. var num_villages = 0;
  42. var href_villages = [];
  43. var dd;
  44. var regAttack = new RegExp("Attack");
  45.  
  46. const XMLHttpRequest = Components.Constructor("@mozilla.org/xmlextras/xmlhttprequest;1");
  47.  
  48. var xmlHttp=createXmlHttpRequestObject();
  49. function createXmlHttpRequestObject()
  50. {
  51.     var xmlHttp;
  52.    
  53.     try
  54.     {
  55.         xmlHttp=new XMLHttpRequest();
  56.     }
  57.     catch(e)
  58.     {
  59.         var XMLHttpVersions = new Array("MSXML2.XMLHTTP.6.0",
  60.                                       "MSXML2.XMLHTTP.5.0",
  61.                                       "MSXML2.XMLHTTP.4.0",
  62.                                       "MSXML2.XMLHTTP.3.0",
  63.                                       "MSXML2.XMLHTTP",
  64.                                       "Microsoft.XMLHTTP");
  65.                                  
  66.         for (var i=0; i < 6 && !xmlHttp; i++)
  67.         {
  68.             try
  69.             {
  70.                 xmlHttp= new ActiveXObject(XmlHttpVersions[i]);
  71.             }
  72.             catch(e) {}
  73.         }
  74.     }
  75.     if (!xmlHttp)
  76.         alert("error of creating XMLHttpRequest");
  77.     else
  78.         return xmlHttp;
  79. }
  80.  
  81. function postUrl(path, params)
  82. {
  83.   res = "";
  84.   var req = new XMLHttpRequest();
  85.     if (xmlHttp)
  86.     {    
  87.         try
  88.         {
  89.             req.open("POST", path, false); // синхронно и не паримся
  90.             req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  91.             req.send(params);  
  92.             res = req.responseText;
  93.         }
  94.         catch (e)
  95.         {
  96.             alert("Не удалось соединиться с сервером:\n" + e.toString());    
  97.         }  
  98.     }
  99. }
  100.  
  101.  
  102. function getBase64Image(img)
  103. {
  104.     // создаем канвас
  105.     var canvas = window.content.document.createElement("canvas");
  106.     canvas.width = img.width;
  107.     canvas.height = img.height;
  108.  
  109.     // Копируем изображение на канвас
  110.     var ctx = canvas.getContext("2d");
  111.     ctx.drawImage(img, 0, 0);
  112.  
  113.     // Получаем data-URL отформатированную строку
  114.     var dataURL = canvas.toDataURL("image/png");
  115.  
  116.     return encodeURIComponent(dataURL.replace(/^data:image\/(png);base64,/, ""));
  117. }
  118.  
  119. function getBase64ImageById(id)
  120. {
  121.    return getBase64Image(window.content.document.getElementById(id));
  122. }
  123.  
  124. function send_captcha()
  125. {
  126. /* старая обработка
  127. var base64_value = getBase64ImageById('bot_check_image');
  128.  
  129. do
  130. {
  131. var data = "method=base64&key=" + api_key + "&soft_id=490&body=" + base64_value +
  132.     "&min_len=" + captcha_min_len + "&max_len=" + captcha_max_len;
  133.  
  134. postUrl("http://antigate.com/in.php", data);
  135.  
  136. iimDisplay("Ответ от сервера: " + res);
  137.  
  138. if (res.substring(0, 2) == "OK") { var cap_id = res.substring(3); }
  139.  
  140. doSleep(5); // ждём
  141. } while (res.substring(0, 2) != "OK");
  142.  
  143. do
  144. {
  145.     doSleep(5);
  146.     data = "key=" + api_key + "&action=get&id=" +cap_id,
  147.     postUrl("http://antigate.com/res.php", data);
  148.     iimDisplay("Текст капчи: " + res);
  149. } while ((res == "CAPCHA_NOT_READY")&&(res.substring(0, 5)!="ERROR"))
  150.  
  151. if (res.substring(0, 5)!="ERROR")
  152.     {
  153.     // вводим текст и клацаем кнопку
  154.     var code = "CODE:" + jsNewLine;
  155.     code = code + "TAG POS=1 TYPE=INPUT:TEXT ATTR=NAME:code CONTENT=" + res.substring(3) + jsNewLine;
  156.     code = code + "TAG POS=1 TYPE=INPUT:SUBMIT ATTR=VALUE:" + Next_btn_txt;
  157.     iimPlay(code);
  158.     } else {solve_captcha();};
  159. */
  160.  
  161. // новая обработка с recaptcha
  162. // 1. жмём галочку
  163. var code = "CODE:" + jsNewLine;
  164. code = code + "FRAME NAME=" + "" + "undefined" + "" + jsNewLine;
  165. code = code + "TAG POS=1 TYPE=DIV ATTR=ROLE:presentation&&CLASS:recaptcha-checkbox-checkmark&&TXT:";
  166. iimPlay(code);
  167.  
  168. // TO DO:
  169. // 2. Определить имя фрейма с картинками
  170. // 3. Масштабировать картинку
  171. // 4. Передать картинку c текстом и получить ID
  172. // 5. Дождаться решения и послать в игру
  173.  
  174. }
  175.  
  176. function getVillageList() // Сбор информации о деревнях
  177. {
  178. iimDisplay("Getting villages list");
  179. if (start_type == 1) { // автосбор деревень
  180. var code = "CODE:" + jsNewLine;
  181. code = code + "URL GOTO=" + base_url + "screen=overview_villages&mode=combined&group=0" + jsNewLine;
  182. code = code + "TAG POS=1 TYPE=TH ATTR=TXT:*(* EXTRACT=TXT";
  183. iimPlay(code);
  184. }
  185.  
  186. if (start_type != 3) { // собираем деревни по списку
  187.  
  188. var code = "CODE:" + jsNewLine;
  189. code = code + "TAG POS=1 TYPE=TH ATTR=TXT:*(* EXTRACT=TXT";
  190. iimPlay(code);
  191.  
  192. num_villages = iimGetLastExtract(1);
  193. num_villages = num_villages.substring(num_villages.indexOf("(")+1);
  194. num_villages = num_villages.substring(0, num_villages.indexOf(")"));
  195.  
  196. code = "CODE:" + jsNewLine;
  197. code = code + "TAG POS=2 TYPE=A ATTR=HREF:*screen=overview EXTRACT=HREF" + jsNewLine;
  198. iimPlay(code);
  199.  
  200. href_villages[1] = iimGetLastExtract(1);
  201.  
  202. href_villages[1] = href_villages[1].substr(href_villages[1].indexOf("village=")+8);
  203. href_villages[1] = href_villages[1].substr(0, href_villages[1].indexOf("&"));
  204. href_villages[1] = base_url + 'village=' + href_villages[1] + "&order=distance&dir=asc&screen=am_farm";
  205.  
  206. for (i=2; i<=num_villages; i++)
  207.     {
  208.     // выцепляем ссылки на деревни
  209.     code = "CODE:" + jsNewLine;
  210.     code = code + "TAG POS=" + (i+1) + " TYPE=A ATTR=HREF:*screen=overview EXTRACT=HREF" + jsNewLine;
  211.     iimPlay(code);
  212.     href_villages[i] = iimGetLastExtract(1);
  213.    
  214.     href_villages[i] = href_villages[i].substr(href_villages[i].indexOf("village=")+8);
  215.     href_villages[i] = href_villages[i].substr(0, href_villages[i].indexOf("&"));
  216.     href_villages[i] = base_url + 'village=' + href_villages[i] + "&order=distance&dir=asc&screen=am_farm";
  217.     }
  218. }
  219. if (start_type == 3) { // забиваем вручную, list of FA pages
  220. href_villages = ["",
  221. "http://ru23.voyna-plemyon.ru/game.php?village=123&order=distance&dir=asc&screen=am_farm",
  222. "http://ru23.voyna-plemyon.ru/game.php?village=124&order=distance&dir=asc&screen=am_farm"];
  223. num_villages = 2;
  224. }
  225.  
  226. }
  227.  
  228. function click_all(icon, href)
  229. {
  230. // посчитаем количество выходов
  231. var code = "CODE:" + jsNewLine;
  232. code = code + "TAG POS=1 TYPE=TD ATTR=ID:light EXTRACT=TXT"
  233. iimPlay(code);
  234. var light_count = iimGetLastExtract(1);
  235. var btn_count = Math.floor(light_count/light_farm_size);
  236.  
  237. var FA_depth = Math.floor(btn_count/max_btn_count);
  238.  
  239. if (FA_depth > max_FA_depth) {FA_depth = max_FA_depth};
  240.  
  241. btn_count = btn_count - FA_depth*max_btn_count;
  242. if (btn_count > max_btn_count) {btn_count = max_btn_count};
  243.  
  244. var num_btn = 1;
  245.  
  246. // жмём кнопочки сколько нужно
  247. for (var j=0; j<=FA_depth; j++) {
  248.     if (j!=0) {
  249.         URL_goto(href + "&Farm_page=" + j);
  250.         doSleep(2);
  251.         solve_captcha();        // проверка на антибота
  252.         }
  253.     if (j==FA_depth) {num_btn = btn_count} else {num_btn = max_btn_count };
  254.     code = "CODE:" + jsNewLine;
  255.    
  256.     for (i=1; i<=num_btn; i++)
  257.         {
  258.         code = code + "TAG POS=" + (i+1) +" TYPE=A ATTR=CLASS:*farm_icon_" + icon + "*" + jsNewLine;
  259.         code = code + "WAIT SECONDS=" + ((delay_btn + getRandomInt(delay_btn_delta[0], delay_btn_delta[1]))/1000) + jsNewLine;
  260.         }
  261.     iimPlay(code); 
  262.     }  
  263. }
  264.  
  265. function getRandomInt(min, max)
  266. {
  267.     return Math.floor(Math.random() * (max - min + 1)) + min;
  268. }
  269.  
  270. function doSleep(amount) {
  271.     var tmpCode = "CODE:" + jsNewLine;
  272.     tmpCode += "WAIT SECONDS=" + amount;
  273.     iimPlay(tmpCode);
  274. }
  275.  
  276. function URL_goto(url)
  277. {
  278.     iimDisplay("GOTO: " + url);
  279.     var code = "CODE:" + jsNewLine;
  280.     code = code + "URL GOTO=" + url;
  281.     iimPlay(code);
  282. }
  283.  
  284. function solve_captcha()
  285. {
  286.     // если просит капчу - вводим
  287.     /* старая капча
  288.     var img = window.content.document.getElementById('bot_check_image');
  289.     if (img != null) {send_captcha();} // если видим капчу - решаем
  290.     */
  291.    
  292.     // новая recapcha
  293.     // div class="g-recaptcha"
  294.    
  295.     if (window.content.document.documentElement.outerHTML.indexOf("g-recaptcha") > 0)
  296.         { // если есть капча
  297.         send_captcha();
  298.         }
  299. }
  300.  
  301. function farm_all_villages()
  302. {
  303. for (var v=1; v<=num_villages; v++)
  304.     {
  305.     URL_goto(href_villages[v]); // идём на страничку советника
  306.     doSleep(3);         // прогрузить капчу
  307.     solve_captcha();        // проверка на антибота
  308.     click_all("a", href_villages[v]);           // кликаем кнопки
  309.     // пауза перед следующей страничкой
  310.     doSleep(delay_village + getRandomInt(delay_village_delta[0], delay_village_delta[1]));
  311.    
  312.     // проверить на атаки
  313.  
  314.    
  315.     }
  316. }
  317.  
  318.  
  319.  
  320.  
  321. // Точка входа
  322.  
  323. solve_captcha();
  324. getVillageList();
  325.  
  326. while (true)
  327. {
  328.     var code = "CODE:" + jsNewLine;
  329.     code = code + "URL GOTO=" + base_url + "mode=incomings&screen=overview_villages&group=0&type=unignored&subtype=attacks" + jsNewLine;
  330.     code = code + "TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:incomings_form ATTR=ID:select_all CONTENT=YES" + jsNewLine;
  331.     code = code + "TAG POS=1 TYPE=INPUT:SUBMIT FORM=ID:incomings_form ATTR=NAME:label";
  332.  
  333.     iimPlay(code);
  334.  
  335.     farm_all_villages();
  336.     solve_captcha();
  337.     iimPlay(code);
  338.     solve_captcha();
  339.     doSleep(delay_cycle+ getRandomInt(delay_cycle_delta[0], delay_cycle_delta[1]));
  340.     solve_captcha();
  341. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement