Инструменты пользователя

Инструменты сайта


Боковая панель

Перевод этой страницы:

rc2_oldsnippet


// Main settings
 
// waiting timeout
var waitTime = 1000;
// recognition attempts
var tryRecognize = 3;
// attempts to load element
var tryLoadElement = 60;
// receive full answer
bool fullAnswer = true;
// show recognizing progress messages
var needShowMessages = false;
// need to check correctness of answer
var needToCheck = true;
 
// Additional variables
 
// tab
var tab = instance.ActiveTab;
// ReCaptcha image (w/out "I'm not robot" button) 
bool isNewView = true;
// congratulations, you are not robot
var success = false;
// timeout exceeded
var timeout = false;
// task for ReCaptcha 2
var task = string.Empty;
// image url
var src = string.Empty;
// image in base64 encoding
var imageString = string.Empty;
// answer to captcha
var answer = string.Empty;
// captcha has been updated
var changed = false;
// answer is empty
var answerIsEmpty = false;
var coincidenceReCaptcha2Index = -1;
 
 
// Checking protection bypass
Action CheckOK= () => {
	System.Threading.Thread.Sleep(waitTime); // waiting when elements will be loaded
	for (int k = 0; k < tryLoadElement; k++)
	{		
		var check = tab.FindElementByAttribute("div", "class", "recaptcha-checkbox-checkmark", "regexp", coincidenceReCaptcha2Index);
		var more = tab.FindElementByAttribute("div", "class", "rc-imageselect-error-select-more", "regexp", 0);
		var wrong = tab.FindElementByAttribute("div", "class", "rc-imageselect-incorrect-response", "regexp", 0);
		if (!more.IsVoid && !wrong.IsVoid)
		{
			var isNotVisibleMore = more.GetAttribute("outerhtml").Replace(" ","").Contains("display:none");
			var isNotVisibleWrong = wrong.GetAttribute("outerhtml").Replace(" ","").Contains("display:none");
			if (isNotVisibleMore && isNotVisibleWrong)
			{
				if (!check.IsVoid)
				{
					if (check.OuterHtml.Contains("style=\"\"")) 
					{
						success = true;
						break;
					}
				}
				else System.Threading.Thread.Sleep(waitTime);
			}
			else break;
 
		}
		if (k == (tryLoadElement - 1)) timeout = true;
	}
};
 
Action UpdateImage= () => {
	// updating captcha if necessary
	if (!changed) 
	{
		HtmlElement reload = null;
		if (isNewView) reload = tab.FindElementById("recaptcha-reload-button");
		else reload = tab.GetDocumentByAddress("0;0").FindElementByTag("form", 1).FindChildByAttribute("input:submit", "class", "fbc-button-reload fbc-button", "regexp", 0);
 
		if (!reload.IsVoid) reload.Click();
		else timeout = true;
	}
	changed = false;
 
	for (int k = 0; k < tryLoadElement; k++)
	{
		System.Threading.Thread.Sleep(waitTime); // waiting when element will be loaded
		// searching image
		var testImage = tab.FindElementByAttribute("img", "class", "rc-image-tile", "regexp", 0);
		if (testImage.IsVoid) continue;
		// getting image url
		var newSrc = testImage.GetAttribute("src");
		// if image has been updated, then exit
		if (newSrc != src) break;
		if (k == (tryLoadElement - 1)) timeout = true;
	}
};
 
Action VisibleIndexReCaptchaDefinition= () => {
	var recaptchaElementsGroup = tab.FindElementsByAttribute("div", "class", "recaptcha-checkbox-checkmark", "regexp");
	int length = recaptchaElementsGroup.Elements.Length;
	if (length == 1)
	{
		coincidenceReCaptcha2Index = 0;
		return;
	}
 
	for(int i = 0; i < length; i++)
	{
		var element = recaptchaElementsGroup.Elements[i];
		if (!element.IsVoid)
		{
			int x = element.DisplacementInTabWindow.X;
			int y = element.DisplacementInTabWindow.Y;
 
			var suspectVisibleElement = tab.GetElementFromPoint(x, y).DisplacementInTabWindow;
			if (x == suspectVisibleElement.X && y == suspectVisibleElement.Y)
			{
				coincidenceReCaptcha2Index = i;
				break;
			}
		}
	}
};
 
