View difference between Paste ID: 6uY4dDpX and mtph0y4f
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
}