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

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


ru:addons:capmonster:rc-audio

Различия

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

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

Both sides previous revision Предыдущая версия
Следущая версия
Предыдущая версия
ru:addons:capmonster:rc-audio [2016/03/25 10:31]
afameless
ru:addons:capmonster:rc-audio [2021/01/23 21:23] (текущий)
sergodjan
Строка 4: Строка 4:
 В программе будет доступен модуль ZennoLab.AudioReCaptcha. Работает это так: когда на странице встречается ReCaptcha, нужно выбрать распознавание через аудиозапись и отправить ее в CapMonster.\\ В программе будет доступен модуль ZennoLab.AudioReCaptcha. Работает это так: когда на странице встречается ReCaptcha, нужно выбрать распознавание через аудиозапись и отправить ее в CapMonster.\\
 \\ \\
-Принцип работы:​\\+Принцип работы:​\\ ​
 {{:​ru:​addons:​capmonster:​audiorc.png?​nolink|}} {{:​ru:​addons:​capmonster:​audiorc.png?​nolink|}}
  
Строка 13: Строка 13:
 \\ \\
 <code csharp> <code csharp>
-// Основные параметры+//Main settings
    
-// время ожидания+// waiting timeout
 var waitTime = 1000; var waitTime = 1000;
-// количество попыток распознать +// recognition attempts 
-var tryRecognize = 2+var tryRecognize = 10
-// количество попыток загрузить элемент+// attempts to load element
 var tryLoadElement = 60; var tryLoadElement = 60;
-// показывать сообщения о прогрессе распознавания+// show recognizing progress messages
 var needShowMessages = false; var needShowMessages = false;
-// проверять корректность распознанного ответа+// need to check answer'​s correctness
 var needToCheck = true; var needToCheck = true;
    
-// Вспомогательные переменные+// Additional variables
    
-// вкладка+// tab
 var tab = instance.ActiveTab;​ var tab = instance.ActiveTab;​
-// поздравляемвы не робот+// congratulationsyou are not robot
 var success = false; var success = false;
-// аудио файл+// audio file
 var file = string.Empty;​ var file = string.Empty;​
-// файл был удален+// file has been deleted
 var fileDeleted = true; var fileDeleted = true;
-// ответ на аудио каптчу+// answer to audio captcha
 var answer = string.Empty;​ var answer = string.Empty;​
-// новый вид рекаптчи 2 +// ReCaptcha ​1
-var isNewView = true; +
-// рекаптча ​1+
 var isRecaptcha1 = false; var isRecaptcha1 = false;
-// время вышло ​+// timeout exceeded ​
 var timeout = false; var timeout = false;
-// ошибка загрузки файла+// error loading file
 var fileLoadingError = false; var fileLoadingError = false;
-// cписок урлов скаченных файлов +var usedURLs = new List<​string>​();​ 
-var usedURLs = new List<​string>​(); ​ +var isFirstAttempt = true; 
 +var coincidenceReCaptcha2Index = -1;
    
-// поиск кнопки открытия формы с аудио заданием+// Searching audio button element
 Action TryOpenAudioForm = () => { Action TryOpenAudioForm = () => {
  for (int k = 0; k < tryLoadElement;​ k++)  for (int k = 0; k < tryLoadElement;​ k++)
  {  {
- var audioButton = tab.FindElementByAttribute("​div",​ "​id", ​"​recaptcha-audio-button"​, "​regexp",​ 0); + var audioButton = tab.FindElementById("​recaptcha-audio-button"​);​ 
- // если нашли+ // if found
  if (!audioButton.IsVoid)  if (!audioButton.IsVoid)
  {  {
- // клик по кнопке+ // press button
  audioButton.Click();​  audioButton.Click();​
 + tab.WaitDownloading();​
  break;  break;
  }  }
- System.Threading.Thread.Sleep(waitTime);​ // подождём немного+ System.Threading.Thread.Sleep(waitTime);​ // pause
  if (k == (tryLoadElement - 1)) timeout = true;  if (k == (tryLoadElement - 1)) timeout = true;
  }  }
- System.Threading.Thread.Sleep(waitTime);​ // подождём немного+ System.Threading.Thread.Sleep(waitTime);​ // pause
 }; };
    
