Guest User

Untitled

a guest
Oct 20th, 2019
769
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 40.56 KB | None | 0 0
  1. Random regRandom = new Random(); //формируем разные рандомные числа вне цикла
  2.  
  3. //Объявляем переменные и получаем данные
  4. string strFilePath = project.Variables["akksMail"].Value;//Путь до файла с mail аккаунтами
  5. string strProxyPath = project.Variables["pathProxyFile"].Value;//Путь до файла с прокси
  6. string strFolderPhotoPath = project.Variables["pathPhotoFolder"].Value;//Путь до папки с фотографиями
  7. bool blnCookies = Convert.ToBoolean(project.Variables["boolCookies"].Value);//Предварительный набор куков
  8. bool blnPhotoDownl = Convert.ToBoolean(project.Variables["boolPhotoAva"].Value);//Загружать аватар
  9. bool blnEnLang = Convert.ToBoolean(project.Variables["boolEnLang"].Value);//Устанавливать английский интерфейс аккаунта
  10. string strRegisteredMail = String.Empty;//Переменная для почты, на которую регистрируем аккаунт
  11. string strPhotoPath = String.Empty;//Переменная - Путь до фотографии
  12. string pass = String.Empty;//Переменная для пароля почты, на которую регистрируем аккаунт
  13. IZennoList lstMailAkk = project.Lists["Mail-akk"];//Создаём объект класса IZennoList, привязываемся к списку уровня проекта
  14. string strAkkMail = String.Empty;//Переменная - строка с почтой из списка
  15. //Проверяем наличие пути до файла с почтой во Входных настройках
  16. if (strFilePath==""){
  17. project.SendErrorToLog("Не указан путь до файла с почтой. Внимательно заполните Входные настройки и повторите заново", true);//Если переменная пуста, то сообщаем об ошибке
  18. throw new Exception("Не указан путь до файла с почтой");//прерываем работу по ошибке
  19. }
  20. //
  21. //устанавливаем прокси (при необходимости)
  22. string strProxy = String.Empty;// переменная с прокси
  23. string protocol = String.Empty;// переменная протокола прокси
  24. //Проверяем условия выбора прокси во Входных настройках
  25. switch(project.Variables["cfg_proxy"].Value) {
  26. case "без прокси":
  27. instance.SetProxy("");
  28. break;
  29. case "прокси профиля":
  30. break;
  31. case "чекер (без удаления)":
  32. strProxy = ZennoPoster.GetProxyWithOutDelete("");
  33. break;
  34. case "чекер(с удалением)":
  35. strProxy = ZennoPoster.GetProxy("");
  36. break;
  37. case "proxies.txt":
  38. IZennoList lstProxies = project.Lists["lst_proxy"];
  39. //проверяем путь до файла с прокси во Входных настройках
  40. if (strProxyPath==""){
  41. project.SendErrorToLog("Не указан путь до файла с прокси. Внимательно заполните Входные настройки и повторите заново", true);//если выбран режим прокси из файла, но путь до файла не указан - сообщаем об этом
  42. throw new Exception("Не указан путь до файла с прокси");//прерываем работу по ошибке
  43. }
  44. project.SendInfoToLog("Устанавливаем прокси из файла!", true);//сообщаем о том, что прокси берутся из файла
  45. int count = 21; // количество неудачных проверок прокси подряд
  46. protocol = project.Variables["Protocol"].Value+"://"; // из переменной, в переменной значение socks5:// или http:// (пустая переменная = http://)
  47. //Используем отдельный lock из Общего кода
  48. lock(CommonCode.LockProxyStr) {
  49. if (lstProxies.Count>0) {
  50. for (int i = 1; i < count; i++) {
  51. if (lstProxies.Count == 0) break;
  52. strProxy = lstProxies[0];
  53. lstProxies.RemoveAt(0);
  54. var content = ZennoPoster.HttpGet("https://www.facebook.com/", protocol + strProxy, "UTF-8", Timeout:6000);//задаем адрес, до которого прокси будет пытаться сделать запрос, указываем протокол и сами прокси, кодировку и таймаут ожидания (1000=1 секунде, можете изменять на свое усмотрение. Если этого параметра нет, то ожидание равно 30 сек.)
  55. if (content.ToString().Length >=520) {//задаем минимальное количество символов в ответе (это не код ответа, а именно кол-во символов)
  56. lstProxies.Add(strProxy); // записываем живую проксю в конец списка
  57. instance.SetProxy(protocol + strProxy,false,true,true); // Установка прокси с эмуляцией таймзоны на основе IP
  58. project.SendInfoToLog(protocol + strProxy);
  59. break;
  60. } project.SendErrorToLog("Попытка: " +i+ ". Прокси плохая, чекаю ещё!", true);
  61. } if (string.IsNullOrWhiteSpace(instance.GetProxy())){
  62. project.SendErrorToLog("Проверьте список прокси на актуальность и наличие рабочих прокси!", true);
  63. throw new Exception("Ошибка при проверке проксей!");
  64. }
  65. }else{
  66. project.SendErrorToLog("STOP: Нет прокси в файле proxies.txt", true);
  67. throw new Exception("Файл с прокси пуст.");
  68. }
  69. }break;
  70. }
  71. instance.SetProxy(protocol + strProxy, false, true, true); //выставляем в true параметры emulateGeolocation, emulateTimezone
  72. project.SendInfoToLog("Назначен прокси: " + strProxy, true);//сообщаем о назначенном прокси
  73. //
  74.  
  75. //Уникализируем и настраиваем систему и браузер
  76. instance.ClearCache(); //чистим кэш
  77. instance.ClearCookie();//чистим куки
  78. instance.UsePlugins = false; //Отключаем Flash/Silverlight
  79.  
  80. instance.CanvasRenderMode = ZennoLab.InterfacesLibrary.Enums.Browser.CanvasMode.Emulate; //включаем эмуляцию канваса
  81. instance.CanvasRenderSeed = Guid.NewGuid().ToString(); //генерируем новый Canvas Seed
  82. instance.UseAdds = false; // Режим показа рекламы запрещён
  83.  
  84. //ClientRects
  85. //Эмулировать
  86. instance.ClientRectWorkMode = ZennoLab.InterfacesLibrary.Enums.Browser.ClientRectMode.Emulate;
  87.  
  88. //AudioContext
  89. //Эмулировать
  90. instance.AudioContextMode = ZennoLab.InterfacesLibrary.Enums.Browser.AudioMode.Emulate;
  91.  
  92. instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.DoNotTrack);
  93. instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.DoNotTrack, "1"); // Включает Do Not Track
  94.  
  95. // 0 - Выключает, 1 - Включает, null - "Мне всё равно"
  96.  
  97. // Выбираем случайную версию Firefox
  98. Random ua = new Random();
  99.  
  100. //Формируем набор buildID нашего Firefox (у каждой версии свой)
  101. Tuple<string, string>[] buildIDSet = {
  102. Tuple.Create("58", "20180118215408"), // 58
  103. Tuple.Create("58", "20180128191252"), // 58.0.1
  104. Tuple.Create("57", "20171112125346"), // 57
  105. Tuple.Create("56", "20171024165158"), // 56.0.2
  106. Tuple.Create("56", "20171002220106"), // 56.0.1
  107. Tuple.Create("56", "20170926190823"), // 56
  108. Tuple.Create("57", "20180103231032"), // 57.0.4
  109. Tuple.Create("57", "20171206182557"), // 57.0.2
  110. Tuple.Create("57", "20171112125346") // 57.0.1
  111. };
  112. // Версия
  113. int currentBuild = ua.Next(buildIDSet.Length);
  114. string version = buildIDSet[currentBuild].Item1;
  115. // Устанавливаем BuildID
  116. instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.BuildId);
  117. instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.BuildId, buildIDSet[currentBuild].Item2);
  118. // Устанавливаем Vendor
  119. instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.Vendor);
  120. instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.Vendor, null);
  121. // Устанавливаем VendorSub
  122. instance.ShowNavigatorField(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.VendorSub);
  123. instance.SetHeader(ZennoLab.InterfacesLibrary.Enums.Browser.NavigatorField.VendorSub, null);
  124.  
  125. // Формируем набор версий операционной системы Windows
  126. // 6.0 Windows Vista
  127. // 6.1 Windows 7
  128. // 6.2 Windows 8
  129. // 6.3 Windows 8.1
  130. // 10.0 Windows 10
  131. string winOC = Macros.TextProcessing.Spintax("{6.0|6.1|6.2|6.3|10.0}");
  132. string platform = Macros.TextProcessing.Spintax("{Win32|Win64}");
  133.  
  134. // Определяем "битность" самого приложения
  135. string platformApp = string.Empty;
  136. if(platform=="Win32"){
  137. platformApp = Macros.TextProcessing.Spintax("{; WOW64|}");
  138. } else {
  139. platformApp = "; Win64; x64";
  140. }
  141. // OC
  142. project.Profile.UserAgentOsCpu = string.Format("Windows NT {0}{1}", winOC, platformApp);
  143. project.Profile.UserAgentPlatform = platform;
  144.  
  145. // Устанавливаем Useragent
  146. project.Profile.UserAgent = string.Format("Mozilla/5.0 (Windows NT {0}{1}; rv:{2}.0) Gecko/20100101 Firefox/{2}.0", winOC, platformApp, version);
  147. project.Profile.UserAgentAppVersion = "5.0 (Windows)";
  148. project.Profile.UserAgentAppName = "Netscape";
  149. project.Profile.UserAgentAppCodeName = "Mozilla";
  150. project.Profile.UserAgentProduct = "Gecko";
  151. project.Profile.UserAgentProductSub = "20100101";
  152.  
  153. Random lang = new Random();
  154. // Формируем набор возможных вариантов Accept-Language
  155. // Здесь присутствует как русский язык, так и иностранный.
  156. // Если необходимо, чтобы выборка была по какому-то определенному признаку - закоментируйте или удалите не нужные строки.
  157. string[] acceptLanguageSet = {
  158. "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4",
  159. "ru-RU,ru;q=0.9,en;q=0.8",
  160. "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3",
  161. // "en-US,en;q=0.5",
  162. //"en-US,en;q=0.8,es;q=0.6",
  163. // "en-US,en;q=0.8,nl;q=0.6,el;q=0.4,de;q=0.2"
  164. };
  165. // Устанавливаем Accept-Language
  166. string acceptLanguage = acceptLanguageSet[lang.Next(0, acceptLanguageSet.Length)].ToString();
  167. project.Profile.AcceptLanguage = acceptLanguage;
  168. // Устанавливаем настройки языка
  169. project.Profile.UserAgentBrowserLanguage = acceptLanguage.Substring(0, acceptLanguage.IndexOf(','));
  170. project.Profile.UserAgentLanguage = acceptLanguage.Substring(0, acceptLanguage.IndexOf(','));
  171.  
  172. Random r = new Random();
  173. // Формируем набор популярных десктопных разрешений [Идея хранения позаимствована у doc'a, за что ему большая благодарность!]
  174. int [,] resolutionSet = {
  175. {2880, 1800},
  176. {2560, 1600},
  177. {2560, 1440},
  178. {1920, 1200},
  179. {1920, 1080},
  180. {1680, 1050},
  181. {1600, 1200},
  182. {1600, 900},
  183. {1440, 900},
  184. {1366, 768},
  185. {1280, 1024},
  186. {1280, 800},
  187. {1280, 768},
  188. {1080, 1920},
  189. };
  190. // Получаем рандомное разрешение и устанавливаем
  191. int resolution = r.Next(resolutionSet.Length/2);
  192. project.Profile.ScreenSizeWidth = resolutionSet[resolution, 0];
  193. project.Profile.ScreenSizeHeight = resolutionSet[resolution, 1];
  194. // Видимая область
  195. project.Profile.AvailScreenWidth = project.Profile.ScreenSizeWidth-17;
  196. project.Profile.AvailScreenHeight = project.Profile.ScreenSizeHeight-142;
  197. // Глубина цвета монитора (Color Depth)
  198. // [Чуть позже будет обновление механизма установки этого параметра]
  199. instance.SetScreenPreference("screen_color_depth", 24);
  200. //WebGL
  201. instance.SetBrowserPreference("webgl.disabled", true);
  202. instance.SetBrowserPreference("webgl.enable-webgl2", false);
  203. instance.SetBrowserPreference("webgl.disable-extensions", true);
  204. instance.SetBrowserPreference("webgl.min_capability_mode", true);
  205. //
  206. //WebRTC
  207. if (strProxy!=String.Empty) {
  208. //Устанавливаем эмуляцию WebRTC
  209. string strInnerIpV4 = String.Format("192.168.{0}.{1}", regRandom.Next(1, 101), regRandom.Next(1, 255));
  210. string strNatAddress = String.Format("{0}:{1}", new Regex(@"(?<=://).*?(?=:)").Match(strProxy).Value, regRandom.Next(100, 65535));
  211. instance.SetWebRTCAdresses(strInnerIpV4, String.Empty, strNatAddress, ZennoLab.InterfacesLibrary.Enums.Browser.WebRTCMode.Emulate);
  212. }
  213. //
  214. //Предварительный набор куков
  215. Tab Tab1 = instance.ActiveTab;
  216.  
  217. Tab1.Navigate("whoer.net");//смотрим успешность установки прокси. Эту строку и две строки ниже можно закомментировать
  218. Tab1.WaitDownloading();//ждем загрузки страницы
  219. Thread.Sleep(regRandom.Next(3500, 5500));//дополнительная рандомная пауза
  220.  
  221. //Если включен набор куков, то выполняем код ниже
  222. if (blnCookies) {
  223. //Набор куков через поисковые запросы № 1
  224. //При необходимости можно сделать несколько таких блоков с разными поисковыми запросами
  225. Tab1.Navigate(String.Format("https://search.yahoo.com/search?p={0}", project.Profile.Surname));
  226. Tab1.WaitDownloading();
  227. List<HtmlElement> lstSearchResults = Tab1.FindElementsByXPath("//h3/a").ToList();
  228. if (lstSearchResults.Count>0) {
  229. //задаем количество ссылок которые нужно открыть (от и до)
  230. for (int i=0; i<regRandom.Next(4, 7); i++) {
  231. //задаем номер первого совпадения
  232. int intResultNum = regRandom.Next(1, lstSearchResults.Count);
  233. lstSearchResults[intResultNum].Click();
  234. Thread.Sleep(regRandom.Next(3000, 5000));//рандомная пауза
  235. instance.GetTabByAddress("popup").Close();//закрываем окно
  236. lstSearchResults.RemoveAt(intResultNum);
  237. }
  238. }else
  239. {
  240. project.SendErrorToLog("Не получается эмулировать поиск на yahoo, завершаем работу");//в случае непредвиденных ошибок информируем об этом и пробуем выполнить код ниже
  241. }
  242. }
  243. //
  244.  
  245. //Регистрация аккаунта
  246. //IZennoList.Count: получаем количество строк в списке (файле)
  247. int intMailAkk = lstMailAkk.Count;
  248. if (intMailAkk==0) {
  249. project.SendErrorToLog("Файл с email пустой. Работа остановлена", true);//если количество строк равно нулю, сообщаем об этом
  250. throw new Exception("Закончился список с email");//прерываем работу из-за пустого списка с почтами
  251. }
  252. project.SendInfoToLog(String.Format("В списке Mail-akk содержится {0} записей", intMailAkk), true);//сообщаем о количестве строк в файле с почтами
  253. //Получаем почтовый аккаунт из файла
  254. //Используем отдельный lock из Общего кода
  255. lock(CommonCode.LockMailAkk) {
  256. strAkkMail = lstMailAkk[0];//берем первую строку
  257. lstMailAkk.RemoveAt(0);//удаляем первую строку
  258. }
  259.  
  260. //Разделяем полученную строку сплитом
  261. string[] strMailAkk = strAkkMail.Split(';');//задаем символ разделителя строки (если у вас разделитель : (двоеточие), то поставьте его вместо ; )
  262. strRegisteredMail = strMailAkk[0];//первая часть строки = email
  263. pass = strMailAkk[1];//вторая часть строки = пароль почты
  264. //
  265.  
  266. //Переходим к целевому сайту
  267. Tab1.Navigate("https://www.facebook.com/");
  268. Tab1.WaitDownloading();//ожидаем загрузку
  269. Thread.Sleep(regRandom.Next(3500, 5500));//дополнительная пауза
  270. project.SendInfoToLog("Перешли на facebook.com", true);//сообщение в лог
  271.  
  272. //заполняем имя
  273. HtmlElement elFirstNameFB = Tab1.FindElementByXPath("//input[@name='firstname']", 0);
  274. if (elFirstNameFB.IsVoid) throw new Exception("Не удалось найти elFirstNameFB (поле ввода имени)");
  275. Tab1.FullEmulationMouseMoveToHtmlElement(elFirstNameFB);
  276. Thread.Sleep(regRandom.Next(500, 2500));//дополнительная рандомная пауза для эмуляции живого человека
  277. Tab1.FullEmulationMouseClick("left", "click");
  278. instance.SendText(project.Profile.Name, regRandom.Next(250, 550));//вводим Имя с рандомной задержкой в миллисекундах
  279. project.SendInfoToLog("Заполнили имя", true);
  280. Thread.Sleep(regRandom.Next(1500, 2500));//дополнительная рандомная пауза для эмуляции живого человека
  281.  
  282. //заполняем фамилию
  283. HtmlElement elLastNameFB = Tab1.FindElementByXPath("//input[@name='lastname']", 0);
  284. if (elLastNameFB.IsVoid) throw new Exception("Не удалось найти elLastNameFB (поле ввода фамилии)");
  285. Tab1.FullEmulationMouseMoveToHtmlElement(elLastNameFB);
  286. Thread.Sleep(regRandom.Next(500, 2500));
  287. Tab1.FullEmulationMouseClick("left", "click");
  288. instance.SendText(project.Profile.Surname, regRandom.Next(240, 650));//вводим Фамилию с рандомной задержкой в миллисекундах
  289. project.SendInfoToLog("Заполнили фамилию", true);
  290. Thread.Sleep(regRandom.Next(1500, 2500));
  291.  
  292. //заполняем e-mail
  293. HtmlElement elEmailFB = Tab1.FindElementByXPath("//input[@name='reg_email__']", 0);
  294. if (elEmailFB.IsVoid) throw new Exception("Не удалось найти elEmailFB (поле ввода E-mail)");
  295. Tab1.FullEmulationMouseMoveToHtmlElement(elEmailFB);
  296. Thread.Sleep(regRandom.Next(500, 2500));
  297. Tab1.FullEmulationMouseClick("left", "click");
  298. instance.SendText(strRegisteredMail, regRandom.Next(400, 700));//вводим Почту с рандомной задержкой в миллисекундах
  299. project.SendInfoToLog("Заполнили E-mail", true);
  300. Thread.Sleep(regRandom.Next(2500, 4500));//ставим паузу, чтобы подгрузилось дополнительное окошко для повторного ввода почты
  301.  
  302. //заполняем повторно e-mail
  303. HtmlElement elEmailFB2 = Tab1.FindElementByXPath("//input[@name='reg_email_confirmation__']", 0);
  304. if (elEmailFB2.IsVoid) throw new Exception("Не удалось найти elEmailFB2 (поле ввода E-mail)");
  305. Tab1.FullEmulationMouseMoveToHtmlElement(elEmailFB2);
  306. Thread.Sleep(regRandom.Next(500, 2500));
  307. Tab1.FullEmulationMouseClick("left", "click");
  308. instance.SendText(strRegisteredMail, regRandom.Next(420, 720));
  309. project.SendInfoToLog("Заполнили E-mail повторно", true);
  310. Thread.Sleep(regRandom.Next(3500, 5500));
  311.  
  312. //заполняем пароль
  313. HtmlElement elPasswordFB = Tab1.FindElementByXPath("//input[@name='reg_passwd__']", 0);
  314. if (elPasswordFB.IsVoid) throw new Exception("Не удалось найти elPasswordFB (поле ввода пароля)");
  315. Tab1.FullEmulationMouseMoveToHtmlElement(elPasswordFB);
  316. Thread.Sleep(regRandom.Next(500, 2500));
  317. Tab1.FullEmulationMouseClick("left", "click");
  318. instance.SendText(project.Profile.Password, regRandom.Next(350, 700));
  319. project.SendInfoToLog("Заполнили пароль", true);
  320. Thread.Sleep(regRandom.Next(1000, 2500));
  321.  
  322. //заполняем день рождения
  323. HtmlElement elBirthDayFB = Tab1.FindElementByXPath("//select[@name='birthday_day']", 0);
  324. if (elBirthDayFB.IsVoid) throw new Exception("Не удалось найти elBirthDayFB (поле ввода дня рождения)");
  325. Tab1.FullEmulationMouseMoveToHtmlElement(elBirthDayFB);
  326. Thread.Sleep(regRandom.Next(500, 2500));
  327. Tab1.FullEmulationMouseClick("left", "click");
  328. instance.SendText(project.Profile.BornDay.ToString(), regRandom.Next(200, 450));
  329. project.SendInfoToLog("Заполнили день рождения", true);
  330. Thread.Sleep(regRandom.Next(2000, 3500));
  331.  
  332. //выбираем месяц рождения
  333. HtmlElement elBirthMonthContainerFB = Tab1.FindElementByXPath("//select[@name='birthday_month']", 0);
  334. if (elBirthMonthContainerFB.IsVoid) throw new Exception("Не удалось найти elBirthMonthFB (элемент выбора месяца рождения)");
  335. Tab1.FullEmulationMouseMoveToHtmlElement(elBirthMonthContainerFB);
  336. Thread.Sleep(regRandom.Next(500, 2500));
  337. Tab1.FullEmulationMouseClick("left", "click");
  338. Thread.Sleep(regRandom.Next(500, 2500));
  339. //Делаем фокус и щелкаем стрелку вниз на клавиатуре. Кол-во нажатий равно номеру месяца.
  340. //Т.к. по-умолчанию в ФБ выбрана не первая позиция, то принудительно поднимаем текущую позицию до первой
  341. elBirthMonthContainerFB.Focus();
  342. for (int i=0; i<13; i++){
  343. instance.ActiveTab.KeyEvent("Up", "press", "");
  344. Thread.Sleep(regRandom.Next(80, 200));
  345. }
  346. elBirthMonthContainerFB.Focus();
  347. //Теперь выбираем месяц, соответствующий месяцу рождения в профиле
  348. for (int i=0; i<project.Profile.BornMonth; i++){
  349. instance.ActiveTab.KeyEvent("Down", "press", "");
  350. Thread.Sleep(regRandom.Next(100, 400));
  351. }
  352. project.SendInfoToLog("Заполнили месяц рождения", true);
  353. Thread.Sleep(regRandom.Next(2500, 3500));
  354.  
  355. //заполняем год рождения
  356. HtmlElement elBirthYearFB = Tab1.FindElementByXPath("//select[@name='birthday_year']", 0);
  357. if (elBirthYearFB.IsVoid) throw new Exception("error: Не удалось найти elBirthYearFB (поле ввода года рождения)");
  358. Tab1.FullEmulationMouseMoveToHtmlElement(elBirthYearFB);
  359. Thread.Sleep(regRandom.Next(500, 2500));
  360. Tab1.FullEmulationMouseClick("left", "click");
  361. instance.SendText(project.Profile.BornYear.ToString(), regRandom.Next(250, 550));
  362. project.SendInfoToLog("Заполнили год рождения", true);
  363. Thread.Sleep(regRandom.Next(2000, 3500));
  364.  
  365. //указываем пол
  366. //если пол профиля не равен мужскому полу
  367. if (project.Profile.Sex!=ProfileSex.Male) {
  368. HtmlElement elSexFB = Tab1.FindElementByXPath("//label[text()='Женщина']|//label[text()='Female']", 0);
  369. if (elSexFB.IsVoid) throw new Exception("Не удалось найти elSexFB (поле выбора пола - женский)");
  370. Tab1.FullEmulationMouseMoveToHtmlElement(elSexFB);
  371. Thread.Sleep(regRandom.Next(500, 2500));
  372. Tab1.FullEmulationMouseClick("left", "click");
  373. project.SendInfoToLog("Выбрали пол женский", true);
  374. }else{
  375. HtmlElement elSexFB = Tab1.FindElementByXPath("//label[text()='Мужчина']|//label[text()='Male']", 0);
  376. if (elSexFB.IsVoid) throw new Exception("error: Не удалось найти elSexFB (поле выбора пола - мужской)");
  377. Tab1.FullEmulationMouseMoveToHtmlElement(elSexFB);
  378. Thread.Sleep(regRandom.Next(500, 2500));
  379. Tab1.FullEmulationMouseClick("left", "click");
  380. project.SendInfoToLog("Выбрали пол мужской", true);
  381. }
  382. Thread.Sleep(regRandom.Next(2500, 4500));
  383.  
  384. //Нажимаем Создать аккаунт
  385. HtmlElement elNextButtonFB = Tab1.FindElementByXPath("//button[@name='websubmit']|//button[text()='Создать аккаунт']|//button[text()='Create Account']|//button[text()='Create an account']", 0);
  386. if (elNextButtonFB.IsVoid) throw new Exception("Не удалось найти elNextButtonFB (кнопка Создать аккаунт).");
  387. Tab1.FullEmulationMouseMoveToHtmlElement(elNextButtonFB);
  388. Thread.Sleep(regRandom.Next(500, 2500));
  389. Tab1.FullEmulationMouseClick("left", "click");
  390. project.SendInfoToLog("Нажали Создать аккаунт", true);
  391. Tab1.WaitDownloading();
  392. Thread.Sleep(regRandom.Next(35000, 45000)); //Пауза для ожидания получения письма на почту
  393. //
  394.  
  395. //Подтверждение аккаунта по почте
  396. //Из-за того, что на mail.ru письма подтверждения приходят с большой задержкой, пришлось выставить большие задержки в проверке наличия письма
  397. string strConfirm = String.Empty;
  398. if (strProxy==""){
  399. strConfirm = ZennoPoster.MailConfirm("60;120;300;600", strRegisteredMail, pass, "imap.mail.ru",
  400. 993, true, false, true, false, @"""Facebook""", @"(http://|https://|)(www|).*(\.(com|ru|edu|net|org|info)).*(verify|confirm|invite).*", 0, false, new string[]{"INBOX"});
  401. } else {
  402. strConfirm = ZennoPoster.MailConfirm("60;120;300;600", strRegisteredMail, pass, "imap.mail.ru",
  403. 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);
  404. }
  405. project.SendInfoToLog("Выполнено! Ссылка из письма: " + strConfirm, true);
  406. Tab1.Navigate(strConfirm);
  407. Tab1.WaitDownloading();
  408. Thread.Sleep(regRandom.Next(5500, 8500));
  409. Tab1 = instance.ActiveTab;
  410. Tab1.Navigate("https://www.facebook.com/");
  411. Tab1.WaitDownloading();
  412. Thread.Sleep(2000);
  413. project.SendInfoToLog("Перешли на facebook.com", true);
  414. //
  415. //Сохранение результатов регистрации
  416. //Чтобы гарантировано сохранить результаты регистрации располагаем код сохранения до выполнения дополнительных настроек
  417. //Тут для блокировки используем стандартный код
  418. lock(SyncObjects.ListSyncer) {
  419. 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); //После успешной регистрации сохраняем в файл информацию - логин, пароль, дату рождения, логин почты, пароль почты
  420. }
  421. //Информируем об успешной регистрации
  422. project.SendInfoToLog("Регистрация аккаунта Facebook завершена успешно! Зарегистрирован аккаунт: " +strRegisteredMail + ";" + project.Profile.Password + ";" + project.Profile.Name + ";" + project.Profile.Surname, true);
  423. //Сохраняем текущий профиль в файл .zpprofile
  424. project.Profile.Save(project.Directory + @"\profiles\" + strRegisteredMail + ".zpprofile", true, true, true, true, true, true, true, true, true);//сохраняем профиль зарегистрированного аккаунта в подпапку profiles
  425. //Информируем о сохранении профиля
  426. project.SendInfoToLog("Сохранили данные в файл accounts-FB.txt. Сохранили текущий профиль в папке profiles\\" +strRegisteredMail+ ".zpprofile", true);
  427. //
  428. //Если включена установка аватарки, выполняем код ниже
  429. if (blnPhotoDownl) {
  430. //Добавляем фото на аватарку
  431. //Переходим на профиль
  432. 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);
  433. if (elProfileButtonFB.IsVoid) {
  434. project.SendErrorToLog("Не удалось найти elProfileButtonFB (кнопка Профиль аккаунта).");
  435. string url = instance.ActiveTab.URL;
  436. string regFBUrl = @"(?<=https://www\.facebook\.com/).*?(?=/block/)";
  437. string resUrl = new Regex(regFBUrl).Match(url).Value;
  438. if (resUrl=="checkpoint"){
  439. project.SendInfoToLog ("Чекпоинт. Надо привязать номер телефона.", true);
  440.  
  441. //объявляем необходимые переменные
  442. string strPhoneNumber = String.Empty;
  443. string strConfirmationCode = String.Empty;
  444. //
  445. //Открываем окно с телефоном
  446. HtmlElement elPhoneTab = Tab1.FindElementByXPath("//a[contains(@href, 'confirmation?source=smsscarce')]", 0);
  447. if (elPhoneTab.IsVoid) return "error: Не удалось найти elPhoneTab (поменялась верстка)";
  448. Tab1.FullEmulationMouseMoveToHtmlElement(elPhoneTab);
  449. Thread.Sleep(regRandom.Next(500, 2500));
  450. Tab1.FullEmulationMouseClick("left", "click");
  451. Tab1.WaitDownloading();
  452. Thread.Sleep(regRandom.Next(2500, 3500));
  453. project.SendInfoToLog("Перешли на окно ввода № телефона", true);
  454.  
  455. //получаем номер телефона и id регистрации
  456. string strRegistrationID = ZennoPoster.Sms.GetNumber("SmsActivate.dll", out strPhoneNumber, "fb", "&country=0");
  457. project.SendInfoToLog("Получен телефонный номер: " + strPhoneNumber);
  458. string regNumber = @"(?<=7).*";
  459. string strPhoneNumber2 = new Regex(regNumber).Match(strPhoneNumber).Value;//СМС-Активейт отдает номер телефона с 7, а вводить надо без 7, поэтому используем регулярку
  460.  
  461. //сообщаем сервису, что в ближайшие 2 минуты на номер придёт смс от указанного нами сервиса
  462. string strSetStatusResult = ZennoPoster.Sms.SetStatus("SmsActivate.dll", strRegistrationID, InterfacesLibrary.SmsService.Enums.SmsServiceStatus.Ready);
  463.  
  464. if (strSetStatusResult=="Ready") {
  465. //заполняем номер телефона в поле и нажимаем "Получить код"
  466. Tab1.FindElementByXPath("//input[@name='contact_point']", 0).SetValue(strPhoneNumber2, instance.EmulationLevel);
  467. Thread.Sleep(regRandom.Next(500, 1000));
  468. //кликаем Продолжить
  469. HtmlElement elNextChek = Tab1.FindElementByXPath("//button[contains(@type, 'submit') and contains(@class, 'layerConfirm')]", 0);
  470. if (elNextChek.IsVoid) return "error: Не удалось найти elNextChek (поле ввода года рождения)";
  471. Tab1.FullEmulationMouseMoveToHtmlElement(elNextChek);
  472. //Thread.Sleep(regRandom.Next(500, 2500));
  473. Tab1.FullEmulationMouseClick("left", "click");
  474.  
  475. //Задаем проверку получения кода и ожидание. Общее время ожидания не может быть больше 20 минут
  476. strConfirmationCode = ZennoPoster.Sms.GetStatus("SmsActivate.dll", strRegistrationID, "", timeout:20);
  477.  
  478. //Заполняем поле кодом подтверждения
  479. Tab1.FindElementByXPath("//input[@name='pin']", 0).SetValue(strConfirmationCode, instance.EmulationLevel);
  480. project.SendInfoToLog("Получен код подтверждения: " + strConfirmationCode, true);
  481. Tab1.FindElementByXPath("//button[contains(@type, 'submit') and contains(@class, 'layerConfirm') and contains(text(), 'Подтвердить')]", 0).Click();
  482. }
  483. } else {
  484. project.SendErrorToLog("Произошла ошибка. Завершаем работу.", true);
  485. throw new Exception("Ошибка. Завершаем работу");
  486. }
  487. }
  488. //
  489. Tab1.FullEmulationMouseMoveToHtmlElement(elProfileButtonFB);
  490. Thread.Sleep(regRandom.Next(500, 2500));
  491. Tab1.FullEmulationMouseClick("left", "click");
  492. project.SendInfoToLog("Перешли в профиль аккаунта", true);
  493. Tab1.WaitDownloading();
  494. Thread.Sleep(regRandom.Next(1500, 3500));
  495. //Выбираем добавить фото
  496. HtmlElement elPhotoButtonFB = Tab1.FindElementByXPath("//div[@class='photoContainer']//a[contains(text(),'Add Photo')]|//div[@class='photoContainer']//a[contains(text(),'Добавить фото')]", 0);
  497. if (elPhotoButtonFB.IsVoid) throw new Exception("Не удалось найти elPhotoButtonFB (кнопка Добавить фото).");
  498. Tab1.FullEmulationMouseMoveToHtmlElement(elPhotoButtonFB);
  499. Thread.Sleep(regRandom.Next(500, 2500));
  500. Tab1.FullEmulationMouseClick("left", "click");
  501. project.SendInfoToLog("Нажали Добавить фото", true);
  502. Tab1.WaitDownloading();
  503. Thread.Sleep(regRandom.Next(2500, 4500));
  504. //Формируем список доступных фотографий
  505. //Присваиваем переменной путь к папке с файлами
  506. string strPhotoDirectoryPath = strFolderPhotoPath;
  507. Directory.CreateDirectory(strPhotoDirectoryPath); //создадим директорию, перечень файлов из которой будем получать
  508. //Созданим объект списка, связанный со списком уровня проекта "Список 1", очистим этот список
  509. IZennoList lstPhotoPath = project.Lists["Список 1"];
  510. lstPhotoPath.Clear();
  511.  
  512. //Directory.EnumerateFiles: получаем список файлов
  513. lstPhotoPath.AddRange(Directory.EnumerateFiles(strPhotoDirectoryPath, "*.jpg", SearchOption.AllDirectories));
  514.  
  515. // Если необходимо получить файлы только из исходной папки, но не из вложенных папок, используйте SearchOption.TopDirectoryOnly вместо SearchOption.AllDirectories
  516. //
  517. int intPhotoPath = lstPhotoPath.Count;
  518. project.SendInfoToLog(String.Format("В списке Список 1 содержится {0} записей", intPhotoPath), true);
  519. if (intPhotoPath==0) {
  520. project.SendErrorToLog("Нет фотографий в папке", true);
  521. //throw new Exception("Папка с фотографиями для загрузки пуста."); //Раскомментировать, если хотим, чтобы прерывалось выполнение без сохранения результатов в случае ошибки
  522. }
  523. //Берем фотографию с удалением
  524. //Чтобы в многопотоке брались разные файлы блокируем доступ к списку на все время загрузки фото, пока не удалим взятое фото из папки. Остальные потоки остановятся на этом этапе.
  525.  
  526. //Используем отдельный lock из Общего кода
  527. lock(CommonCode.LockPhotoPath) {
  528. //получаем случайный элемент списка
  529. int intRandomPhotoPath = new Random().Next(0, lstPhotoPath.Count-1);
  530. strPhotoPath = lstPhotoPath[intRandomPhotoPath];//берем рандомную строку
  531. lstPhotoPath.RemoveAt(intRandomPhotoPath); //удаляем взятую рандомную строку
  532. project.SendInfoToLog("Взяли фото: " +strPhotoPath, true);
  533. //
  534.  
  535. //Устанавливаем политику загрузки файла
  536. instance.SetFileUploadPolicy("ok", ""); //устанавливаем политику загрузки файлов
  537. //Instance.SetFilesForUpload - назначаем конкретный файл для загрузки при активации соответствующего элемента
  538. instance.SetFilesForUpload(strPhotoPath);//указываем путь до загружаемого файла через переменную
  539.  
  540. //открываем окно выбора файла
  541. HtmlElement elPhotoDownload = Tab1.FindElementByXPath("//u[contains(text(), 'plus')]|//span[contains(text(), 'Загрузить фото')]|//span[contains(text(), 'Upload Photo')]|//span[contains(text(), 'Add Photo')]", 0);
  542. if (elPhotoDownload.IsVoid) project.SendErrorToLog("Не удалось найти elPhotoDownload (кнопка Открыть окно выбора файла).", true);//вместо уведомления об ошибке можно поставить прерывание выполнения, но тогда не сохранится результат
  543. Tab1.FullEmulationMouseMoveToHtmlElement(elPhotoDownload);
  544. Tab1.FullEmulationMouseClick("left", "click");
  545. Tab1.WaitDownloading();
  546. Thread.Sleep(regRandom.Next(7500, 10500));//Делаем паузу для загрузки фото (если скорость интернет-канала низкая или прокси медленные - увеличиваем время паузы)
  547. project.SendInfoToLog("Нажали открыть окно выбора фото", true);
  548. //
  549.  
  550. //Выбираем Сохранить добавленное фото
  551. HtmlElement elPhotoOKFB = Tab1.FindElementByXPath("//button[contains(@data-testid, 'profilePicSaveButton') and contains(text(),'Сохранить')]|//button[contains(@data-testid, 'profilePicSaveButton') and contains(text(),'Save')]", 0);
  552. if (elPhotoOKFB.IsVoid) project.SendErrorToLog("Не удалось найти elPhotoOKFB (кнопка Сохранить фото).", true);//вместо уведомления об ошибке можно поставить прерывание выполнения, но тогда не сохранится результат
  553. Tab1.FullEmulationMouseMoveToHtmlElement(elPhotoOKFB);
  554. Thread.Sleep(regRandom.Next(500, 2500));
  555. Tab1.FullEmulationMouseClick("left", "click");
  556. project.SendInfoToLog("Нажали Сохранить фото", true);
  557. Tab1.WaitDownloading();
  558. Thread.Sleep(regRandom.Next(1500, 2500));
  559. //
  560.  
  561. //Проверяем существование файла перед удалением
  562. if (!File.Exists(strPhotoPath)) {
  563. project.SendErrorToLog("Файл для удаления не найден: " + strPhotoPath, true);
  564. //throw new Exception("Не удалось найти файл фотографии для удаления"); //прерываем выполнение (выходим по красной ветке из сниппета). Раскомментировать код, если хотим, чтобы он выполнялся в случае ошибки.
  565. }
  566. File.Delete(strPhotoPath);//удаляем взятое фото
  567. project.SendInfoToLog("Готово! Файл удалён: " + strPhotoPath, true);
  568. }
  569. }
  570. //
  571. //Переводим интерфейс аккаунта на English (US)
  572. if (blnEnLang) {
  573. //Переходим на профиль
  574. Tab1.Navigate("https://www.facebook.com/");
  575. Tab1.WaitDownloading();
  576. Thread.Sleep(regRandom.Next(1200, 3500));
  577. project.SendInfoToLog("Перешли на facebook.com", true);
  578. //Выбираем English (US)
  579. HtmlElement elEnglishButton = Tab1.FindElementByXPath("//a[contains(text(),'English (US)')]", 0);
  580. if (elEnglishButton.IsVoid) {
  581. project.SendErrorToLog("Не удалось найти elEnglishButton (кнопка выбора English (US)). Возможно, аккаунт уже на английском интерфейсе.", true);
  582. //return "error";
  583. }
  584. Tab1.FullEmulationMouseMoveToHtmlElement(elEnglishButton);
  585. Thread.Sleep(regRandom.Next(500, 2500));
  586. Tab1.FullEmulationMouseClick("left", "click");
  587. project.SendInfoToLog("Нажали English (US)", true);
  588. Tab1.WaitDownloading();
  589. Thread.Sleep(regRandom.Next(1800, 3900));
  590. //Подтверждаем выбор English (US)
  591. HtmlElement elEnglishButOK = Tab1.FindElementByXPath("//button[contains(text(),'Изменить язык')]", 0);
  592. if (elEnglishButOK.IsVoid) project.SendErrorToLog("Не удалось найти elEnglishButOK (Подтверждение выбора English (US)). Возможно, аккаунт уже на английском интерфейсе.", true);
  593. Tab1.FullEmulationMouseMoveToHtmlElement(elEnglishButOK);
  594. Thread.Sleep(regRandom.Next(500, 2500));
  595. Tab1.FullEmulationMouseClick("left", "click");
  596. project.SendInfoToLog("Нажали подтверждение выбора English (US)", true);
  597. Tab1.WaitDownloading();
  598. Thread.Sleep(regRandom.Next(1500, 3500));
  599. }
  600. //
  601. //Переходим на главную страницу
  602. Tab1.Navigate("https://www.facebook.com/");
  603. Tab1.WaitDownloading();//ожидаем загрузку
  604. //
Advertisement
Add Comment
Please, Sign In to add comment