SHOW:
|
|
- or go back to the newest paste.
1 | - | // Отправляет все войска |
1 | + | // ==UserScript== |
2 | // @name * Tribalwars Farm | |
3 | - | javascript: |
3 | + | // @namespace * Tribalwars Farm |
4 | - | var cookieName = "123"; |
4 | + | // @description * Farm script for iMacros with anticaptcha |
5 | - | var coords = "478|593"; |
5 | + | // @author Spieler84 |
6 | - | var doc = document; |
6 | + | // ==/UserScript== |
7 | - | var url = document.URL; |
7 | + | |
8 | ||
9 | - | if (url.search(/screen=place/) != -1 && url.search(/try=confirm/) === -1 && document.forms[0].x.value === "" && document.forms[0].y.value === "") |
9 | + | // Задержки - Delays |
10 | var delay_cycle = 1500; // пауза между циклами фарма, с. delay between cycles, seconds | |
11 | - | if (window.frames.length > 0) { doc = window.main.document; } |
11 | + | var delay_cycle_delta = [0, 60]; // доп. пауза между циклами, с. additional delay, seconds |
12 | - | url = document.URL; |
12 | + | var delay_village = 1; // пауза между деревнями, с. delay between villages, seconds |
13 | - | if (url.indexOf("screen=place") == -1) { alert("This script needs to be run from the rally point"); } |
13 | + | var delay_village_delta = [0, 1]; // доп. пауза между деревнями, с. additional delay, seconds |
14 | - | coords = coords.split(" "); |
14 | + | var delay_btn = 300; // пауза между кликами, мс. delay between FA clicks, milliseconds |
15 | - | var index = 0; |
15 | + | var delay_btn_delta = [50, 300]; // доп. пауза между кликами, мс. additional delay, milliseconds |
16 | - | farmcookie = document.cookie.match("(^|;) ?" + cookieName + "=([^;]*)(;|$)"); |
16 | + | |
17 | - | if (farmcookie != null) { index = parseInt(farmcookie[2]); } |
17 | + | // Настройки военного советника - FA setup |
18 | - | if (index >= coords.length) {index = 0;} |
18 | + | var max_btn_count = 100; // количество деревень на страницу в настройках ВС, number of villages per FA page |
19 | - | coords = coords[index]; |
19 | + | var max_FA_depth = 2; // на сколько страниц можно углубиться (0 - без переходов), number of FA pages to dive in |
20 | - | coords = coords.split("|"); |
20 | + | var light_farm_size = 1; // размер отряда ЛК. number of Light Cavalry set at button "A" |
21 | - | index = index + 1; |
21 | + | var Next_btn_txt = "Дальше"; // текст на кнопке ввода капчи. Text of the capcha submit button |
22 | - | cookie_date = new Date(2018, 03, 20); |
22 | + | |
23 | - | document.cookie = cookieName + "=" + index + "; |
23 | + | |
24 | - | expires=" + cookie_date.toGMTString(); |
24 | + | // Настройки сервиса antigate - antigate setup |
25 | - | doc.forms[0].x.value = coords[0]; |
25 | + | var api_key = "c331c5c46b31c446f977baa6e14f60b2"; // ваш api-ключ, antigate key |
26 | - | doc.forms[0].y.value = coords[1]; |
26 | + | var captcha_min_len = 6; // минимальный размер капчи, min size of capcha |
27 | - | selectAllUnits(true); |
27 | + | var captcha_max_len = 6; // максимальный размер капчи, max size of capcha |
28 | - | document.forms[0].attack.click(); |
28 | + | |
29 | - | } |
29 | + | // Общие настройки - General setup |
30 | - | else |
30 | + | const base_url = "http://ru37.voyna-plemyon.ru/game.php?"; // для присмотра добавится параметр t, например |
31 | - | if (url.search(/screen=place/) != -1 && url.search(/try=confirm/) != -1) |
31 | + | // "http://ru23.voyna-plemyon.ru/game.php?t=2342321&" (for sitter) |
32 | - | { document.forms[0].submit.click(); } |
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("Нападение"); | |
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 | var base64_value = getBase64ImageById('bot_check_image'); | |
127 | ||
128 | do | |
129 | { | |
130 | var data = "method=base64&key=" + api_key + "&soft_id=490&body=" + base64_value + | |
131 | "&min_len=" + captcha_min_len + "&max_len=" + captcha_max_len; | |
132 | ||
133 | postUrl("http://antigate.com/in.php", data); | |
134 | ||
135 | iimDisplay("Ответ от сервера: " + res); | |
136 | ||
137 | if (res.substring(0, 2) == "OK") { var cap_id = res.substring(3); } | |
138 | ||
139 | doSleep(5); // ждём | |
140 | } while (res.substring(0, 2) != "OK"); | |
141 | ||
142 | do | |
143 | { | |
144 | doSleep(5); | |
145 | data = "key=" + api_key + "&action=get&id=" +cap_id, | |
146 | postUrl("http://antigate.com/res.php", data); | |
147 | iimDisplay("Текст капчи: " + res); | |
148 | } while ((res == "CAPCHA_NOT_READY")&&(res.substring(0, 5)!="ERROR")) | |
149 | ||
150 | if (res.substring(0, 5)!="ERROR") | |
151 | { | |
152 | // вводим текст и клацаем кнопку | |
153 | var code = "CODE:" + jsNewLine; | |
154 | code = code + "TAG POS=1 TYPE=INPUT:TEXT ATTR=NAME:code CONTENT=" + res.substring(3) + jsNewLine; | |
155 | code = code + "TAG POS=1 TYPE=INPUT:SUBMIT ATTR=VALUE:" + Next_btn_txt; | |
156 | iimPlay(code); | |
157 | } else {solve_captcha();}; | |
158 | ||
159 | } | |
160 | ||
161 | function getVillageList() // Сбор информации о деревнях | |
162 | { | |
163 | iimDisplay("Getting villages list"); | |
164 | if (start_type == 1) { // автосбор деревень | |
165 | var code = "CODE:" + jsNewLine; | |
166 | code = code + "URL GOTO=" + base_url + "screen=overview_villages&mode=combined&group=0" + jsNewLine; | |
167 | code = code + "TAG POS=1 TYPE=TH ATTR=TXT:Деревня* EXTRACT=TXT"; | |
168 | iimPlay(code); | |
169 | } | |
170 | ||
171 | if (start_type != 3) { // собираем деревни по списку | |
172 | ||
173 | var code = "CODE:" + jsNewLine; | |
174 | code = code + "TAG POS=1 TYPE=TH ATTR=TXT:Деревня* EXTRACT=TXT"; | |
175 | iimPlay(code); | |
176 | ||
177 | num_villages = iimGetLastExtract(1); | |
178 | num_villages = num_villages.substring(num_villages.indexOf("(")+1); | |
179 | num_villages = num_villages.substring(0, num_villages.indexOf(")")); | |
180 | //alert(num_villages); | |
181 | ||
182 | code = "CODE:" + jsNewLine; | |
183 | code = code + "TAG POS=2 TYPE=A ATTR=HREF:*screen=overview EXTRACT=HREF" + jsNewLine; | |
184 | iimPlay(code); | |
185 | ||
186 | href_villages[1] = iimGetLastExtract(1); | |
187 | ||
188 | href_villages[1] = href_villages[1].substr(href_villages[1].indexOf("village=")+8); | |
189 | href_villages[1] = href_villages[1].substr(0, href_villages[1].indexOf("&")); | |
190 | href_villages[1] = base_url + 'village=' + href_villages[1] + "&order=distance&dir=asc&screen=am_farm"; | |
191 | ||
192 | for (i=2; i<=num_villages; i++) | |
193 | { | |
194 | // выцепляем ссылки на деревни | |
195 | code = "CODE:" + jsNewLine; | |
196 | code = code + "TAG POS=" + (i+1) + " TYPE=A ATTR=HREF:*screen=overview EXTRACT=HREF" + jsNewLine; | |
197 | iimPlay(code); | |
198 | href_villages[i] = iimGetLastExtract(1); | |
199 | ||
200 | href_villages[i] = href_villages[i].substr(href_villages[i].indexOf("village=")+8); | |
201 | href_villages[i] = href_villages[i].substr(0, href_villages[i].indexOf("&")); | |
202 | href_villages[i] = base_url + 'village=' + href_villages[i] + "&order=distance&dir=asc&screen=am_farm"; | |
203 | } | |
204 | } | |
205 | if (start_type == 3) { // забиваем вручную, list of FA pages | |
206 | href_villages = ["", | |
207 | "http://ru23.voyna-plemyon.ru/game.php?village=123&order=distance&dir=asc&screen=am_farm", | |
208 | "http://ru23.voyna-plemyon.ru/game.php?village=124&order=distance&dir=asc&screen=am_farm"]; | |
209 | num_villages = 2; | |
210 | } | |
211 | ||
212 | } | |
213 | ||
214 | function click_all(icon, href) | |
215 | { | |
216 | // посчитаем количество выходов | |
217 | var code = "CODE:" + jsNewLine; | |
218 | code = code + "TAG POS=1 TYPE=TD ATTR=ID:light EXTRACT=TXT" | |
219 | iimPlay(code); | |
220 | var light_count = iimGetLastExtract(1); | |
221 | var btn_count = Math.floor(light_count/light_farm_size); | |
222 | ||
223 | var FA_depth = Math.floor(btn_count/max_btn_count); | |
224 | ||
225 | if (FA_depth > max_FA_depth) {FA_depth = max_FA_depth}; | |
226 | ||
227 | btn_count = btn_count - FA_depth*max_btn_count; | |
228 | if (btn_count > max_btn_count) {btn_count = max_btn_count}; | |
229 | ||
230 | var num_btn = 1; | |
231 | ||
232 | // жмём кнопочки сколько нужно | |
233 | for (var j=0; j<=FA_depth; j++) { | |
234 | if (j!=0) { | |
235 | URL_goto(href + "&Farm_page=" + j); | |
236 | doSleep(2); | |
237 | solve_captcha(); // проверка на антибота | |
238 | } | |
239 | if (j==FA_depth) {num_btn = btn_count} else {num_btn = max_btn_count }; | |
240 | code = "CODE:" + jsNewLine; | |
241 | ||
242 | for (i=1; i<=num_btn; i++) | |
243 | { | |
244 | code = code + "TAG POS=" + (i+1) +" TYPE=A ATTR=CLASS:*farm_icon_" + icon + "*" + jsNewLine; | |
245 | code = code + "WAIT SECONDS=" + ((delay_btn + getRandomInt(delay_btn_delta[0], delay_btn_delta[1]))/1000) + jsNewLine; | |
246 | } | |
247 | iimPlay(code); | |
248 | } | |
249 | } | |
250 | ||
251 | function getRandomInt(min, max) | |
252 | { | |
253 | return Math.floor(Math.random() * (max - min + 1)) + min; | |
254 | } | |
255 | ||
256 | function doSleep(amount) { | |
257 | var tmpCode = "CODE:" + jsNewLine; | |
258 | tmpCode += "WAIT SECONDS=" + amount; | |
259 | iimPlay(tmpCode); | |
260 | } | |
261 | ||
262 | function URL_goto(url) | |
263 | { | |
264 | iimDisplay("GOTO: " + url); | |
265 | var code = "CODE:" + jsNewLine; | |
266 | code = code + "URL GOTO=" + url; | |
267 | iimPlay(code); | |
268 | } | |
269 | ||
270 | function solve_captcha() | |
271 | { | |
272 | // если просит капчу - вводим | |
273 | var img = window.content.document.getElementById('bot_check_image'); | |
274 | if (img != null) {send_captcha();} // если видим капчу - решаем | |
275 | } | |
276 | ||
277 | function farm_all_villages() | |
278 | { | |
279 | for (var v=1; v<=num_villages; v++) | |
280 | { | |
281 | URL_goto(href_villages[v]); // идём на страничку советника | |
282 | doSleep(3); // прогрузить капчу | |
283 | solve_captcha(); // проверка на антибота | |
284 | click_all("a", href_villages[v]); // кликаем кнопки | |
285 | // пауза перед следующей страничкой | |
286 | doSleep(delay_village + getRandomInt(delay_village_delta[0], delay_village_delta[1])); | |
287 | ||
288 | // проверить на атаки | |
289 | ||
290 | ||
291 | } | |
292 | } | |
293 | ||
294 | ||
295 | ||
296 | ||
297 | // Точка входа | |
298 | ||
299 | ||
300 | ||
301 | ||
302 | ||
303 | solve_captcha(); | |
304 | getVillageList(); | |
305 | ||
306 | while (true) | |
307 | { | |
308 | var code = "CODE:" + jsNewLine; | |
309 | code = code + "URL GOTO=http://ru37.voyna-plemyon.ru/game.php?mode=incomings&screen=overview_villages&group=0&type=unignored&subtype=attacks" + jsNewLine; | |
310 | code = code + "TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:incomings_form ATTR=ID:select_all CONTENT=YES" + jsNewLine; | |
311 | code = code + "TAG POS=1 TYPE=INPUT:SUBMIT FORM=ID:incomings_form ATTR=NAME:label"; | |
312 | ||
313 | iimPlay(code); | |
314 | ||
315 | ||
316 | ||
317 | ||
318 | farm_all_villages(); | |
319 | solve_captcha(); | |
320 | iimPlay(code); | |
321 | doSleep(delay_cycle+ getRandomInt(delay_cycle_delta[0], delay_cycle_delta[1])); | |
322 | ||
323 | } |