-// открытие аудиозадания 
 Action OpenAudioTask= () => { Action OpenAudioTask= () => {
- project.SendInfoToLog("​Открываем форму с аудио заданием", needShowMessages);​ + project.SendInfoToLog("​Loading audio task", needShowMessages)
- if (isNewView)+ //checking task type in the form 
 + var task = tab.FindElementByAttribute("​div",​ "​class",​ "​rc-imageselect-desc-wrapper",​ "​regexp",​ 0); 
 + if (!task.IsVoid) TryOpenAudioForm();​ // graphic task has been found, then loading audio 
 +}; 
 +  
 +Action VisibleIndexReCaptchaDefinition= () => { 
 + var recaptchaElementsGroup = tab.FindElementsByAttribute("​div",​ "​class",​ "​recaptcha-checkbox-checkmark",​ "​regexp"​);​ 
 + int length = recaptchaElementsGroup.Elements.Length
 + if (length == 1)
  {  {
- //​проверяем тип задания формы + coincidenceReCaptcha2Index ​= 0; 
- var task tab.FindElementByAttribute("​div",​ "​class",​ "​rc-imageselect-desc-wrapper",​ "​regexp", ​0)+ return;
- if (!task.IsVoid) TryOpenAudioForm()// найдено графическое задание,​ значит открываем аудио+
  }  }
- else 
- { 
- var elem = tab.FindElementByAttribute("​input:​submit",​ "​class",​ @"​fbc-button-audio fbc-button",​ "​regexp",​ 0); 
- if (!elem.IsVoid) elem.Click();​ 
    
- tab.WaitDownloading()+ for(int i = 0i < length; i++) 
- var errorElem ​tab.FindElementByAttribute("​div",​ "​class",​ "​fbc-message",​ "​regexp",​ 0)+ { 
- if (!errorElem.IsVoid)+ var element ​recaptchaElementsGroup.Elements[i]
 + if (!element.IsVoid)
  {  {
- var ​attr errorElem.GetAttribute("​innertext"​); + int x = element.DisplacementInTabWindow.X;​ 
- if (attr.Contains("​Please enable JavaScript and/or update your browser to get an audio challenge"​))+ int y = element.DisplacementInTabWindow.Y;​ 
 +  
 + var suspectVisibleElement ​tab.GetElementFromPoint(x, y).DisplacementInTabWindow
 + if (x == suspectVisibleElement.X && y == suspectVisibleElement.Y && element.Width != 0 && element.Height != 0 && x != 0 && y != 0)
  {  {
- throw new Exception("​Не получилось открыть вкладку с аудиозаданием,​ попробуйте изменить userAgent"​);+ coincidenceReCaptcha2Index = i; 
 + break;
  }  }
  }  }
Строка 94: Строка 101:
 }; };
    
-// Определение версии рекапчи+// Identifying ReCaptcha version
 Action NotRobotClick= () => { Action NotRobotClick= () => {
  for (int k = 0; k < tryLoadElement;​ k++)  for (int k = 0; k < tryLoadElement;​ k++)
  {  {
 + VisibleIndexReCaptchaDefinition();​
 + if (coincidenceReCaptcha2Index < 0) coincidenceReCaptcha2Index = 0;
 + 
  // поиск кнопки "Я не робот"​  // поиск кнопки "Я не робот"​
- var notRobot = tab.FindElementByAttribute("​div",​ "​class",​ "​recaptcha-checkbox-checkmark",​ "​regexp", ​0); + HtmlElement ​notRobot = tab.FindElementByAttribute("​div",​ "​class",​ "​recaptcha-checkbox-checkmark",​ "​regexp", ​coincidenceReCaptcha2Index); 
- // если ​нашли+  
 + // кнопка существует
  if (!notRobot.IsVoid)  if (!notRobot.IsVoid)
  {  {
  // клик по кнопке  // клик по кнопке
  notRobot.Click();​  notRobot.Click();​
- // подождём немного + System.Threading.Thread.Sleep(waitTime); ​// подождём немного
- System.Threading.Thread.Sleep(waitTime);​+
    
  // если ввод каптчи не требуется  // если ввод каптчи не требуется
- var check = tab.FindElementByAttribute("​div",​ "​class",​ "​recaptcha-checkbox-checkmark",​ "​regexp", ​0);+ var check = tab.FindElementByAttribute("​div",​ "​class",​ "​recaptcha-checkbox-checkmark",​ "​regexp", ​coincidenceReCaptcha2Index);
  if (!check.IsVoid)  if (!check.IsVoid)
  {  {
Строка 115: Строка 125:
  {  {
  success = true;  success = true;
 + timeout = false;
  break;  break;
  }  }
  }  }
 + }
    
- // Ждем пока загрузится форма + // Форма существует 
- for (int j = 0; j < tryLoadElement;​ j++) + var loadedForm = tab.FindElementByAttribute("​div",​ "​class",​ "​primary-controls",​ "​regexp",​ 0); 
- { + if (!loadedForm.IsVoid)
- var loadedForm = tab.FindElementByAttribute("​div",​ "​class",​ "​primary-controls",​ "​regexp",​ 0); +
- if (!loadedForm.IsVoid) ​break; +
- else System.Threading.Thread.Sleep(waitTime);​ // подождём загрузки элемента +
- if (j == (tryLoadElement - 1)) timeout = true; +
- }+
  break;  break;
- } +  
- else+ // checking if ReCaptcha 1 audio button exists 
 + HtmlElement r1 = tab.FindElementById("​recaptcha_switch_audio"​);​ 
 + if (!r1.IsVoid)
  {  {
- // проверяем наличие аудио кнопки рекаптчи 1 + r1.Click(); 
- HtmlElement ​r1 = tab.FindElementById("​recaptcha_switch_audio"​); + isRecaptcha1 = true; 
- if (!r1.IsVoid) + break;
-+
- r1.Click();​ +
- isRecaptcha1 = true+
- break+
- +
-  +
- // проверяем вид рекаптчи2 +
- var elem = tab.FindElementByAttribute("​input:​submit",​ "​class",​ @"​fbc-button-audio fbc-button",​ "​regexp",​ 0); +
- if (!elem.IsVoid) +
-+
- isNewView = false; +
- break; +
-+
- System.Threading.Thread.Sleep(waitTime);​ // подождём загрузки элемента+
  }  }
 +
 + // подождём загрузки элементов
 + System.Threading.Thread.Sleep(waitTime);​
  if (k == (tryLoadElement - 1)) timeout = true;  if (k == (tryLoadElement - 1)) timeout = true;
  }  }
 }; };
    
-// скачиваем ​mp3-файл+// Downloading ​mp3 file
 Action GetAudioFile= () => { Action GetAudioFile= () => {
    
  var href = String.Empty;​  var href = String.Empty;​
    
- // получаем аудио задание+ // getting audio task
  for (int k = 0; k < tryLoadElement;​ k++)  for (int k = 0; k < tryLoadElement;​ k++)
  {  {
Строка 164: Строка 162:
  {  {
  var audioChallenge = tab.FindElementByAttribute("​a",​ "​id",​ "​recaptcha_audio_download",​ "​text",​ 0);  var audioChallenge = tab.FindElementByAttribute("​a",​ "​id",​ "​recaptcha_audio_download",​ "​text",​ 0);
- // если нашлиполучаем ссылку на аудио файл+ // if foundgetting link to audio file
  if (!audioChallenge.IsVoid)  if (!audioChallenge.IsVoid)
  {  {
Строка 174: Строка 172:
  else  else
  {  {
- if (isNewView)+ if (isFirstAttempt)
  {  {
- var audioChallenge ​tab.FindElementByAttribute("​a",​ "​class",​ "​rc-audiochallenge-download-link",​ "​regexp",​ 0); + isFirstAttempt ​false;
- // если нашли, получаем ссылку на аудио файл +
- if (!audioChallenge.IsVoid) +
-+
- href = audioChallenge.GetAttribute("​href"​);​ +
- break;​ +
-+
- else System.Threading.Thread.Sleep(waitTime);​ // подождём загрузки элемента+
  }  }
  else  else
  {  {
- var ​audioChallenge ​= tab.FindElementByAttribute("audio",​ "​class",​ "fbc-audio-controls", "​regexp",​ 0); + var ​reload ​= tab.FindElementById("recaptcha-reload-button"); 
- // если нашли, получаем ссылку на аудио файл + if (!reload.IsVoid)
- if (!audioChallenge.IsVoid)+
  {  {
- href = audioChallenge.FindChildByAttribute("​source",​ "​src",​ "​.mp3",​ "​text",​ 0).GetAttribute("​src"​); + reload.Click(); 
- href = "​https://​www.google.com"​ + href; + tab.WaitDownloading();
- break;+
  }  }
- else System.Threading.Thread.Sleep(waitTime);​ // подождём загрузки элемента 
  }  }
 +
 + var audioChallenge = tab.FindElementByAttribute("​a",​ "​class",​ "​rc-audiochallenge-tdownload-link",​ "​regexp",​ 0);
 + // if found, getting link to audio file
 + if (!audioChallenge.IsVoid)
 + {
 + href = audioChallenge.GetAttribute("​href"​);​
 + break;
 + }
 + System.Threading.Thread.Sleep(waitTime);​ // waiting when form will be loaded
  }  }
  if (k == (tryLoadElement - 1)) timeout = true;  if (k == (tryLoadElement - 1)) timeout = true;
Строка 204: Строка 201:
  {  {
  if (usedUrl.Contains(href))  if (usedUrl.Contains(href))
- throw new Exception("​Отсутствует новый аудио файл");+ throw new Exception("​new audio file is absent");
  }  }
  usedURLs.Add(href);​  usedURLs.Add(href);​
    
- project.SendInfoToLog("​Скачиваем аудио файл", needShowMessages);​+ project.SendInfoToLog("​Downloading audio file", needShowMessages);​
  try  try
  {  {
Строка 223: Строка 220:
  catch (Exception ex)  catch (Exception ex)
  {  {
- throw new Exception("​Не удалось скачать аудио файл");+ throw new Exception("​Failed to download audio file");
  }  }
 }; };
    
 Action Recognize= () => { Action Recognize= () => {
- project.SendInfoToLog("​Распознаем", needShowMessages);​+ project.SendInfoToLog("​Recognizing", needShowMessages);​
  try   try 
  {  {
Строка 243: Строка 240:
  return;  return;
  }  }
 + 
 + var hexStringBuilder = new StringBuilder(2);​
 + for (var i = 0; i < 2; i++)
 + hexStringBuilder.AppendFormat("​{0:​x2}",​ bytes[i]);
 + 
 + var header_prefix = hexStringBuilder.ToString();​
 + if (!header_prefix.Equals("​ffe3"​))
 + {
 + fileLoadingError = true;
 +                        throw new Exception("​Your IP was banned!"​);​
 + return;
 + }
 + 
  string str = Convert.ToBase64String(bytes);​  string str = Convert.ToBase64String(bytes);​
  var rc = ZennoPoster.CaptchaRecognition("​CapMonster2.dll",​ str, "​CapMonsterModule=ZennoLab.AudioReCaptcha&​ParallelMode=true"​);​  var rc = ZennoPoster.CaptchaRecognition("​CapMonster2.dll",​ str, "​CapMonsterModule=ZennoLab.AudioReCaptcha&​ParallelMode=true"​);​
- answer ​= rc.Split(new [] {"​-|-"​},​ StringSplitOptions.RemoveEmptyEntries)[0];​ + var split = rc.Split(new [] {"​-|-"​},​ StringSplitOptions.RemoveEmptyEntries)
-                if (answer.Contains("​133193320491090004119440"​)) throw new Exception("​Your IP was banned!"​);​+ if (split.Length > 0) 
 + answer = split[0]; 
 +        if (answer.Contains("​133193320491090004119440"​)) throw new Exception("​Your IP was banned!"​);​
  
  finally ​  finally ​
  {  {
-        ​if (File.Exists(file)) ​+     ​if (File.Exists(file)) ​
      {      {
  File.Delete(file);​  File.Delete(file);​
Строка 261: Строка 273:
  if (!String.IsNullOrEmpty(answer) && answer != "​sorry"​)  if (!String.IsNullOrEmpty(answer) && answer != "​sorry"​)
  {  {
- project.SendInfoToLog("​Вводим ответ", needShowMessages);​+ project.SendInfoToLog("​Inserting answer", needShowMessages);​
  HtmlElement audioAnswerInput = null;  HtmlElement audioAnswerInput = null;
- // ищем поле для ввода ответа+ // searching answer input field
  if (isRecaptcha1)  if (isRecaptcha1)
  {  {
Строка 270: Строка 282:
  else  else
  {  {
- if (isNewView) ​audioAnswerInput = tab.FindElementByAttribute("​input:​text",​ "​id",​ "​audio-response",​ "​regexp", 0); + audioAnswerInput = tab.FindElementByAttribute("​input:​text",​ "​id",​ "​audio-response",​ "​regexp",​ 0);
- else audioAnswerInput = tab.FindElementByAttribute("​input:​text",​ "​id",​ "​response",​ "text", 0);+
  }  }
    
- // если нашли+ // if found
  if (!audioAnswerInput.IsVoid)  if (!audioAnswerInput.IsVoid)
  {  {
- // вводим ответ+ // inserting answer
  audioAnswerInput.SetValue(answer,​ "​None",​ false);  audioAnswerInput.SetValue(answer,​ "​None",​ false);
  }  }
    
- // подождём немного+ // pause
  System.Threading.Thread.Sleep(waitTime);​  System.Threading.Thread.Sleep(waitTime);​
  }  }
- else throw new Exception("​Ответ не получен");+ else throw new Exception("​Answer not received");
 }; };
    
-// Подтверждаем+// Verifying
 Action SubmitAnswer= () => { Action SubmitAnswer= () => {
- // ищем кнопку ​"Подтвердить+ // searching ​"Verify" ​button 
- HtmlElement ​apply = null; + HtmlElement apply = tab.FindElementById("​recaptcha-verify-button"​);​
- if (isNewView) ​apply = tab.FindElementById("​recaptcha-verify-button"​); +
- else apply = tab.FindElementByAttribute("​div",​ "​class",​ "​fbc-button-verify",​ "​regexp",​ 0).FindChildByAttribute("​input:​submit",​ "​fulltag",​ "​input:​submit",​ "​text",​ 0);+
    
  if (!apply.IsVoid) apply.Click();​  if (!apply.IsVoid) apply.Click();​
 + tab.WaitDownloading();​
    
- // подождём немного+ // pause
  System.Threading.Thread.Sleep(waitTime);​  System.Threading.Thread.Sleep(waitTime);​
 }; };
-  + 
-// Проверяем правильность для старого вида рекапчи ​+// Checking if answer is correct for ReCaptcha ​
-Action ​CheckOldView= () => { +Action ​Check= () => { 
- // Проверяем,​ была ли ошибка в распознавании + project.SendInfoToLog("​Verifying answer", needShowMessages);​ 
- project.SendInfoToLog("​Проверяем правильность", needShowMessages);​ + tab.WaitDownloading(); 
- HtmlElement he = tab.FindElementByAttribute("​div",​ "​class",​ "​fbc-error",​ "​regexp",​ 0); +
- if (!he.IsVoid)  +
-+
- return; +
-+
-  +
- string txt = string.Empty;​ +
- // ищем текст, который надо вставить+
  for (int k = 0; k < tryLoadElement;​ k++)  for (int k = 0; k < tryLoadElement;​ k++)
  {  {
- HtmlElement heGetText ​= tab.FindElementByAttribute("​textarea", "dir", "ltr", "​regexp",​ 0); + System.Threading.Thread.Sleep(waitTime);​ 
- if (!heGetText.IsVoid)+  
 + var checkAnswer = tab.FindElementByAttribute("​div",​ "​class",​ "​recaptcha-checkbox-checkmark",​ "​regexp",​ coincidenceReCaptcha2Index);​ 
 +  
 + // проверка исчезновения формы 
 + var loadedForm ​= tab.FindElementByAttribute("​div", "class", "primary-controls", "​regexp",​ 0); 
 + if (loadedForm.IsVoid)
  {  {
- txt heGetText.GetAttribute("​value"​)+ success ​true
- break; + break;
  }  }
- else ​+ else
  {  {
- System.Threading.Thread.Sleep(waitTime); // подождём немного + if (checkAnswer.IsVoid
- continue;+ break;
  }  }
- if (k == (tryLoadElement - 1)) timeout = true; +  
-+ var recaptchas ​= tab.FindElementsByAttribute("div", "class", "​recaptcha-checkbox-checkmark", "​regexp"​);​ 
-  + if (recaptchas.Count == 0)
- // ищем куда вставлять текст +
- 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)+ success = true
- break; + return;
  }  }
- else  +  
-+
- System.Threading.Thread.Sleep(waitTime);​ // подождём немного +
- continue;​ +
-+
- if (k == (tryLoadElement - 1)) timeout = true; +
-+
-  +
- // нажимаем "​Подтвердить"​ +
- 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);​ // подождём немного +
- continue;​ +
-+
- if (k == (tryLoadElement - 1)) timeout = true; +
-+
- success = true; +
-}; +
-  +
-// проверим правильность ответа рекапчи 2 +
-Action Check= () => { +
- ​ project.SendInfoToLog("​Проверяем правильность",​ needShowMessages);​ +
- for (int k = 0; k < tryLoadElement;​ k++) +
-+
- var checkAnswer = tab.FindElementByAttribute("​div",​ "​class",​ "​recaptcha-checkbox-checkmark",​ "​regexp",​ 0);+
  if (!checkAnswer.IsVoid)  if (!checkAnswer.IsVoid)
  {  {
Строка 379: Строка 350:
  }  }
  if (k == (tryLoadElement - 1)) timeout = true;  if (k == (tryLoadElement - 1)) timeout = true;
- System.Threading.Thread.Sleep(waitTime);​ 
  }  }
 }; };
    
-// Кликаем по кнопке я не робот, если она есть+// Checking "​I'​m not robot" checkbox
 NotRobotClick();​ NotRobotClick();​
 if (success) return "​ok";​ if (success) return "​ok";​
    
-// Пытаемся распознать рекапчу+// trying to recognize ReCaptcha
 for (int i = 0; i < tryRecognize;​ i++) for (int i = 0; i < tryRecognize;​ i++)
 { {
Строка 394: Строка 364:
  GetAudioFile();​  GetAudioFile();​
  if (timeout) break;  if (timeout) break;
 + 
  Recognize();​  Recognize();​
  if (fileLoadingError) ​  if (fileLoadingError) ​
Строка 411: Строка 382:
  }  }
  }  }
- +
  if (isRecaptcha1) return "​ok";​  if (isRecaptcha1) return "​ok";​
  SubmitAnswer();​  SubmitAnswer();​
- + 
  if (!needToCheck) return "​ok";​  if (!needToCheck) return "​ok";​
- + 
  if (timeout) break;  if (timeout) break;
- if (!isNewView) CheckOldView();​ + Check();
- else Check();+
  if (success) return "​ok";​  if (success) return "​ok";​
 } }
    
-if (timeout) throw new Exception("​Вышло время ожидания загрузки элемента"); +if (timeout) throw new Exception("​Loading element timeout is exceeded"); 
-else throw new Exception("​Не распознано. Закончились попытки распознатьпрежде чем ответ был засчитан");+else throw new Exception("​Not recognizedAttempts to recognize were ended, before the response was received");
 </​code>​ </​code>​
  
Строка 439: Строка 409:
 var waitTime = 1000; var waitTime = 1000;
 // количество попыток распознать // количество попыток распознать
-var tryRecognize = 2;+var tryRecognize = 10;
 // количество попыток загрузить элемент // количество попыток загрузить элемент
 var tryLoadElement = 60; var tryLoadElement = 60;
ru/addons/capmonster/rc-audio.1458901898.txt.gz · Последние изменения: 2016/03/25 10:31 — afameless