Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Random regRandom = new Random(); //формируем разные рандомные числа вне цикла
- //Объявляем переменные и получаем данные
- string strFilePath = project.Variables["akksMail"].Value;//Путь до файла с mail аккаунтами
- string strProxyPath = project.Variables["pathProxyFile"].Value;//Путь до файла с прокси
- string strFolderPhotoPath = project.Variables["pathPhotoFolder"].Value;//Путь до папки с фотографиями
- bool blnCookies = Convert.ToBoolean(project.Variables["boolCookies"].Value);//Предварительный набор куков
- bool blnPhotoDownl = Convert.ToBoolean(project.Variables["boolPhotoAva"].Value);//Загружать аватар
- bool blnEnLang = Convert.ToBoolean(project.Variables["boolEnLang"].Value);//Устанавливать английский интерфейс аккаунта
- string strRegisteredMail = String.Empty;//Переменная для почты, на которую регистрируем аккаунт
- string strPhotoPath = String.Empty;//Переменная - Путь до фотографии
- string pass = String.Empty;//Переменная для пароля почты, на которую регистрируем аккаунт
- IZennoList lstMailAkk = project.Lists["Mail-akk"];//Создаём объект класса IZennoList, привязываемся к списку уровня проекта
- string strAkkMail = String.Empty;//Переменная - строка с почтой из списка
- //Проверяем наличие пути до файла с почтой во Входных настройках
- if (strFilePath==""){
- project.SendErrorToLog("Не указан путь до файла с почтой. Внимательно заполните Входные настройки и повторите заново", true);//Если переменная пуста, то сообщаем об ошибке
- throw new Exception("Не указан путь до файла с почтой");//прерываем работу по ошибке
- }
- //
- //устанавливаем прокси (при необходимости)
- string strProxy = String.Empty;// переменная с прокси
- string protocol = String.Empty;// переменная протокола прокси
- //Проверяем условия выбора прокси во Входных настройках
- switch(project.Variables["cfg_proxy"].Value) {
- case "без прокси":
- instance.SetProxy("");
- break;
- case "прокси профиля":
- break;
- case "чекер (без удаления)":
- strProxy = ZennoPoster.GetProxyWithOutDelete("");
- break;
- case "чекер(с удалением)":
- strProxy = ZennoPoster.GetProxy("");
- break;
- case "proxies.txt":
- IZennoList lstProxies = project.Lists["lst_proxy"];
- //проверяем путь до файла с прокси во Входных настройках
- if (strProxyPath==""){
- project.SendErrorToLog("Не указан путь до файла с прокси. Внимательно заполните Входные настройки и повторите заново", true);//если выбран режим прокси из файла, но путь до файла не указан - сообщаем об этом
- throw new Exception("Не указан путь до файла с прокси");//прерываем работу по ошибке
- }
- project.SendInfoToLog("Устанавливаем прокси из файла!", true);//сообщаем о том, что прокси берутся из файла
- int count = 21; // количество неудачных проверок прокси подряд
- protocol = project.Variables["Protocol"].Value+"://"; // из переменной, в переменной значение socks5:// или http:// (пустая переменная = http://)
- //Используем отдельный lock из Общего кода
- lock(CommonCode.LockProxyStr) {
- if (lstProxies.Count>0) {
- for (int i = 1; i < count; i++) {
- if (lstProxies.Count == 0) break;
- strProxy = lstProxies[0];
- lstProxies.RemoveAt(0);
- var content = ZennoPoster.HttpGet("https://www.facebook.com/", protocol + strProxy, "UTF-8", Timeout:6000);//задаем адрес, до которого прокси будет пытаться сделать запрос, указываем протокол и сами прокси, кодировку и таймаут ожидания (1000=1 секунде, можете изменять на свое усмотрение. Если этого параметра нет, то ожидание равно 30 сек.)
- if (content.ToString().Length >=520) {//задаем минимальное количество символов в ответе (это не код ответа, а именно кол-во символов)
- lstProxies.Add(strProxy); // записываем живую проксю в конец списка
- instance.SetProxy(protocol + strProxy,false,true,true); // Установка прокси с эмуляцией таймзоны на основе IP
- project.SendInfoToLog(protocol + strProxy);
- break;
- } project.SendErrorToLog("Попытка: " +i+ ". Прокси плохая, чекаю ещё!", true);
- } if (string.IsNullOrWhiteSpace(instance.GetProxy())){
- project.SendErrorToLog("Проверьте список прокси на актуальность и наличие рабочих прокси!", true);
- throw new Exception("Ошибка при проверке проксей!");
- }
- }else{
- project.SendErrorToLog("STOP: Нет прокси в файле proxies.txt", true);
- throw new Exception("Файл с прокси пуст.");
- }
- }break;
- }
- instance.SetProxy(protocol + strProxy, false, true, true); //выставляем в true параметры emulateGeolocation, emulateTimezone
- project.SendInfoToLog("Назначен прокси: " + strProxy, true);//сообщаем о назначенном прокси
- //
- //Уникализируем и настраиваем систему и браузер
- instance.ClearCache(); //чистим кэш
- instance.ClearCookie();//чистим куки
- instance.UsePlugins = false; //Отключаем Flash/Silverlight
- instance.CanvasRenderMode = ZennoLab.InterfacesLibrary.Enums.Browser.CanvasMode.Emulate; //включаем эмуляцию канваса
- instance.CanvasRenderSeed = Guid.NewGuid().ToString(); //генерируем новый Canvas Seed
- instance.UseAdds = false; // Режим показа рекламы запрещён
- //ClientRects
- //Эмулировать
- instance.ClientRectWorkMode = ZennoLab.InterfacesLibrary.Enums.Browser.ClientRectMode.Emulate;
- //AudioContext
- //Эмулировать
- instance.AudioContextMode = ZennoLab.InterfacesLibrary.Enums.Browser.AudioMode.Emulate;
- instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.DoNotTrack);
- instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.DoNotTrack, "1"); // Включает Do Not Track
- // 0 - Выключает, 1 - Включает, null - "Мне всё равно"
- // Выбираем случайную версию Firefox
- Random ua = new Random();
- //Формируем набор buildID нашего Firefox (у каждой версии свой)
- Tuple<string, string>[] buildIDSet = {
- Tuple.Create("58", "20180118215408"), // 58
- Tuple.Create("58", "20180128191252"), // 58.0.1
- Tuple.Create("57", "20171112125346"), // 57
- Tuple.Create("56", "20171024165158"), // 56.0.2
- Tuple.Create("56", "20171002220106"), // 56.0.1
- Tuple.Create("56", "20170926190823"), // 56
- Tuple.Create("57", "20180103231032"), // 57.0.4
- Tuple.Create("57", "20171206182557"), // 57.0.2
- Tuple.Create("57", "20171112125346") // 57.0.1
- };
- // Версия
- int currentBuild = ua.Next(buildIDSet.Length);
- string version = buildIDSet[currentBuild].Item1;
- // Устанавливаем BuildID
- instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.BuildId);
- instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.BuildId, buildIDSet[currentBuild].Item2);
- // Устанавливаем Vendor
- instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.Vendor);
- instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.Vendor, null);
- // Устанавливаем VendorSub
- instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.VendorSub);
- instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.VendorSub, null);
- // Формируем набор версий операционной системы Windows
- // 6.0 Windows Vista
- // 6.1 Windows 7
- // 6.2 Windows 8
- // 6.3 Windows 8.1
- // 10.0 Windows 10
- string winOC = Macros.TextProcessing.Spintax("{6.0|6.1|6.2|6.3|10.0}");
- string platform = Macros.TextProcessing.Spintax("{Win32|Win64}");
- // Определяем "битность" самого приложения
- string platformApp = string.Empty;
- if(platform=="Win32"){
- platformApp = Macros.TextProcessing.Spintax("{; WOW64|}");
- } else {
- platformApp = "; Win64; x64";
- }
- // OC
- project.Profile.UserAgentOsCpu = string.Format("Windows NT {0}{1}", winOC, platformApp);
- project.Profile.UserAgentPlatform = platform;
- // Устанавливаем Useragent
- project.Profile.UserAgent = string.Format("Mozilla/5.0 (Windows NT {0}{1}; rv:{2}.0) Gecko/20100101 Firefox/{2}.0", winOC, platformApp, version);
- project.Profile.UserAgentAppVersion = "5.0 (Windows)";
- project.Profile.UserAgentAppName = "Netscape";
- project.Profile.UserAgentAppCodeName = "Mozilla";
- project.Profile.UserAgentProduct = "Gecko";
- project.Profile.UserAgentProductSub = "20100101";
- Random lang = new Random();
- // Формируем набор возможных вариантов Accept-Language
- // Здесь присутствует как русский язык, так и иностранный.
- // Если необходимо, чтобы выборка была по какому-то определенному признаку - закоментируйте или удалите не нужные строки.
- string[] acceptLanguageSet = {
- "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4",
- "ru-RU,ru;q=0.9,en;q=0.8",
- "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3",
- // "en-US,en;q=0.5",
- //"en-US,en;q=0.8,es;q=0.6",
- // "en-US,en;q=0.8,nl;q=0.6,el;q=0.4,de;q=0.2"
- };
- // Устанавливаем Accept-Language
- string acceptLanguage = acceptLanguageSet[lang.Next(0, acceptLanguageSet.Length)].ToString();
- project.Profile.AcceptLanguage = acceptLanguage;
- // Устанавливаем настройки языка
- project.Profile.UserAgentBrowserLanguage = acceptLanguage.Substring(0, acceptLanguage.IndexOf(','));
- project.Profile.UserAgentLanguage = acceptLanguage.Substring(0, acceptLanguage.IndexOf(','));
- Random r = new Random();
- // Формируем набор популярных десктопных разрешений [Идея хранения позаимствована у doc'a, за что ему большая благодарность!]
- int [,] resolutionSet = {
- {2880, 1800},
- {2560, 1600},
- {2560, 1440},
- {1920, 1200},
- {1920, 1080},
- {1680, 1050},
- {1600, 1200},
- {1600, 900},
- {1440, 900},
- {1366, 768},
- {1280, 1024},
- {1280, 800},
- {1280, 768},
- {1080, 1920},
- };
- // Получаем рандомное разрешение и устанавливаем
- int resolution = r.Next(resolutionSet.Length/2);
- project.Profile.ScreenSizeWidth = resolutionSet[resolution, 0];
- project.Profile.ScreenSizeHeight = resolutionSet[resolution, 1];
- // Видимая область
- project.Profile.AvailScreenWidth = project.Profile.ScreenSizeWidth-17;
- project.Profile.AvailScreenHeight = project.Profile.ScreenSizeHeight-142;
- // Глубина цвета монитора (Color Depth)
- // [Чуть позже будет обновление механизма установки этого параметра]
- instance.SetScreenPreference("screen_color_depth", 24);
- //WebGL
- instance.SetBrowserPreference("webgl.disabled", true);
- instance.SetBrowserPreference("webgl.enable-webgl2", false);
- instance.SetBrowserPreference("webgl.disable-extensions", true);
- instance.SetBrowserPreference("webgl.min_capability_mode", true);
- //
- //WebRTC
- if (strProxy!=String.Empty) {
- //Устанавливаем эмуляцию WebRTC
- string strInnerIpV4 = String.Format("192.168.{0}.{1}", regRandom.Next(1, 101), regRandom.Next(1, 255));
- string strNatAddress = String.Format("{0}:{1}", new Regex(@"(?<=://).*?(?=:)").Match(strProxy).Value, regRandom.Next(100, 65535));
- instance.SetWebRTCAdresses(strInnerIpV4, String.Empty, strNatAddress, ZennoLab.InterfacesLibrary.Enums.Browser.WebRTCMode.Emulate);
- }
- //
- //Предварительный набор куков
- Tab Tab1 = instance.ActiveTab;
- Tab1.Navigate("whoer.net");//смотрим успешность установки прокси. Эту строку и две строки ниже можно закомментировать
- Tab1.WaitDownloading();//ждем загрузки страницы
- Thread.Sleep(regRandom.Next(3500, 5500));//дополнительная рандомная пауза
- //Если включен набор куков, то выполняем код ниже
- if (blnCookies) {
- //Набор куков через поисковые запросы № 1
- //При необходимости можно сделать несколько таких блоков с разными поисковыми запросами
- Tab1.Navigate(String.Format("https://search.yahoo.com/search?p={0}", project.Profile.Surname));
- Tab1.WaitDownloading();
- List<HtmlElement> lstSearchResults = Tab1.FindElementsByXPath("//h3/a").ToList();
- if (lstSearchResults.Count>0) {
- //задаем количество ссылок которые нужно открыть (от и до)
- for (int i=0; i<regRandom.Next(4, 7); i++) {
- //задаем номер первого совпадения
- int intResultNum = regRandom.Next(1, lstSearchResults.Count);
- lstSearchResults[intResultNum].Click();
- Thread.Sleep(regRandom.Next(3000, 5000));//рандомная пауза
- instance.GetTabByAddress("popup").Close();//закрываем окно
- lstSearchResults.RemoveAt(intResultNum);
- }
- }else
- {
- project.SendErrorToLog("Не получается эмулировать поиск на yahoo, завершаем работу");//в случае непредвиденных ошибок информируем об этом и пробуем выполнить код ниже
- }
- }
- //
- //Регистрация аккаунта
- //IZennoList.Count: получаем количество строк в списке (файле)
- int intMailAkk = lstMailAkk.Count;
- if (intMailAkk==0) {
- project.SendErrorToLog("Файл с email пустой. Работа остановлена", true);//если количество строк равно нулю, сообщаем об этом
- throw new Exception("Закончился список с email");//прерываем работу из-за пустого списка с почтами
- }
- project.SendInfoToLog(String.Format("В списке Mail-akk содержится {0} записей", intMailAkk), true);//сообщаем о количестве строк в файле с почтами
- //Получаем почтовый аккаунт из файла
- //Используем отдельный lock из Общего кода
- lock(CommonCode.LockMailAkk) {
- strAkkMail = lstMailAkk[0];//берем первую строку
- lstMailAkk.RemoveAt(0);//удаляем первую строку
- }
- //Разделяем полученную строку сплитом
- string[] strMailAkk = strAkkMail.Split(';');//задаем символ разделителя строки (если у вас разделитель : (двоеточие), то поставьте его вместо ; )
- strRegisteredMail = strMailAkk[0];//первая часть строки = email
- pass = strMailAkk[1];//вторая часть строки = пароль почты
- //
- //Переходим к целевому сайту
- Tab1.Navigate("https://www.facebook.com/");
- Tab1.WaitDownloading();//ожидаем загрузку
- Thread.Sleep(regRandom.Next(3500, 5500));//дополнительная пауза
- project.SendInfoToLog("Перешли на facebook.com", true);//сообщение в лог
- //заполняем имя
- HtmlElement elFirstNameFB = Tab1.FindElementByXPath("//input[@name='firstname']", 0);
- if (elFirstNameFB.IsVoid) throw new Exception("Не удалось найти elFirstNameFB (поле ввода имени)");
- Tab1.FullEmulationMouseMoveToHtmlElement(elFirstNameFB);
- Thread.Sleep(regRandom.Next(500, 2500));//дополнительная рандомная пауза для эмуляции живого человека
- Tab1.FullEmulationMouseClick("left", "click");
- instance.SendText(project.Profile.Name, regRandom.Next(250, 550));//вводим Имя с рандомной задержкой в миллисекундах
- project.SendInfoToLog("Заполнили имя", true);
- Thread.Sleep(regRandom.Next(1500, 2500));//дополнительная рандомная пауза для эмуляции живого человека
- //заполняем фамилию
- HtmlElement elLastNameFB = Tab1.FindElementByXPath("//input[@name='lastname']", 0);
- if (elLastNameFB.IsVoid) throw new Exception("Не удалось найти elLastNameFB (поле ввода фамилии)");
- Tab1.FullEmulationMouseMoveToHtmlElement(elLastNameFB);
- Thread.Sleep(regRandom.Next(500, 2500));
- Tab1.FullEmulationMouseClick("left", "click");
- instance.SendText(project.Profile.Surname, regRandom.Next(240, 650));//вводим Фамилию с рандомной задержкой в миллисекундах
- project.SendInfoToLog("Заполнили фамилию", true);
- Thread.Sleep(regRandom.Next(1500, 2500));
- //заполняем e-mail
- HtmlElement elEmailFB = Tab1.FindElementByXPath("//input[@name='reg_email__']", 0);
- if (elEmailFB.IsVoid) throw new Exception("Не удалось найти elEmailFB (поле ввода E-mail)");
- Tab1.FullEmulationMouseMoveToHtmlElement(elEmailFB);
- Thread.Sleep(regRandom.Next(500, 2500));
- Tab1.FullEmulationMouseClick("left", "click");
- instance.SendText(strRegisteredMail, regRandom.Next(400, 700));//вводим Почту с рандомной задержкой в миллисекундах
- project.SendInfoToLog("Заполнили E-mail", true);
- Thread.Sleep(regRandom.Next(2500, 4500));//ставим паузу, чтобы подгрузилось дополнительное окошко для повторного ввода почты
- //заполняем повторно e-mail
- HtmlElement elEmailFB2 = Tab1.FindElementByXPath("//input[@name='reg_email_confirmation__']", 0);
- if (elEmailFB2.IsVoid) throw new Exception("Не удалось найти elEmailFB2 (поле ввода E-mail)");
- Tab1.FullEmulationMouseMoveToHtmlElement(elEmailFB2);
- Thread.Sleep(regRandom.Next(500, 2500));
- Tab1.FullEmulationMouseClick("left", "click");
- instance.SendText(strRegisteredMail, regRandom.Next(420, 720));
- project.SendInfoToLog("Заполнили E-mail повторно", true);
- Thread.Sleep(regRandom.Next(3500, 5500));
- //заполняем пароль
- HtmlElement elPasswordFB = Tab1.FindElementByXPath("//input[@name='reg_passwd__']", 0);
- if (elPasswordFB.IsVoid) throw new Exception("Не удалось найти elPasswordFB (поле ввода пароля)");
- Tab1.FullEmulationMouseMoveToHtmlElement(elPasswordFB);
- Thread.Sleep(regRandom.Next(500, 2500));
- Tab1.FullEmulationMouseClick("left", "click");
- instance.SendText(project.Profile.Password, regRandom.Next(350, 700));
- project.SendInfoToLog("Заполнили пароль", true);
- Thread.Sleep(regRandom.Next(1000, 2500));
- //заполняем день рождения
- HtmlElement elBirthDayFB = Tab1.FindElementByXPath("//select[@name='birthday_day']", 0);
- if (elBirthDayFB.IsVoid) throw new Exception("Не удалось найти elBirthDayFB (поле ввода дня рождения)");
- Tab1.FullEmulationMouseMoveToHtmlElement(elBirthDayFB);
- Thread.Sleep(regRandom.Next(500, 2500));
- Tab1.FullEmulationMouseClick("left", "click");
- instance.SendText(project.Profile.BornDay.ToString(), regRandom.Next(200, 450));
- project.SendInfoToLog("Заполнили день рождения", true);
- Thread.Sleep(regRandom.Next(2000, 3500));
- //выбираем месяц рождения
- HtmlElement elBirthMonthContainerFB = Tab1.FindElementByXPath("//select[@name='birthday_month']", 0);
- if (elBirthMonthContainerFB.IsVoid) throw new Exception("Не удалось найти elBirthMonthFB (элемент выбора месяца рождения)");
- Tab1.FullEmulationMouseMoveToHtmlElement(elBirthMonthContainerFB);
- Thread.Sleep(regRandom.Next(500, 2500));
- Tab1.FullEmulationMouseClick("left", "click");
- Thread.Sleep(regRandom.Next(500, 2500));
- //Делаем фокус и щелкаем стрелку вниз на клавиатуре. Кол-во нажатий равно номеру месяца.
- //Т.к. по-умолчанию в ФБ выбрана не первая позиция, то принудительно поднимаем текущую позицию до первой
- elBirthMonthContainerFB.Focus();
- for (int i=0; i<13; i++){
- instance.ActiveTab.KeyEvent("Up", "press", "");
- Thread.Sleep(regRandom.Next(80, 200));
- }
- elBirthMonthContainerFB.Focus();
- //Теперь выбираем месяц, соответствующий месяцу рождения в профиле
- for (int i=0; i<project.Profile.BornMonth; i++){
- instance.ActiveTab.KeyEvent("Down", "press", "");
- Thread.Sleep(regRandom.Next(100, 400));
- }
- project.SendInfoToLog("Заполнили месяц рождения", true);
- Thread.Sleep(regRandom.Next(2500, 3500));
- //заполняем год рождения
- HtmlElement elBirthYearFB = Tab1.FindElementByXPath("//select[@name='birthday_year']", 0);
- if (elBirthYearFB.IsVoid) throw new Exception("error: Не удалось найти elBirthYearFB (поле ввода года рождения)");
- Tab1.FullEmulationMouseMoveToHtmlElement(elBirthYearFB);
- Thread.Sleep(regRandom.Next(500, 2500));
- Tab1.FullEmulationMouseClick("left", "click");
- instance.SendText(project.Profile.BornYear.ToString(), regRandom.Next(250, 550));
- project.SendInfoToLog("Заполнили год рождения", true);
- Thread.Sleep(regRandom.Next(2000, 3500));
- //указываем пол
- //если пол профиля не равен мужскому полу
- if (project.Profile.Sex!=ProfileSex.Male) {
- HtmlElement elSexFB = Tab1.FindElementByXPath("//label[text()='Женщина']|//label[text()='Female']", 0);
- if (elSexFB.IsVoid) throw new Exception("Не удалось найти elSexFB (поле выбора пола - женский)");
- Tab1.FullEmulationMouseMoveToHtmlElement(elSexFB);
- Thread.Sleep(regRandom.Next(500, 2500));
- Tab1.FullEmulationMouseClick("left", "click");
- project.SendInfoToLog("Выбрали пол женский", true);
- }else{
- HtmlElement elSexFB = Tab1.FindElementByXPath("//label[text()='Мужчина']|//label[text()='Male']", 0);
- if (elSexFB.IsVoid) throw new Exception("error: Не удалось найти elSexFB (поле выбора пола - мужской)");
- Tab1.FullEmulationMouseMoveToHtmlElement(elSexFB);
- Thread.Sleep(regRandom.Next(500, 2500));
- Tab1.FullEmulationMouseClick("left", "click");
- project.SendInfoToLog("Выбрали пол мужской", true);
- }
- Thread.Sleep(regRandom.Next(2500, 4500));
- //Нажимаем Создать аккаунт
- HtmlElement elNextButtonFB = Tab1.FindElementByXPath("//button[@name='websubmit']|//button[text()='Создать аккаунт']|//button[text()='Create Account']|//button[text()='Create an account']", 0);
- if (elNextButtonFB.IsVoid) throw new Exception("Не удалось найти elNextButtonFB (кнопка Создать аккаунт).");
- Tab1.FullEmulationMouseMoveToHtmlElement(elNextButtonFB);
- Thread.Sleep(regRandom.Next(500, 2500));
- Tab1.FullEmulationMouseClick("left", "click");
- project.SendInfoToLog("Нажали Создать аккаунт", true);
- Tab1.WaitDownloading();
- Thread.Sleep(regRandom.Next(35000, 45000)); //Пауза для ожидания получения письма на почту
- //
- //Подтверждение аккаунта по почте
- //Из-за того, что на mail.ru письма подтверждения приходят с большой задержкой, пришлось выставить большие задержки в проверке наличия письма
- string strConfirm = String.Empty;
- if (strProxy==""){
- strConfirm = ZennoPoster.MailConfirm("60;120;300;600", strRegisteredMail, pass, "imap.mail.ru",
- 993, true, false, true, false, @"""Facebook""", @"(http://|https://|)(www|).*(\.(com|ru|edu|net|org|info)).*(verify|confirm|invite).*", 0, false, new string[]{"INBOX"});
- } else {
- strConfirm = ZennoPoster.MailConfirm("60;120;300;600", strRegisteredMail, pass, "imap.mail.ru",
- 993, true, false, true, false, @"""Facebook""", @"(http://|https://|)(www|).*(\.(com|ru|edu|net|org|info)).*(verify|confirm|invite).*", 0, false, new string[]{"INBOX"}, protocol + strProxy);
- }
- project.SendInfoToLog("Выполнено! Ссылка из письма: " + strConfirm, true);
- Tab1.Navigate(strConfirm);
- Tab1.WaitDownloading();
- Thread.Sleep(regRandom.Next(5500, 8500));
- Tab1 = instance.ActiveTab;
- Tab1.Navigate("https://www.facebook.com/");
- Tab1.WaitDownloading();
- Thread.Sleep(2000);
- project.SendInfoToLog("Перешли на facebook.com", true);
- //
- //Сохранение результатов регистрации
- //Чтобы гарантировано сохранить результаты регистрации располагаем код сохранения до выполнения дополнительных настроек
- //Тут для блокировки используем стандартный код
- lock(SyncObjects.ListSyncer) {
- File.AppendAllText(project.Directory + @"\accounts-FB.txt", strRegisteredMail + ";" + project.Profile.Password + ";" + project.Profile.Name + ";" + project.Profile.Surname + ";" + project.Profile.BornDay + ";" + project.Profile.BornMonth + ";" + project.Profile.BornYear + ";" +strRegisteredMail + ";" + pass + Environment.NewLine); //После успешной регистрации сохраняем в файл информацию - логин, пароль, дату рождения, логин почты, пароль почты
- }
- //Информируем об успешной регистрации
- project.SendInfoToLog("Регистрация аккаунта Facebook завершена успешно! Зарегистрирован аккаунт: " +strRegisteredMail + ";" + project.Profile.Password + ";" + project.Profile.Name + ";" + project.Profile.Surname, true);
- //Сохраняем текущий профиль в файл .zpprofile
- project.Profile.Save(project.Directory + @"\profiles\" + strRegisteredMail + ".zpprofile", true, true, true, true, true, true, true, true, true);//сохраняем профиль зарегистрированного аккаунта в подпапку profiles
- //Информируем о сохранении профиля
- project.SendInfoToLog("Сохранили данные в файл accounts-FB.txt. Сохранили текущий профиль в папке profiles\\" +strRegisteredMail+ ".zpprofile", true);
- //
- //Если включена установка аватарки, выполняем код ниже
- if (blnPhotoDownl) {
- //Добавляем фото на аватарку
- //Переходим на профиль
- HtmlElement elProfileButtonFB = Tab1.FindElementByXPath("//a[contains(@href,'https://www.facebook.com/') and contains(@title,'Profile')]|//a[contains(@href,'https://www.facebook.com/') and contains(@title,'Профиль')]", 0);
- if (elProfileButtonFB.IsVoid) {
- project.SendErrorToLog("Не удалось найти elProfileButtonFB (кнопка Профиль аккаунта).");
- string url = instance.ActiveTab.URL;
- string regFBUrl = @"(?<=https://www\.facebook\.com/).*?(?=/block/)";
- string resUrl = new Regex(regFBUrl).Match(url).Value;
- if (resUrl=="checkpoint"){
- project.SendInfoToLog ("Чекпоинт. Надо привязать номер телефона.", true);
- //объявляем необходимые переменные
- string strPhoneNumber = String.Empty;
- string strConfirmationCode = String.Empty;
- //
- //Открываем окно с телефоном
- HtmlElement elPhoneTab = Tab1.FindElementByXPath("//a[contains(@href, 'confirmation?source=smsscarce')]", 0);
- if (elPhoneTab.IsVoid) return "error: Не удалось найти elPhoneTab (поменялась верстка)";
- Tab1.FullEmulationMouseMoveToHtmlElement(elPhoneTab);
- Thread.Sleep(regRandom.Next(500, 2500));
- Tab1.FullEmulationMouseClick("left", "click");
- Tab1.WaitDownloading();
- Thread.Sleep(regRandom.Next(2500, 3500));
- project.SendInfoToLog("Перешли на окно ввода № телефона", true);
- //получаем номер телефона и id регистрации
- string strRegistrationID = ZennoPoster.Sms.GetNumber("SmsActivate.dll", out strPhoneNumber, "fb", "&country=0");
- project.SendInfoToLog("Получен телефонный номер: " + strPhoneNumber);
- string regNumber = @"(?<=7).*";
- string strPhoneNumber2 = new Regex(regNumber).Match(strPhoneNumber).Value;//СМС-Активейт отдает номер телефона с 7, а вводить надо без 7, поэтому используем регулярку
- //сообщаем сервису, что в ближайшие 2 минуты на номер придёт смс от указанного нами сервиса
- string strSetStatusResult = ZennoPoster.Sms.SetStatus("SmsActivate.dll", strRegistrationID, InterfacesLibrary.SmsService.Enums.SmsServiceStatus.Ready);
- if (strSetStatusResult=="Ready") {
- //заполняем номер телефона в поле и нажимаем "Получить код"
- Tab1.FindElementByXPath("//input[@name='contact_point']", 0).SetValue(strPhoneNumber2, instance.EmulationLevel);
- Thread.Sleep(regRandom.Next(500, 1000));
- //кликаем Продолжить
- HtmlElement elNextChek = Tab1.FindElementByXPath("//button[contains(@type, 'submit') and contains(@class, 'layerConfirm')]", 0);
- if (elNextChek.IsVoid) return "error: Не удалось найти elNextChek (поле ввода года рождения)";
- Tab1.FullEmulationMouseMoveToHtmlElement(elNextChek);
- //Thread.Sleep(regRandom.Next(500, 2500));
- Tab1.FullEmulationMouseClick("left", "click");
- //Задаем проверку получения кода и ожидание. Общее время ожидания не может быть больше 20 минут
- strConfirmationCode = ZennoPoster.Sms.GetStatus("SmsActivate.dll", strRegistrationID, "", timeout:20);
- //Заполняем поле кодом подтверждения
- Tab1.FindElementByXPath("//input[@name='pin']", 0).SetValue(strConfirmationCode, instance.EmulationLevel);
- project.SendInfoToLog("Получен код подтверждения: " + strConfirmationCode, true);
- Tab1.FindElementByXPath("//button[contains(@type, 'submit') and contains(@class, 'layerConfirm') and contains(text(), 'Подтвердить')]", 0).Click();
- }
- } else {
- project.SendErrorToLog("Произошла ошибка. Завершаем работу.", true);
- throw new Exception("Ошибка. Завершаем работу");
- }
- }
- //
- Tab1.FullEmulationMouseMoveToHtmlElement(elProfileButtonFB);
- Thread.Sleep(regRandom.Next(500, 2500));
- Tab1.FullEmulationMouseClick("left", "click");
- project.SendInfoToLog("Перешли в профиль аккаунта", true);
- Tab1.WaitDownloading();
- Thread.Sleep(regRandom.Next(1500, 3500));
- //Выбираем добавить фото
- HtmlElement elPhotoButtonFB = Tab1.FindElementByXPath("//div[@class='photoContainer']//a[contains(text(),'Add Photo')]|//div[@class='photoContainer']//a[contains(text(),'Добавить фото')]", 0);
- if (elPhotoButtonFB.IsVoid) throw new Exception("Не удалось найти elPhotoButtonFB (кнопка Добавить фото).");
- Tab1.FullEmulationMouseMoveToHtmlElement(elPhotoButtonFB);
- Thread.Sleep(regRandom.Next(500, 2500));
- Tab1.FullEmulationMouseClick("left", "click");
- project.SendInfoToLog("Нажали Добавить фото", true);
- Tab1.WaitDownloading();
- Thread.Sleep(regRandom.Next(2500, 4500));
- //Формируем список доступных фотографий
- //Присваиваем переменной путь к папке с файлами
- string strPhotoDirectoryPath = strFolderPhotoPath;
- Directory.CreateDirectory(strPhotoDirectoryPath); //создадим директорию, перечень файлов из которой будем получать
- //Созданим объект списка, связанный со списком уровня проекта "Список 1", очистим этот список
- IZennoList lstPhotoPath = project.Lists["Список 1"];
- lstPhotoPath.Clear();
- //Directory.EnumerateFiles: получаем список файлов
- lstPhotoPath.AddRange(Directory.EnumerateFiles(strPhotoDirectoryPath, "*.jpg", SearchOption.AllDirectories));
- // Если необходимо получить файлы только из исходной папки, но не из вложенных папок, используйте SearchOption.TopDirectoryOnly вместо SearchOption.AllDirectories
- //
- int intPhotoPath = lstPhotoPath.Count;
- project.SendInfoToLog(String.Format("В списке Список 1 содержится {0} записей", intPhotoPath), true);
- if (intPhotoPath==0) {
- project.SendErrorToLog("Нет фотографий в папке", true);
- //throw new Exception("Папка с фотографиями для загрузки пуста."); //Раскомментировать, если хотим, чтобы прерывалось выполнение без сохранения результатов в случае ошибки
- }
- //Берем фотографию с удалением
- //Чтобы в многопотоке брались разные файлы блокируем доступ к списку на все время загрузки фото, пока не удалим взятое фото из папки. Остальные потоки остановятся на этом этапе.
- //Используем отдельный lock из Общего кода
- lock(CommonCode.LockPhotoPath) {
- //получаем случайный элемент списка
- int intRandomPhotoPath = new Random().Next(0, lstPhotoPath.Count-1);
- strPhotoPath = lstPhotoPath[intRandomPhotoPath];//берем рандомную строку
- lstPhotoPath.RemoveAt(intRandomPhotoPath); //удаляем взятую рандомную строку
- project.SendInfoToLog("Взяли фото: " +strPhotoPath, true);
- //
- //Устанавливаем политику загрузки файла
- instance.SetFileUploadPolicy("ok", ""); //устанавливаем политику загрузки файлов
- //Instance.SetFilesForUpload - назначаем конкретный файл для загрузки при активации соответствующего элемента
- instance.SetFilesForUpload(strPhotoPath);//указываем путь до загружаемого файла через переменную
- //открываем окно выбора файла
- HtmlElement elPhotoDownload = Tab1.FindElementByXPath("//u[contains(text(), 'plus')]|//span[contains(text(), 'Загрузить фото')]|//span[contains(text(), 'Upload Photo')]|//span[contains(text(), 'Add Photo')]", 0);
- if (elPhotoDownload.IsVoid) project.SendErrorToLog("Не удалось найти elPhotoDownload (кнопка Открыть окно выбора файла).", true);//вместо уведомления об ошибке можно поставить прерывание выполнения, но тогда не сохранится результат
- Tab1.FullEmulationMouseMoveToHtmlElement(elPhotoDownload);
- Tab1.FullEmulationMouseClick("left", "click");
- Tab1.WaitDownloading();
- Thread.Sleep(regRandom.Next(7500, 10500));//Делаем паузу для загрузки фото (если скорость интернет-канала низкая или прокси медленные - увеличиваем время паузы)
- project.SendInfoToLog("Нажали открыть окно выбора фото", true);
- //
- //Выбираем Сохранить добавленное фото
- HtmlElement elPhotoOKFB = Tab1.FindElementByXPath("//button[contains(@data-testid, 'profilePicSaveButton') and contains(text(),'Сохранить')]|//button[contains(@data-testid, 'profilePicSaveButton') and contains(text(),'Save')]", 0);
- if (elPhotoOKFB.IsVoid) project.SendErrorToLog("Не удалось найти elPhotoOKFB (кнопка Сохранить фото).", true);//вместо уведомления об ошибке можно поставить прерывание выполнения, но тогда не сохранится результат
- Tab1.FullEmulationMouseMoveToHtmlElement(elPhotoOKFB);
- Thread.Sleep(regRandom.Next(500, 2500));
- Tab1.FullEmulationMouseClick("left", "click");
- project.SendInfoToLog("Нажали Сохранить фото", true);
- Tab1.WaitDownloading();
- Thread.Sleep(regRandom.Next(1500, 2500));
- //
- //Проверяем существование файла перед удалением
- if (!File.Exists(strPhotoPath)) {
- project.SendErrorToLog("Файл для удаления не найден: " + strPhotoPath, true);
- //throw new Exception("Не удалось найти файл фотографии для удаления"); //прерываем выполнение (выходим по красной ветке из сниппета). Раскомментировать код, если хотим, чтобы он выполнялся в случае ошибки.
- }
- File.Delete(strPhotoPath);//удаляем взятое фото
- project.SendInfoToLog("Готово! Файл удалён: " + strPhotoPath, true);
- }
- }
- //
- //Переводим интерфейс аккаунта на English (US)
- if (blnEnLang) {
- //Переходим на профиль
- Tab1.Navigate("https://www.facebook.com/");
- Tab1.WaitDownloading();
- Thread.Sleep(regRandom.Next(1200, 3500));
- project.SendInfoToLog("Перешли на facebook.com", true);
- //Выбираем English (US)
- HtmlElement elEnglishButton = Tab1.FindElementByXPath("//a[contains(text(),'English (US)')]", 0);
- if (elEnglishButton.IsVoid) {
- project.SendErrorToLog("Не удалось найти elEnglishButton (кнопка выбора English (US)). Возможно, аккаунт уже на английском интерфейсе.", true);
- //return "error";
- }
- Tab1.FullEmulationMouseMoveToHtmlElement(elEnglishButton);
- Thread.Sleep(regRandom.Next(500, 2500));
- Tab1.FullEmulationMouseClick("left", "click");
- project.SendInfoToLog("Нажали English (US)", true);
- Tab1.WaitDownloading();
- Thread.Sleep(regRandom.Next(1800, 3900));
- //Подтверждаем выбор English (US)
- HtmlElement elEnglishButOK = Tab1.FindElementByXPath("//button[contains(text(),'Изменить язык')]", 0);
- if (elEnglishButOK.IsVoid) project.SendErrorToLog("Не удалось найти elEnglishButOK (Подтверждение выбора English (US)). Возможно, аккаунт уже на английском интерфейсе.", true);
- Tab1.FullEmulationMouseMoveToHtmlElement(elEnglishButOK);
- Thread.Sleep(regRandom.Next(500, 2500));
- Tab1.FullEmulationMouseClick("left", "click");
- project.SendInfoToLog("Нажали подтверждение выбора English (US)", true);
- Tab1.WaitDownloading();
- Thread.Sleep(regRandom.Next(1500, 3500));
- }
- //
- //Переходим на главную страницу
- Tab1.Navigate("https://www.facebook.com/");
- Tab1.WaitDownloading();//ожидаем загрузку
- //
Advertisement
Add Comment
Please, Sign In to add comment