fuk
@fuk
Z fmdmfkgngdnsgkfd /klsdg

Как починить решение капчи?

Я делаю робота который бы за меня кликал в одну точку, но если вылезает капча, то он бы её решал. Вот ссылка на сообщество в котором я пытаюсь это сделать: https://vk.com/radiationbot. Капча у них это шесть смайликов к разном порядке и нужно нажать на алмазик, я решил проверять ту точку в которую я кликаю, на, то зелёная ли она. Если нет, то он получает цвета из шести позиций и если это цвет алмазика, то кликает на него, затем нажимает на кнопку в сообщении выше и продолжает работать в штатном режиме. Пиксели по которым я определял цвета идут в разрешении 1920x1080. Но бот мискликает почти всегда и не определяет наличие капчи. Вот мой код, может кто-то посоветует как это решить:
import pyautogui
from PIL import Image
import time

# Координаты пикселя, который нужно проверить

# Задержка в одну секунду
delay = 1

def captcha_solution():
    print('Statesment: ERROR(captcha)')
    first_cap_pixel_color = screenshot.getpixel((680, 658))
    second_cap_pixel_color = screenshot.getpixel((731, 658))
    third_cap_pixel_color = screenshot.getpixel((781, 658))
    four_cap_pixel_color = screenshot.getpixel((680, 695))
    five_cap_pixel_color = screenshot.getpixel((731, 695))
    six_cap_pixel_color = screenshot.getpixel((781, 695))
    if first_cap_pixel_color == (128, 227, 255) or first_cap_pixel_color == (117, 204, 228):
        print("Outgoing signal: Solution founded, working busy...")
        pyautogui.moveTo(680, 658, duration=delay)
        pyautogui.click(680, 658)

        pyautogui.moveTo(690, 480, duration=delay)
        pyautogui.click(690, 480)
        print("Outgoing signal: Captcha Soluted, working...")   
    elif second_cap_pixel_color == (128, 227, 255) or second_cap_pixel_color == (117, 204, 228):
        print("Outgoing signal: Solution founded, working busy...")
        pyautogui.moveTo(731, 658, duration=delay)
        pyautogui.click(731, 658)

        pyautogui.moveTo(690, 480, duration=delay)
        pyautogui.click(690, 480)
    elif third_cap_pixel_color == (128, 227, 255) or third_cap_pixel_color == (117, 204, 228):
        print("Outgoing signal: Solution founded, working busy...")
        pyautogui.moveTo(781, 658, duration=delay)
        pyautogui.click(781, 658)

        pyautogui.moveTo(690, 480, duration=delay)
        pyautogui.click(690, 480)
        print("Outgoing signal: Captcha Soluted, working...")
    elif four_cap_pixel_color == (128, 227, 255) or four_cap_pixel_color == (117, 204, 228):
        print("Outgoing signal: Solution founded, working busy...")
        pyautogui.moveTo(680, 695, duration=delay)
        pyautogui.click(680, 695)

        pyautogui.moveTo(690, 480, duration=delay)
        pyautogui.click(690, 480)
        print("Outgoing signal: Captcha Soluted, working...")
    elif five_cap_pixel_color == (128, 227, 255) or five_cap_pixel_color == (117, 204, 228):
        print("Outgoing signal: Solution founded, working busy...")
        pyautogui.moveTo(731, 695, duration=delay)
        pyautogui.click(731, 695)

        pyautogui.moveTo(690, 480, duration=delay)
        pyautogui.click(690, 480)
        print("Outgoing signal: Captcha Soluted, working...")
    elif six_cap_pixel_color == (128, 227, 255) or six_cap_pixel_color == (117, 204, 228):
        print("Outgoing signal: Solution founded, working busy...")
        pyautogui.moveTo(781, 695, duration=delay)
        pyautogui.click(781, 695)

        pyautogui.moveTo(690, 480, duration=delay)
        pyautogui.click(690, 480)
        print("Outgoing signal: Captcha Soluted, working...")

while True:
    # Получаем скриншот экрана
    screenshot = pyautogui.screenshot()

    # Получаем цвет пикселя на координатах (x, y)
    farm_pixel_color = screenshot.getpixel((692, 697))

    # Если пиксель зеленый, нажимаем на него
    if farm_pixel_color == (75, 179, 75) or farm_pixel_color == (70, 162, 70):
        pyautogui.moveTo(692, 697, duration=delay)
        if farm_pixel_color == (75, 179, 75) or farm_pixel_color == (70, 162, 70):
            pyautogui.click(692, 697)
            print("Statesment: OK")
        else:
            captcha_solution()
    else:
        captcha_solution()
  • Вопрос задан
  • 206 просмотров
Пригласить эксперта
Ответы на вопрос 3
dimonchik2013
@dimonchik2013
non progredi est regredi
думаю, основная проблема это
=== зеленый

давай в отладку
а) бери значения цвета по координате - что он зачастую возвращает
б) приводи к чернобелому или градациям серого и проделывай клики там
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Обычно при работе с распознаванием картинок не используют точное равенство пикселов. Картинка может
быть отрегулирована по яркость/контраст/гамма. И это сбивает такие компараторы.

А цвета сравнивают по цветовой дистанции. Тоесть насколько далеко один цвет отстоит от другого в цветовом кубе
например. Функция какого-то такого вида

def colorDistance(r1,g1,b1, r2,g2,b2) -> int :
   return .....


Для сравнения картинки с картинкой можно использовать аналогичный прицнип. Скалярное произведение
всех пикселов. Вот. И сравнить с известными образцами. В теории это можно назвать однослойным нейроном
(или 0-слойным) в зависимости от определений.
Ответ написан
RimMirK
@RimMirK
Вроде человек. Вроде учусь. Вроде пайтону
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы