Кликнуть по нужному цвету.

mEdvEd71

Client
Регистрация
03.01.2021
Сообщения
167
Благодарностей
7
Баллы
18
Добрый день. Пытаюсь сделать шаблон с кликами по цветовым капчам или х.з. как они правильно называются. За основу взял вот эту тему: https://zennolab.com/discussion/threads/zennoposter-winapi-dlja-chajnikov-avtomatizacija-ljubogo-desktop-prilozhenija.33709. Для определения цвета пикселей использую функцию Autoit PixelGetColor. Вначале думал, что можно будет сравнивать пиксель фона с остальными и при не совпадении цветов будет получена искомая точка, куда надо ткнуть мышкой. Но разница цветов обнаруживается еще не доходя до цветного квадрата с замком, видимо цвет фона имеет разные оттенки, не заметные глазу.( Подскажите, пожалуйста, как можно это обойти или может быть решить задачу каким-то другим способом?
 

Вложения

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113

mEdvEd71

Client
Регистрация
03.01.2021
Сообщения
167
Благодарностей
7
Баллы
18
Там скрипт.( На каждой странице подсовывает новую картинку. И id меняется каждый раз. Начальные координаты взял с помощью AutoIt Window Info (x64). Не знаю насколько правильно, но вроде совпали на нескольких страницах.
 

Вложения

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Там скрипт.( На каждой странице подсовывает новую картинку. И id меняется каждый раз. Начальные координаты взял с помощью AutoIt Window Info (x64). Не знаю насколько правильно, но вроде совпали на нескольких страницах.
ну и что что id разный ? других элементов рядом нету ? кинь ссылку на сайт, а то гадать не очень охото.....
 
  • Спасибо
Реакции: mEdvEd71 и djaga

mEdvEd71

Client
Регистрация
03.01.2021
Сообщения
167
Благодарностей
7
Баллы
18
Если кликнуть по картинке, но рядом с цветным квадратом, линки не открываются. После нескольких таких промахов, IP блокируется.
 

mEdvEd71

Client
Регистрация
03.01.2021
Сообщения
167
Благодарностей
7
Баллы
18

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
ты все еще не решил эту проблему ? o_O
C#:
HtmlElement he = instance.ActiveTab.FindElementByXPath(@"//*[@id='links']/div[@class='lock-block']/img", 0);
if (he.IsVoid) return -1;

var to_string = he.DrawToBitmap(true); // в base64
var to_img = he.DrawAsBitmap(true); // в битмап
вот код который найдет и сконвертирует картинку вот в такое
78769

тебе надо будет только найти в ней все не пустые пиксели и высчитать середину.
потом уже перевести найденные координаты в картинке в абсолютные браузера, через расположение самой картинки относительно верхнего левого края.
 
  • Спасибо
Реакции: Astraport и mEdvEd71

mEdvEd71

Client
Регистрация
03.01.2021
Сообщения
167
Благодарностей
7
Баллы
18
Не решил.( Чайник потому что. Огромное Вам спасибо. Буду пробовать. А не пустые пиксели через PixelGetColor также можно получить?
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 980
Благодарностей
4 433
Баллы
113
  • Спасибо
Реакции: mEdvEd71

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Не решил.( Чайник потому что. Огромное Вам спасибо. Буду пробовать. А не пустые пиксели через PixelGetColor также можно получить?
ну да, пробегайся по всем пикселям в картинке в цикле и сравнивай.
либо используй aforg библиотеку, там есть нахождение границ, как раз для этой картинки оптимально.
 
  • Спасибо
Реакции: mEdvEd71

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 980
Благодарностей
4 433
Баллы
113
Примерно так:
C#:
HtmlElement he = instance.ActiveTab.FindElementByXPath(@"//*[@id='links']/div[@class='lock-block']/img", 0);
if (he.IsVoid) return -1;

var to_img = he.DrawAsBitmap(true); // в битмап
int res_x = 0;
int res_y = 0;
for (int x = 0; x< to_img.Width; x++){
for (int y = 0; y< to_img.Height; y++){
if (to_img.GetPixel(x,y).B > 0 && to_img.GetPixel(x,y).R > 0 && to_img.GetPixel(x,y).G> 0 ){
    res_x = Convert.ToInt32(he.GetAttribute("left")) + x - 5;
    res_y = Convert.ToInt32(he.GetAttribute("top")) + y + 5;
    break;
}
}
}
project.SendInfoToLog(res_x.ToString() +" "+ res_y.ToString());
instance.ActiveTab.FullEmulationMouseMove(res_x, res_y);
instance.ActiveTab.FullEmulationMouseClick("left", "click");
 
Последнее редактирование:

mEdvEd71

Client
Регистрация
03.01.2021
Сообщения
167
Благодарностей
7
Баллы
18
:ay:Офигеть! Работает! Супер! Премного благодарен!
 

mEdvEd71

Client
Регистрация
03.01.2021
Сообщения
167
Благодарностей
7
Баллы
18
Еще подскажите, пожалуйста, почему у меня XPath такой не получается? Или это вручную составлялся?:bw:
 

Вложения

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 531
Благодарностей
1 324
Баллы
113
  • Спасибо
Реакции: mEdvEd71

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
  • Спасибо
Реакции: mEdvEd71

mEdvEd71

Client
Регистрация
03.01.2021
Сообщения
167
Благодарностей
7
Баллы
18
Спасибо. Буду курить.
 

mEdvEd71

Client
Регистрация
03.01.2021
Сообщения
167
Благодарностей
7
Баллы
18
Добрый день. Решил попробовать на другом сайте. Составил такой Xpath:
//div[@class='entry fix']/div[@class='lock-block']/img
C#:
HtmlElement he = instance.ActiveTab.FindElementByXPath(@"//div[@class='entry fix']/div[@class='lock-block']/img", 0);
if (he.IsVoid) return -1;

var to_img = he.DrawAsBitmap(true); // в битмап
int res_x = 0;
int res_y = 0;
for (int x = 0; x< to_img.Width; x++){
for (int y = 0; y< to_img.Height; y++){
if (to_img.GetPixel(x,y).B > 0 & to_img.GetPixel(x,y).R > 0 & to_img.GetPixel(x,y).G> 0 ){
    res_x = Convert.ToInt32(he.GetAttribute("left")) + x - 5;
    res_y = Convert.ToInt32(he.GetAttribute("top")) + y + 5;
    break;
}
}
}
project.SendInfoToLog(res_x.ToString() +" "+ res_y.ToString());
instance.ActiveTab.FullEmulationMouseMove(res_x, res_y);
instance.ActiveTab.FullEmulationMouseClick("left", "click");
но клик по замку в капче не происходит. Вместо этого курсор уезжает в самый верх страницы и кликает там. В чем может быть причина? Xpath не правильный?
 

Вложения

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 980
Благодарностей
4 433
Баллы
113
Попробуйте без xPath классическим поиском:
HtmlElement he = instance.ActiveTab.FindElementByAttribute("img", "class", "lock", "text", 0);
 
  • Спасибо
Реакции: mEdvEd71

mEdvEd71

Client
Регистрация
03.01.2021
Сообщения
167
Благодарностей
7
Баллы
18
Поменял на классический поиск. Тоже самое, скроллит вверх до упора и там кликает.
 

Вложения

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 980
Благодарностей
4 433
Баллы
113

mEdvEd71

Client
Регистрация
03.01.2021
Сообщения
167
Благодарностей
7
Баллы
18
Подскажите, пожалуйста, что где править нужно, чтобы работало правильно.
 

mEdvEd71

Client
Регистрация
03.01.2021
Сообщения
167
Благодарностей
7
Баллы
18
По идее, ведь все манипуляции с картинкой одной должны осуществляться. Значит она не правильно определяется выражением или нет?
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 980
Благодарностей
4 433
Баллы
113

mEdvEd71

Client
Регистрация
03.01.2021
Сообщения
167
Благодарностей
7
Баллы
18

mEdvEd71

Client
Регистрация
03.01.2021
Сообщения
167
Благодарностей
7
Баллы
18
Так то даже по таком Xpath капча находится. По идее правильным должно быть выражение?
 

Вложения

mEdvEd71

Client
Регистрация
03.01.2021
Сообщения
167
Благодарностей
7
Баллы
18
Доброе утро. Подскажите, пожалуйста, как можно сделать, чтобы данный код работал без учета верстки, если это возможно? Ищу в гугле, но пока безрезультатно.(
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Доброе утро. Подскажите, пожалуйста, как можно сделать, чтобы данный код работал без учета верстки, если это возможно? Ищу в гугле, но пока безрезультатно.(
Тебе надо изучить работу с элементами на странице и посмотреть какие параметры вообще есть у элемента.
topInBrowser и top например

C#:
HtmlElement he = instance.ActiveTab.FindElementByXPath(@"//img[@class='lock']", 0);
if (he.IsVoid) return -1;

var to_img = he.DrawAsBitmap(true); // в битмап
int res_x = 0;
int res_y = 0;
for (int x = 0; x< to_img.Width; x++){
for (int y = 0; y< to_img.Height; y++){
if (to_img.GetPixel(x,y).B > 0 && to_img.GetPixel(x,y).R > 0 && to_img.GetPixel(x,y).G> 0 ){
    res_x = Convert.ToInt32(he.GetAttribute("leftInBrowser")) + x - 5;
    res_y = Convert.ToInt32(he.GetAttribute("topInBrowser")) + y + 5;
    break;
}
}
}
project.SendInfoToLog(res_x.ToString() +" "+ res_y.ToString());
instance.ActiveTab.FullEmulationMouseMove(res_x, res_y);
instance.ActiveTab.FullEmulationMouseClick("left", "click");
 
  • Спасибо
Реакции: mEdvEd71

mEdvEd71

Client
Регистрация
03.01.2021
Сообщения
167
Благодарностей
7
Баллы
18
Спасибо. Параметры ширина и высота изображения? Или это не то совсем?
 

Вложения

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113

mEdvEd71

Client
Регистрация
03.01.2021
Сообщения
167
Благодарностей
7
Баллы
18

Кто просматривает тему: (Всего: 7, Пользователи: 0, Гости: 7)