Action SearchReCaptcha2= () => {
	project.SendInfoToLog("Searching ReCaptcha 2", needShowMessages);
	for (int k = 0; k < tryLoadElement; k++)
	{
		VisibleIndexReCaptchaDefinition();
		if (coincidenceReCaptcha2Index < 0)
			continue;
 
		// searching "I'm not robot" button
		var notRobot = tab.FindElementByAttribute("div", "class", "recaptcha-checkbox-checkmark", "regexp", coincidenceReCaptcha2Index);
 
		// if found
		if (!notRobot.IsVoid)
		{
			// click button
			notRobot.Click();
			System.Threading.Thread.Sleep(waitTime); // pause
 
			// if entering captcha is not required
			var check = tab.FindElementByAttribute("div", "class", "recaptcha-checkbox-checkmark", "regexp", 0);
			if (!check.IsVoid)
			{
				if (check.OuterHtml.Contains("style=\"\""))
				{
					success = true;
					break;
				}
			}
 
			// waiting when the form will be loaded
			for (int j = 0; j < tryLoadElement; j++)
			{
				var loadedForm = tab.FindElementByAttribute("div", "class", "primary-controls", "regexp", 0);
				if (!loadedForm.IsVoid) break;
				else System.Threading.Thread.Sleep(waitTime); // waiting when element will be loaded
				if (j == (tryLoadElement - 1)) timeout = true;
			}
			break;
		}
		else 
		{
			// checking if this is mobile ReCaptcha
			var form = tab.FindElementByAttribute("form", "fulltag", "form", "text", 0);
			if (!form.IsVoid)
			{
				isNewView = false;
				fullAnswer = false;
				break;
			}
			else System.Threading.Thread.Sleep(waitTime); // waiting when element will be loaded
		}
		if (k == (tryLoadElement - 1)) timeout = true;
	}
};
 
Action SearchTask= () => {
	project.SendInfoToLog("Searching task", needShowMessages);
	for (int k = 0; k < tryLoadElement; k++)
	{
		HtmlElement taskHe = null;
		if (isNewView) taskHe = tab.FindElementByAttribute("div", "class", "rc-imageselect-desc-wrapper", "regexp", 0);
		else taskHe = tab.FindElementByAttribute("label", "class", "fbc-imageselect-message-text", "regexp", 0);
 
		if (!isNewView && taskHe.IsVoid) taskHe = tab.FindElementByAttribute("div", "class", "fbc-imageselect-message-error", "regexp", 0);
 
		if (!taskHe.IsVoid)
		{
			task = taskHe.GetAttribute("innertext"); // getting task
			if (task.ToLower().Contains("click verify once there are none left"))
				throw new Exception("Not recognized");
 
			if (task.ToLower().Contains("street signs")) 
			{
				UpdateImage();
				continue;
			}
			break;	
		}
		else System.Threading.Thread.Sleep(waitTime); // waiting when element will be loaded
 
		if (k == (tryLoadElement - 1)) timeout = true;
	}
};
 
Action SearchImage= () => {
	project.SendInfoToLog("Searching image", needShowMessages);
	System.Threading.Thread.Sleep(waitTime * 3); // waiting when element will be loaded
	for (int k = 0; k < tryLoadElement; k++)
	{
		HtmlElement image = null;
		if (isNewView) image = tab.FindElementByAttribute("img", "class", "rc-image-tile", "regexp", 0);
		else  image = tab.FindElementByAttribute("img", "class", "fbc-imageselect-payload", "regexp", 0);
 
		// if found
		if (!image.IsVoid)
		{
			// getting image url
			src = image.GetAttribute("src");
			imageString = image.DrawToBitmap(true);
			break;
		}
		else System.Threading.Thread.Sleep(waitTime); // waiting when element will be loaded
 
		if (k == (tryLoadElement - 1)) timeout = true;
	}
};
 
Action Recognize= () => {
	project.SendInfoToLog("Recognizing", needShowMessages);
	if (!isNewView) fullAnswer = false;
	var answerString = ZennoPoster.CaptchaRecognition("CapMonster2.dll", imageString, String.Format("Task={0}&FullAnswer={1}", task, fullAnswer));
	var split = answerString.Split(new [] { "-|-" }, StringSplitOptions.RemoveEmptyEntries);
	answer = split[0];
};
 
