Erstellen Sie ein automatisches Tool zum Überspringen von YouTube-Anzeigen mit Python und OCR

Mokuji

  1. Zuallererst
  2. Demo
  3. Holen Sie sich die Zeichenfolge mit OCR
  4. Machen Sie eine Bildschirmaufnahme von Windows
  5. Erstellen Sie eine GUI mit wxPython
  6. Machen Sie exe mit Pyinstaller
  7. Schließlich

Einführung

Ich dachte, es wäre mühsam, beim Ansehen von YouTube auf die Schaltfläche "Anzeigen überspringen" zu klicken, und fragte mich, ob ich selbst ein Tool erstellen könnte. Ich habe mir verschiedene Methoden ausgedacht, aber ich dachte, es wäre einfacher, die Implementierungsmethode zu verstehen, die der menschlichen Bewegung näher kommt. Ich habe mich für ein Tool entschieden, das Zeichen mit OCR erkennt und auf das angegebene Teil klickt.

Obwohl es immer noch viele Leistungsprobleme gibt, konnte ich das Tool erstellen, das ich mir grob vorgestellt hatte. Notieren Sie sich das Know-how, das Sie beim Erstellen gelernt haben. Ich hoffe dieser Artikel hilft jemandem.

Quellcode

Demo

exe-Dateiformat. Es wird automatisch auf den Link zum Überspringen von Anzeigen auf Youtube geklickt.

Chunta Auto Click (Ausführungsdatei)

sample2.jpg

String mit OCR abrufen

Die OCR-Verarbeitung wurde mithilfe einer Software namens Tesseract aus Python realisiert. Um Tesseract von Python unter Windows zu verwenden, ist die Pip-Installation nicht gut. Ich musste das Modul herunterladen und in den Pfad einfügen. Insbesondere ist es wie folgt.

    #Tesseract in der Umgebungsvariablen PATH(OCR-Tool)Durchlaufen
    os.environ["PATH"] += os.pathsep + os.path.dirname(os.path.abspath(__file__)) + os.sep + RESORSES_FOLDER_NAME

Dieser Teil ist der Teil, der den Pfad zur Verwendung von Tesseract übergibt. Der Pfad wird an den Ordner RESORSES_FOLDER_NAME des Verzeichnisses übergeben, in dem sich das Skript befindet, damit es bei der Konvertierung in exe problemlos funktioniert. Speichern Sie das Tesseract-Modul in diesem Ordner RESORSES_FOLDER_NAME.

    # =========================
    #OCR-Verarbeitung
    # =========================
    tools = pyocr.get_available_tools()
    
    if len(tools) == 0:
        wx.MessageBox('OCR tool is not installed on the terminal.\n Das OCR-Tool ist nicht auf dem Terminal installiert.', 'Fehler Fehler')
        sys.exit(1)
    
    tool = tools[0]
    
    dst = tool.image_to_string(
        cap,
        lang='jpn',
        builder=pyocr.builders.WordBoxBuilder(tesseract_layout=6)
    )

Dies ist der Teil, in dem der Text tatsächlich mit Tesseract aus dem Bild erhalten wird. Es scheint, dass verschiedene Parameter angegeben werden können, aber es wurde gesagt, dass dieser Parameter gut für die Erkennung von Japanisch ist. Ich habe es auch ein bisschen versucht und bin zu diesem Parameter gekommen.

Machen Sie eine Bildschirmaufnahme von Windows

Ich habe win32api verwendet, um eine Bildschirmaufnahme unter Windows zu erhalten. Ich konnte es nicht mit pip install installieren, daher musste ich win32api separat installieren.

Außerdem musste eine spezielle Verarbeitung durchgeführt werden, um die Mehrfachanzeige zu unterstützen. Der Quellcode der folgenden Person war hilfreich. (Eher habe ich es fast so benutzt wie es ist)

Verbesserung der Geschäftseffizienz mit Python / RPA selbst erstellt? Prüfungsteil 5 So erfassen Sie den gesamten Bildschirm in einer Umgebung mit mehreren Monitoren

