} // openPrivateWindow() public bool openYouTube(YouTubeUser user) { if (YouTube.isYouTubePage()) { // Мы уже на странице "Ютуба" //@TODO проверить залогинен ли пользователь return(this.loginYouTube(user)); } // if() /* Когда окно открывается, адрес для ввода УРЛ активно * Stencil emptyUrl = new Stencil("mozilla-firefox-empty-url-de.png"); * * emptyUrl.isFound(); * * if (!emptyUrl.mouseClick()) * { // Адресная строка была не пустой. * Stencil httpUrl = new Stencil("mozilla-firefox-url-http.png"); * httpUrl.setColorDelta(10); * httpUrl.mouseClick(); * } */ // Печатаем адрес ютуба, а заодно на всякий случай выходим из аккаунта. BotClass.printString("www.youtube.com/logout" + Environment.NewLine); this.waitUntilPageIsLoaded(); // Тут будет хранится результат выполнений функций bool result = true; result = result && this.loginYouTube(user); return(result); } // openYouTube()
} // isYouTubePage() /** * Ставит лайк у видео */ public static bool makeLike() { // Иконка "нравится" Stencil likeIcon = new Stencil("YouTube-Like-Icon.png"); likeIcon.setColorDelta(5); // Иконка "нравится" Stencil likedIcon = new Stencil("YouTube-Liked-Icon.png"); likedIcon.setColorDelta(5); //@TODO проверить есть ли у браузера вертикальный бегунок и в зависимости от этого работать дальше. // Счётчик сколько раз мы "прокрутим" экран браузера вниз. int counter = 0; // Пока не увидим символ лайка, "прокручиваем" экран браузера вниз и считаем эти "прокручивания". while (!likeIcon.mouseClick() && !likedIcon.isFound()) { counter++; BotClass.keyDown(Keys.PageDown); BotClass.keyUp(Keys.PageDown); // Не забываем сбросить старые результаты поиска likeIcon.resetRec(); // Ждём две секунды, чтобы экран прокрутился вниз. System.Threading.Thread.Sleep(2000); } // while // после нажатия на "лайк", появляется меню "поделится" и активным становится строчка с УРЛ System.Threading.Thread.Sleep(2000); // Сдвигаем курсор в сторону и кликаем по пустому полю. Rectangle likeIconRec = likeIcon.getRec(); likeIconRec.Offset(-50, 0); BotClass.moveCursor(likeIconRec); BotClass.mouseClick(); // Возвращаем экран обратно (не пойму почему, но не всегда срабатывает. Перекликнуть рядом с кнопкой? Пока лишний раз наверх крутим) for (int i = 0; i <= counter + 1; i++) { BotClass.keyDown(Keys.PageUp); BotClass.keyUp(Keys.PageUp); // Ждём, вдруг... System.Threading.Thread.Sleep(500); } // for return(true); } // makeLike()
} // loginYouTube() /** * Обновляет страницу браузера. */ public Boolean refreshPage() { this.waitUntilPageIsLoaded(); BotClass.keyDown(Keys.F5); BotClass.keyUp(Keys.F5); this.waitUntilPageIsLoaded(); return(true); } // refreshPage()
} // getRec() /** * Есть ли картинка? */ public Boolean isFound() { if (!this.rec.IsEmpty) { // Картинка уже была найдена return(true); } // if BotClass.create_screen_shot(); Rectangle rec = BotClass.imageSearch(this.image, this.delta); return(this.rectangleToBool(rec)); } // isFound()
public bool closeBrowserWindow() { Stencil closeWindow = new Stencil("mozilla-firefox-closeWindow.png"); closeWindow.setColorDelta(20); if (closeWindow.mouseClick()) { // увидели значёк закрытия окна и смогли по нему кликнуть. //сдвинуть курсор в сторону, а то он перекрывает менюшку BotClass.moveCursor(new System.Drawing.Rectangle(10, 10, 50, 50)); return(true); } return(false); } // closeBrowserWindow()
} // imageSearch() /** * Ищет маленькую картинку в большой картинке. И кликает по ней мышкой. * @param Bitmap smallImage - искомая картинка * @param int colorDelta - допустимая погрешность в цвете * @param Rectangle rec - прямоугольник, где искать маленькую картинку * @return Rectangle - координаты найденой картинки (Если картинка не найдена, то пустой прямоугольник) */ public static Rectangle imageSearchAndMouseClick(Bitmap smallImage, int colorDelta = 0, Rectangle searchRec = new Rectangle()) { Rectangle rec = BotClass.imageSearchAndMouseMove(smallImage, colorDelta, searchRec); if (!rec.IsEmpty) { // Картинка была найдена, курсор сдвинут // Ждём System.Threading.Thread.Sleep(2000); // Кликаем BotClass.mouseClick(); } // if return(rec); } // imageSearchAndMouseClick()
} // mouseClick() /** * Ищет шаблон и двигает на него мышку. */ public Boolean mouseMove() { if (!this.rec.IsEmpty) { // Картинка уже была найдена // Двигаем курсор на заранее найденый прямоугольник BotClass.moveCursor(this.rec); return(true); } // if BotClass.create_screen_shot(); Rectangle rec = BotClass.imageSearchAndMouseMove(this.image, this.delta); return(this.rectangleToBool(rec)); } // imageSearchRect()
} // imageSearchAndMouseClick() /** * Ищет маленькую картинку в большой картинке. И двигает на неё курсор мышки. * @param Bitmap smallImage - искомая картинка * @param int colorDelta - допустимая погрешность в цвете * @param Rectangle rec - прямоугольник, где искать маленькую картинку * @return Rectangle - координаты найденой картинки (Если картинка не найдена, то пустой прямоугольник) */ public static Rectangle imageSearchAndMouseMove(Bitmap smallImage, int colorDelta = 0, Rectangle searchRec = new Rectangle()) { Rectangle rec = BotClass.imageSearch(smallImage, colorDelta, searchRec); if (!rec.IsEmpty) { // Картинка была найдена if (!BotClass.area.IsEmpty) { rec.Offset(BotClass.area.Location); } // Двигаем курсор мыши BotClass.moveCursor(rec); } return(rec); } // imageSearchAndMouseMove()
} // openNewVideo() /** * Открывает нужный Ютуб-канал */ public static bool openChanel(String url) { // кликаем на адрессную строку Stencil httpUrl = new Stencil("mozilla-firefox-url-http.png"); httpUrl.setColorDelta(10); if (httpUrl.mouseClick()) { BotClass.printString(url + "/videos" + Environment.NewLine); System.Threading.Thread.Sleep(2000); return(true); } else { return(false); } // if } // openChanel()
} // openVideosOfChanel() /** * По двоеточии во времени ищет непросмотренные видео. */ public static Rectangle searchNewVideos() { YouTube.waitUntilPageIsLoaded(); // Признак непросмотренного видео Stencil videoTimeColon = new Stencil("YouTube-Video-TimeColon.png"); videoTimeColon.setColorDelta(37); // Признак конца страницы Stencil videoListScrolledToDown = new Stencil("YouTube-VideoList-ScrolledToDown.png"); //videoListScrolledToDown.setColorDelta(0); // Кнопка показать больше видео Stencil videoListShowMore = new Stencil("YouTube-VideoList-ShowMore.png"); //videoListShowMore.setColorDelta(0); // Ищем непросмотренное видео, пока не дойдём до конца страницы while (!( videoTimeColon.isFound() || videoListScrolledToDown.isFound())) { BotClass.keyDown(Keys.PageDown); BotClass.keyUp(Keys.PageDown); // Не забываем сбросить старые результаты поиска videoTimeColon.resetRec(); videoListScrolledToDown.resetRec(); videoListShowMore.resetRec(); // Ждём две секунды, чтобы экран прокрутился вниз. System.Threading.Thread.Sleep(2000); //а так же не должно быть кнопки "показать больше" if (videoListShowMore.mouseClick()) { // Когда нажали на кнопку "показать больше", сдвигаем курсор в сторону BotClass.moveCursor(1, 1); System.Threading.Thread.Sleep(500); } } // while return(videoTimeColon.getRec()); } // searchNewVideos()
} // mouseClickOverFirefoxIcon() public static void switchToGermanLanguage() { Stencil deIcon = new Stencil("windows-language-icon-de.png"); deIcon.setColorDelta(100); // 110 <= delta < 120 bool test = deIcon.isFound(); while (!test) { BotClass.keyDown(Keys.Alt); // зажимаем Alt BotClass.keyDown(Keys.ShiftKey, Keys.Alt); // зажимаем Shift BotClass.keyUp(Keys.ShiftKey, Keys.Alt); // отжимаем Shift BotClass.keyUp(Keys.Alt); // отжимаем Alt test = deIcon.isFound(); } // while() } // switchToGermanLanguage()
} // historyBack() private bool loginYouTube(YouTubeUser user) { // Ждём this.waitUntilPageIsLoaded(); // Жмём на кнопку логина Stencil loginButtom = new Stencil("YouTube-Login-DE-Icon.png"); //loginButtom.setColorDelta(5); if (!loginButtom.mouseClick()) { // Что-то пошло не так return(false); } // Ждём this.waitUntilPageIsLoaded(); this.waitUntilPageIsLoaded(); // Надпись Логин (если её нет, то не надо будет вводить имя пользователя) Stencil login = new Stencil("YouTube-Login-DE.png"); if (login.isFound()) { // Если спрашивают логин, то его печатаем // Печатаем логин-майл BotClass.printString(user.getEmail() + Environment.NewLine); // Ждём this.waitUntilPageIsLoaded(); } // if //@TODO надо дождаться появления запроса пароля. Обычная функция не работает с аяксом System.Threading.Thread.Sleep(2000); // Печатаем логин-майл //BotClass.printString("yaq123456" + Environment.NewLine); BotClass.printString(user.getPassword() + Environment.NewLine); this.waitUntilPageIsLoaded(); return(true); } // loginYouTube()
} // makeLike() /** * Открываем непросмотренные видео. */ public static bool openNewVideo() { // Нашли двоеточие во времени у непросмотренного видео. Rectangle rec = YouTube.searchNewVideos(); if (!rec.IsEmpty) { // Нашли ещё непросмотренное видео // Размер картинки видео в списке 196*110 // Размер картинки видео над полоской времени 196*94 // Сдвигаем найденый прямоугольник на 100 и 80 пиксель, и растягиваем прямоугольник до 75 и 70 пикселей. rec.Offset(-100, -80); rec.Size = new Size(75, 70); // Двигаем курсор мышки и кликаем BotClass.moveCursor(rec); BotClass.mouseClick(); return(true); } // if return(false); } // openNewVideo()
} // openYouTube() /** * Открывает предыдущую страницу. */ public bool historyBack() { BotClass.keyDown(Keys.BrowserBack); BotClass.keyUp(Keys.BrowserBack); return(true); } // historyBack()