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.
exe-Dateiformat. Es wird automatisch auf den Link zum Überspringen von Anzeigen auf Youtube geklickt.
Chunta Auto Click (Ausführungsdatei)
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.
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)
#==================================================================
#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
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.
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.
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.
Chunta Auto Click (Ausführungsdatei)
Recommended Posts