#==================================================================
#Desktop-Capture-Erfassung (Multi-Monitor-kompatibel)
#Der Code der Referenz-URL wird fast unverändert verwendet.
# 
# ref https://se.yuttar-ixm.com/multi-monitor-cap/
#==================================================================
def get_capture(flag_gray: bool = True):
    try:
        #Holen Sie sich die gesamte Desktop-Größe
        vscreenwidth = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)
        vscreenheigth = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)
        vscreenx = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)
        vscreeny = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)
        width = vscreenx + vscreenwidth
        height = vscreeny + vscreenheigth
    
        #Holen Sie sich den Desktop-Gerätekontext
        hwnd = win32gui.GetDesktopWindow() 
        windc = win32gui.GetWindowDC(hwnd)
        srcdc = win32ui.CreateDCFromHandle(windc)
        memdc = srcdc.CreateCompatibleDC()

        #Kopieren Sie Pixelinformationen aus dem Gerätekontext, bmp
        bmp = win32ui.CreateBitmap()
        bmp.CreateCompatibleBitmap(srcdc, width, height)
        memdc.SelectObject(bmp)
        memdc.BitBlt((0, 0), (width, height), srcdc, (0, 0), win32con.SRCCOPY)

        #Bildaufnahme / -anpassung
        img = np.frombuffer(bmp.GetBitmapBits(True), np.uint8).reshape(height, width, 4)
        if flag_gray is True :
            img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

        #Veröffentlichung
        srcdc.DeleteDC()
        memdc.DeleteDC()
        win32gui.ReleaseDC(hwnd, windc)
        win32gui.DeleteObject(bmp.GetHandle())

        return img
    
    except Exception as err:
        #Erfassungsfehler
        return None

GUI-Erstellung mit wxPython

Ursprünglich dachte ich daran, eine GUI zu erstellen. Dieses Mal war es neben Bequemlichkeit und Benutzerfreundlichkeit wichtig, eine grafische Benutzeroberfläche zu erstellen. Der Grund dafür ist, dass die OCR-Verarbeitung durch Tesseract für ein großes Bild wie eine Vollbildaufnahme etwa 5 bis 10 Sekunden dauert. Daher habe ich mich entschlossen, den Benutzer zu bitten, den Bereich anzugeben, der mit der GUI erfasst werden soll.

    # =========================
    #Verarbeitung beim Klicken auf die Fenstereinstellungsschaltfläche
    # =========================
    def onclick_window_btn(self, event):
        #Holen Sie sich ein Vollbild-Bild der angegebenen Größe
        self.img = get_capture_img(CAPTURE_IMG_WIDTH)
        
        #Bild anzeigen
        self.img_copy = None
        
        #Einstellung des Fensternamens
        cv2.namedWindow(winname='img')
        
        #Mausereigniseinstellungen
        cv2.setMouseCallback('img', self.draw_rectangle)
        
        #Bildschirm
        cv2.imshow('img', self.img)
        
        wx.MessageBox('Choose About Where Your Ads Appear.\n Wählen Sie den Ort aus, an dem die Werbung angezeigt werden soll', 'Werbefläche auswählen Werbefläche auswählen')
    
    # ==================================================
    #Zeichne ein Rechteck
    # ==================================================
    def draw_rectangle(self, event, x, y, flags, param):
        if event == cv2.EVENT_LBUTTONDOWN:
            self.flg_drawing = True
            self.ix, self.iy = x, y
        
        elif event == cv2.EVENT_MOUSEMOVE:
            if self.flg_drawing == True:
                self.img_copy = self.img.copy()
                self.img_copy = cv2.rectangle(self.img_copy, (self.ix, self.iy), (x, y), (0, 0, 255), -1)
                cv2.imshow('img', self.img_copy)
        
        elif event == cv2.EVENT_LBUTTONUP:
            self.flg_drawing = False
            self.img_copy = cv2.rectangle(self.img_copy, (self.ix, self.iy), (x, y), (0, 0, 255), -1)
            cv2.imshow('img', self.img_copy)
        
        if event == cv2.EVENT_LBUTTONUP:
            global setting_value
            
            #Erhöht sich nach rechts
            if self.ix < x:
                left = self.ix
                right = x
            else:
                left = x
                right = self.ix
            
            #Erhöht sich, wenn Sie nach unten gehen
            if self.iy < y:
                bottom = y
                top = self.iy
            else:
                bottom = self.iy
                top = y
            
            setting_value.top = top
            setting_value.bottom = bottom
            setting_value.left = left
            setting_value.right = right