Action InputAnswer= () => {
	if (!String.IsNullOrEmpty(answer) && answer != "sorry")
	{
		project.SendInfoToLog("Entering and verifying answer", needShowMessages);
		int count = 0;
		foreach (char c in answer)
		{
			if (fullAnswer)
			{
				if (count == 2) break;
			}
			int index;
 
			HtmlElement he = null;	
			if (isNewView)
			{
				index = Convert.ToInt32(c.ToString()) - 1;
				he = tab.FindElementByAttribute("img", "class", "rc-image-tile", "regexp", index);
			}
			else
			{
				string attrValue = "fbc-imageselect-checkbox-" + c;
				he = tab.FindElementByAttribute("input:checkbox", "class", attrValue, "regexp", 0);
			}
 
			if (!he.IsVoid) 
			{
				he.Click(); //click picture
				System.Threading.Thread.Sleep(waitTime);// pause
			}
			if (fullAnswer) count++;
		}
 
		// searching "Verify" button
		HtmlElement apply = null;
		if (isNewView) apply = tab.FindElementById("recaptcha-verify-button");
		else apply = tab.GetDocumentByAddress("0;0").FindElementByTag("form", 0).FindChildByAttribute("input:submit", "fulltag", "input:submit", "text", 0);
 
		if (!apply.IsVoid) apply.Click();
 
		// checking if answer is correct
		if (isNewView)
		{
			CheckOK();
			if (success) return;
 
			// entering remained part of answer
			if (fullAnswer)
			{
				for (int i = count; i < answer.Length; i++)
				{
					// searching image again
					var testImage = tab.FindElementByAttribute("img", "class", "rc-image-tile", "regexp", 0);
					if (testImage.IsVoid) break;
					// getting image url
					var newSrc = testImage.GetAttribute("src");
					// if image has been changed, then exit
					if (newSrc != src) break;
					else changed = true;
					// else continue entering
					int index = Convert.ToInt32(answer[i].ToString()) - 1;
					var he = tab.FindElementByAttribute("img", "class", "rc-image-tile", "regexp", index);
					if (!he.IsVoid) 
					{
						he.Click();
						System.Threading.Thread.Sleep(waitTime); // pause
						if (!apply.IsVoid) apply.Click();
						CheckOK();
						if (success) return;
					}
				}
			}
		}
	}
	else answerIsEmpty = true;
};
 
// Additonal actions for old type ReCaptcha 
Action ActsOldView= () => {
	System.Threading.Thread.Sleep(waitTime * 3); // waiting when element will be loaded
	// checking if there is a mistake in recognition
	HtmlElement he = tab.FindElementByAttribute("img", "class", "fbc-imageselect-payload", "regexp", 0);
	if (!he.IsVoid) 
	{
		return;
	}
 
	string txt = string.Empty;
	// searching text to insert
	for (int k = 0; k < tryLoadElement; k++)
	{
		HtmlElement heGetText = tab.FindElementByAttribute("textarea", "dir", "ltr", "regexp", 0);
		if (!heGetText.IsVoid)
		{
			txt = heGetText.GetAttribute("value");
			break;	
		}
		else 
		{
			System.Threading.Thread.Sleep(waitTime); // pause
			continue;
		}
		if (k == (tryLoadElement - 1)) timeout = true;
	}
 
	// searching field to insert text
	for (int k = 0; k < tryLoadElement; k++)
	{
		HtmlElement hePutText = tab.FindElementByAttribute("textarea", "id", "g-recaptcha-response", "regexp", 0);
		if (!hePutText.IsVoid)
		{
			hePutText.SetValue(txt, "None", false);
			break;	
		}
		else 
		{
			System.Threading.Thread.Sleep(waitTime); // pause
			continue;
		}
		if (k == (tryLoadElement - 1)) timeout = true;
	}
 
	// pressing "Verify"
	for (int k = 0; k < tryLoadElement; k++)
	{
		var submit = tab.FindElementByAttribute("input:submit", "fulltag", "input:submit", "regexp", 0);
		if (!submit.IsVoid)
		{
			submit.Click();
			break;
		}
		else 
		{
			System.Threading.Thread.Sleep(waitTime); // pause
			continue;
		}
		if (k == (tryLoadElement - 1)) timeout = true;
	}
	success = true;
};
 
SearchReCaptcha2();
if (timeout) throw new Exception("Element loading timeout has been exceeded");
 
for (int i = 0; i < tryRecognize; i++)
{
	SearchTask();
	if (timeout) break;
	SearchImage();
	if (timeout) break;
	Recognize();
	InputAnswer();
 
	if (!needToCheck) return "ok";
 
	if (answerIsEmpty)
	{
		answerIsEmpty = false;
		UpdateImage();
		continue;
	}
 
	if (!isNewView) ActsOldView();
	if (timeout) break;
 
	if (success) return "ok";
 
	if (i != (tryRecognize - 1)) UpdateImage();
	if (timeout) break;
}
 
if (timeout) throw new Exception("Element loading timeout has been exceeded");
else throw new Exception("Not recognized");
rc2_oldsnippet.txt · Последние изменения: 2017/03/15 11:56 — afameless