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

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


rc2_oldsnippet

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

rc2_oldsnippet [2017/03/15 11:56] (текущий)
afameless создано
Строка 1: Строка 1:
 +\\
 +<code csharp>
 +// 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"​);​
 +</​code>​
rc2_oldsnippet.txt · Последние изменения: 2017/03/15 11:56 — afameless