Es ist ein Vorgang, eine Bildschirmaufnahme anzuzeigen und mit der Maus ein Quadrat auf das Bild zu zeichnen. Ermitteln Sie die Koordinaten des endgültig gezeichneten Rechtecks und verwenden Sie diese als Umfang für die Erfassung.

# ==================================================
# auto_Klicken Sie auf Thread
# ==================================================
class auto_click_Thread(threading.Thread):
    # =========================
    #Konstrukteur
    # =========================
    def __init__(self):
        super(auto_click_Thread, self).__init__()
        
        #Dämonisiert, um den Thread zu beenden, wenn der Anrufer beendet wird
        self.setDaemon(True)
    
    # =========================
    #Verarbeitung beenden
    # =========================
    def stop(self):
        global setting_value
        
        setting_value.flg_stop = True
    
    # =========================
    #Ausführungsverarbeitung
    # =========================
    def run(self):
        global setting_value
        
        setting_value.flg_stop = False
        
        txt = setting_value.txt
        min_interval_time = setting_value.min_interval_time
        top = int( setting_value.top * (1 / setting_value.rate) )
        bottom = int( setting_value.bottom * (1 / setting_value.rate) )
        left = int( setting_value.left * (1 / setting_value.rate) )
        right = int( setting_value.right * (1 / setting_value.rate) )
        
        click_text(txt, min_interval_time, top, bottom, left, right)

# ==================================================
#Start
# ==================================================
def start():
    global exec_thread
    global setting_value
    
    exec_thread = auto_click_Thread()
    exec_thread.start()

# ==================================================
#halt
# ==================================================
def stop():
    global exec_thread
    
    exec_thread.stop()

Dies ist der Teil, der die OCR-Verarbeitung über die GUI aufruft. Zusätzlich zum Thread-Kicking der GUI, damit sie nicht beschäftigt wird Es wird dämonisiert, sodass das Kind ebenfalls getötet wird, wenn der Elternteil getötet wird. Mit anderen Worten, die OCR-Verarbeitung wird nicht im Hintergrund ausgeführt, wenn die GUI geschlossen wird.

Es ist auch schwierig, einen Thread direkt zu beenden Die Verarbeitung wurde gestoppt, indem der Wert der globalen Variablen geändert wurde, auf die durch die OCR-Verarbeitung verwiesen wird.

Machen Sie exe mit Pyinstaller

Für eine normale exe-Konvertierung muss der Benutzer tesseract installieren. Das ist wirklich mühsam, deshalb habe ich es verfügbar gemacht, ohne es zu installieren.

    #Tesseract in der Umgebungsvariablen PATH(OCR-Tool)Durchlaufen
    os.environ["PATH"] += os.pathsep + os.path.dirname(os.path.abspath(__file__)) + os.sep + RESORSES_FOLDER_NAME

Dies ist ein Prozess, der sich mit dem obigen Teil überschneidet, aber den Pfad zum Ordner RESORSES_FOLDER_NAME im selben Ordner wie das Skript übergibt. Erstellen Sie nach der Konvertierung in exe einen Ordner RESORSES_FOLDER_NAME im Ordner exe und speichern Sie das Tesseract-Modul in diesem Ordner.

Nebenbei habe ich auch versucht, eine Datei mit --onefile of pyinstaller exe zu konvertieren, aber ich habe beendet, weil der Start mehr als 1 Minute gedauert hat.

pyinstaller --clean --icon=chunta_auto_click.ico -n chunta_auto_click chunta_auto_click.py --noconsole

Das Obige ist der Befehl, wenn er in exe konvertiert wird.

Schließlich

