Bot en python3, cómo conseguir que tu ordenador reconozca imágenes por pantalla.

El objetivo de este tutorial es continuar el proyecto https ://1938.com.es/bot-click-python y unificar la automatización de tareas a través de clicks con la búsqueda de imágenes por pantalla en Python 3.

Podéis descargar el repositorio con el código de ejemplo del tutorial en la url https://github.com/al118345/Ejemplo_bot_python o el siguiente video:

Instalación.

Para instalar este proyecto lo único que necesitarás es tener la librería pynput y screen-search en tu entorno. Para ello ejecuta el siguiente comando cuando descargue el proyecto:

python -m pip install --upgrade pip
pip install -r requirements.txt

En caso de utilizar Linux y Python 3.7 ejecuta también el siguiente comando y te aparece un error NOTE: You must install tkinter on Linux to use MouseInfo. Run the following: sudo apt-get install python3-tk python3-dev
sudo apt-get install python3.7-tk

Otro detalle es que, si tu versión es 3.8 , la versión a instalar es python 3.8-tk. De no hacerlo, aparece un error

Buscar una imagen de la pantalla y realizar click sobre ella.

El siguiente código simplemente busca una imagen por pantalla para, una vez encontrada, presionar sobre ella.

# -*- coding: utf-8 -*-
from pynput.mouse import Button, Controller
import time
from screen_search import Search

mouse = Controller()
def click_raton_posicion (x,y):
    mouse.position = (x, y)
    print('Now we have moved it to {0}'.format(
        mouse.position))
    # Press and release
    mouse.press(Button.left)
    mouse.release(Button.left)
    time.sleep(1)



def imagen():
    search = Search("img/viewgrip_start.png")
    pos = search.imagesearch()
    print('dasda')
    if pos[0] == -1:
        return False
    else:
        return pos


while True:
    coordenadas = imagen()
    #si encuentro
    if coordenadas!= False:
        click_raton_posicion (coordenadas[0], coordenadas[1])
    time.sleep(150)

Básicamente, tenemos un bucle infinito que, cada 150 segundos, busca la imagen en la pantalla cómo se muestra a continuación

while True:
    coordenadas = imagen()
    #si encuentro
    if coordenadas!= False:
        click_raton_posicion (coordenadas[0], coordenadas[1])
    time.sleep(150)
El método para buscar por pantalla es muy sencillo, simplemente imagesearch() busca la imagen que desees. Si no la encuentra devuelve [-1,-1], en caso contrario, proporciona las coordenadas. EL método se utiliza de la siguiente forma:

def imagen():
    search = Search("img/viewgrip_start.png")
    pos = search.imagesearch()
    print('dasda')
    if pos[0] == -1:
        return False
    else:
        return pos

Por último, presionamos en las coordenadas con la siguiente función:

mouse = Controller()
def click_raton_posicion (x,y):
    mouse.position = (x, y)
    print('Now we have moved it to {0}'.format(
        mouse.position))
    # Press and release
    mouse.press(Button.left)
    mouse.release(Button.left)
    time.sleep(1)

Límites de fiabilidad

La automatización basada en imagen funciona mejor cuando la interfaz es estable: misma resolución, mismo tema, mismo nivel de zoom y posición predecible de la ventana. Si el boton cambia de color, si el navegador escala la página o si el sistema operativo usa otra densidad de pantalla, la búsqueda por captura puede dejar de coincidir.

Por eso conviene entender este enfoque como una técnica practica de automatización de escritorio, no como sustituto de una API real. Cuando exista una API, es preferible usarla. La detección por imagen tiene sentido cuando la aplicación objetivo no ofrece un punto de integración fiable.

Lista de seguridad

  • Añade una condición de parada visible o una interrupción por teclado antes de dejar el bucle ejecutandose.
  • Usa una espera razonable para evitar clicks descontrolados.
  • Prueba primero con ventanas inofensivas antes de automatizar software importante.
  • Usa capturas pequeñas y específicas para reducir falsos positivos.

Si el siguiente paso es leer texto de la pantalla, continua con el tutorial de OCR con Python y Tesseract.

Una regla útil en pruebas es registrar cada coincidencia detectada con sus coordenadas y marca de tiempo. Si el bot hace click en el sitio equivocado, esos logs ayudan a saber si el problema estaba en la imagen plantilla, la escala de pantalla, la espera o el estado de la aplicación. Conserva esos logs solo para depurar y elimina capturas sensibles cuando ya no sean necesarias.

Como hacer el bot más mantenible

Una mejora practica consiste en separar la automatización en tres funciones pequenas: capturar la pantalla, decidir si la imagen objetivo esta presente y ejecutar el click. Cuando esos pasos son independientes, puedes probar la lógica de reconocimiento con capturas guardadas antes de permitir que el bot mueva el raton. Eso reduce el riesgo de clicks accidentales mientras ajustas la imagen plantilla.

También conviene añadir un numero máximo de intentos y un timeout. Los bucles infinitos son comodos para el primer prototipo, pero una automatización de producción necesita un estado final claro: objetivo encontrado, objetivo no encontrado, usuario cancela o pantalla inesperada. Esos estados hacen los logs más legibles y evitan que el script siga horas ejecutandose sin trabajo útil.

Si la aplicación objetivo cambia a menudo, guarda varias imágenes plantilla y pruebalas con un umbral de confianza. Una sola captura puede ser demasiado fragil cuando la interfaz tiene modo oscuro, estados hover, traducciones o diferentes configuraciones de DPI.

Cuando el bot forma parte de un flujo repetido, añade un fichero de configuración para rutas de imágenes, esperas y numero máximo de intentos. Los valores hard-coded sirven para una primera lección, pero la configuración permite reutilizar el mismo script en varios entornos sin editar código fuente cada vez que cambia la pantalla.