SolveMedia Audio

Добавлено в ZennoPoster 5.9.5.1 и CapMonster 2.5.5.0.

В CapMonster2 есть возможность распознавать звуковой вариант каптчи SolveMedia. В программе будет доступен модуль ZennoLab.AudioSolveMedia.

Использование в ZennoPoster

Для отправки звуковых каптч из ZennoPoster Вы можете использовать подготовленный нами сниппет. Код сниппета доступен ниже. Сниппет может периодически обновляться. Следите за изменениями.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 // Main settings // waiting timeout var waitTime = 1000; // attempts to load captcha var tryLoadElement = 60; // show recognizing progress messages var needShowMessages = true; // folder for saving audio files var mainAudiofolderName = "sm_audio"; // Additional variables var tab = instance.ActiveTab; var timeout = false; var file = string.Empty; var answer = string.Empty; var fileLoadingError = false; var audioFolder = string.Format("{0}\\{1}\\{2}", project.Directory, mainAudiofolderName, Guid.NewGuid().ToString()); Action CheckFileDeleting= () => { if (File.Exists(file)) File.Delete(file); if (Directory.Exists(audioFolder)) { // check directory is empty if ((Directory.GetDirectories(audioFolder).Length + Directory.GetFiles(audioFolder).Length) == 0) Directory.Delete(audioFolder); } }; Action CheckMediaError= () => { if (tab.URL.Contains("api.solvemedia.com/media/media-error.gif")) throw new Exception("Error loading media"); }; Action CheckTimeOut= () => { if (timeout) throw new Exception("Timeout of loading element has been exceeded"); }; Action OpenAudioForm = () => { project.SendInfoToLog("Opening the form with audio task", needShowMessages); for (int k = 0; k < tryLoadElement; k++) { var audioButton = tab.FindElementByAttribute("a", "id", "adcopy-link-audio", "text", 0); if (!audioButton.IsVoid) { audioButton.Click(); break; } System.Threading.Thread.Sleep(waitTime); CheckMediaError(); if (k == (tryLoadElement - 1)) timeout = true; } CheckTimeOut(); }; Action GetAudioFile= () => { for (int k = 0; k < tryLoadElement; k++) { var audioButton = tab.FindElementByAttribute("a", "innerhtml", "Download mp3 file", "text", 0); if (!audioButton.IsVoid) { project.SendInfoToLog("Downloading audio file", needShowMessages); audioButton.Click(); break; } else System.Threading.Thread.Sleep(waitTime); CheckMediaError(); if (k == (tryLoadElement - 1)) timeout = true; } CheckTimeOut(); }; Action Recognize= () => { // waiting loading file tab.WaitDownloading(); CheckMediaError(); file = audioFolder + "\\media.mp3"; for (int k = 0; k < tryLoadElement; k++) { if (File.Exists(file)) break; else System.Threading.Thread.Sleep(waitTime); if (k == (tryLoadElement - 1)) timeout = true; } CheckTimeOut(); // getting audio bytes var bytes = File.ReadAllBytes(file); if (bytes.Length < 1024) throw new Exception("Error loading file"); project.SendInfoToLog("Recognizing", needShowMessages); string str = Convert.ToBase64String(bytes); var rc = ZennoPoster.CaptchaRecognition("CapMonster2.dll", str, "CapMonsterModule=ZennoLab.AudioSolveMedia&ParallelMode=true"); answer = rc.Split(new [] {"-|-"}, StringSplitOptions.RemoveEmptyEntries)[0]; }; Action InputAnswer= () => { if (!String.IsNullOrEmpty(answer) && answer != "sorry") { project.SendInfoToLog("Inserting answer", needShowMessages); HtmlElement audioAnswerInput = tab.FindElementByAttribute("input:text", "id", "adcopy_response", "text", 0); if (!audioAnswerInput.IsVoid) { audioAnswerInput.SetValue(answer, "None", false); } System.Threading.Thread.Sleep(waitTime); } else throw new Exception("Answer not received"); }; // Recognizing captcha try { instance.DownloadsPath = audioFolder; OpenAudioForm(); GetAudioFile(); Recognize(); InputAnswer(); return "ok"; } finally { CheckFileDeleting(); }

Замечания по качеству распознавания

Обращаем Ваше внимание на необходимость использования качественных прокси. Как и графическая версия данной каптчи, так и звуковая, при многократном обращении начинают сильно искажаться, что делает её трудно распознаваемой, как для человека, так и для нашей системы. В связи с этим, указанный в модуле процент, является относительным. Так, при «свежем» IP-адресе, процент часто выше заявленного, а после нескольких сотен распознанных каптч начинает снижаться по естественным причинам. Также, влияет количество слов, произносимых в аудио записи.

Примечание

Перед загрузкой страницы на которой находится Solve Media и использованием сниппета Вам необходимо выключить плагины, иначе не появится ссылка на скачивание аудио файла.

Следует обратить внимание на основные параметры выполнения сниппета, которые Вы сможете менять под свои нужды: время ожидания загрузки элемента, количество попыток загрузить элемент на странице, папка временного хранения аудио файлов, которая будет создана в директории с Вашим проектом:

1 2 3 4 5 6 // waiting timeout var waitTime = 1000; // attempts to load web element var tryLoadElement = 60; // folder for saving audio files var mainAudiofolderName = "sm_audio";

Функция отправки каптчи на сервис выглядит следующим образом:

1 ZennoPoster.CaptchaRecognition("CapMonster2.dll", base64StringAudioBytes, "CapMonsterModule=ZennoLab.AudioSolveMedia");