Obwohl es immer noch viele Leistungsprobleme gibt, konnte ich das Tool erstellen, das ich mir vorgestellt hatte. Ich war mir sehr bewusst, dass es für Leute wie mich eine gute Zeit war, die OCR-Bibliothek einfach zu nutzen, indem sie online Informationen sammelten. Ich hoffe dieser Artikel hilft jemandem.

Quellcode

Chunta Auto Click (Ausführungsdatei)

Recommended Posts

Erstellen Sie ein automatisches Tool zum Überspringen von YouTube-Anzeigen mit Python und OCR
Erstellen und entschlüsseln Sie Caesar-Code mit Python
[Python] Python und Sicherheit - Port-Scan-Tool mit Python
Suchen und laden Sie YouTube-Videos automatisch mit Python herunter
Erhalten Sie Kommentare auf Youtube Live mit [Python] und [Pytchat]!
Programmieren mit Python und Tkinter
Ver- und Entschlüsselung mit Python
Erstellen Sie ein 3D-GIF mit Python3
Holen Sie sich Youtube-Daten mit Python
YouTube-Videoverwaltung mit Python 3
Erstellen Sie LCD-Spiele (16x2) mit Raspberry Pi und Python
Lassen Sie uns ein PRML-Diagramm mit Python, Numpy und matplotlib erstellen.
Erstellen Sie mit python wxpython + openCV ein einfaches Videoanalysetool
Python mit Pyenv und Venv
Erstellen Sie ein Verzeichnis mit Python
Funktioniert mit Python und R.
Erstellen Sie mit Python und GAS Termine für AtCoder-Wettbewerbe in Google Kalender
Kommunizieren Sie mit FX-5204PS mit Python und PyUSB
Leuchtendes Leben mit Python und OpenCV
Erstellen Sie eine Plotanimation mit Python + Matplotlib
Roboter läuft mit Arduino und Python
Installieren Sie Python 2.7.9 und Python 3.4.x mit pip.
Erstellen Sie Awaitable mit der Python / C-API
AM-Modulation und Demodulation mit Python
Scraping mit Python, Selen und Chromedriver
Kratzen mit Python und schöner Suppe
Erstellen Sie eine virtuelle Umgebung mit Python!
Hadoop-Einführung und MapReduce mit Python
[GUI in Python] PyQt5-Drag & Drop-
Lesen und Schreiben von NetCDF mit Python
Ich habe mit PyQt5 und Python3 gespielt
Lesen und Schreiben von CSV mit Python
Mehrfachintegration mit Python und Sympy
Koexistenz von Python2 und 3 mit CircleCI (1.0)
Sugoroku-Spiel und Zusatzspiel mit Python
FM-Modulation und Demodulation mit Python
Erstellen und lesen Sie Messagepacks in Python
[AWS] Erstellen Sie mit CodeStar eine Python Lambda-Umgebung und führen Sie Hello World aus
Erstellen Sie mit Python + OpenCV Ihre eigene virtuelle Kamera und wenden Sie Originaleffekte an
Erstellen und bearbeiten Sie Tabellenkalkulationen in einem beliebigen Ordner auf Google Drive mit Python
Erstellen Sie eine Python3-Umgebung mit pyenv auf einem Mac und zeigen Sie NetworkX-Diagramme an
Erstellen Sie mit Python einen Entscheidungsbaum von 0 und verstehen Sie ihn (5. Information Entropy)
Kommunizieren Sie mit gRPC zwischen Elixir und Python
Datenpipeline-Aufbau mit Python und Luigi
Erstellen Sie mit Class einen Python-Funktionsdekorator
Überwachen Sie Mojo-Ausfälle mit Python und Skype
Erstellen Sie automatisch eine Python-API-Dokumentation mit Sphinx
Erstellen Sie mit python3 eine Wortwolke aus Ihrem Tweet
FM-Modulation und Demodulation mit Python Part 3
[Automatisierung] Bearbeiten Sie Maus und Tastatur mit Python
Erstellen Sie mit Python + PIL ein Dummy-Image.
Passwortlose Authentifizierung mit RDS und IAM (Python)
Python-Installation und Paketverwaltung mit pip