Ersetzen wir UWSC durch Python (5) Machen wir einen Roboter

Einführung

"Ersetzen wir UWSC durch Python" Teil 5. Dieses Mal werden wir tatsächlich einen Roboter bauen. Ich konnte aus verschiedenen Gründen eine Weile nicht posten.

Wie ich das letzte Mal geschrieben habe, schreibe ich während der Überprüfung, daher denke ich, dass es einige Fehler gibt. In diesem Fall stellen Sie bitte eine Bishibashi-Bearbeitungsanfrage (Schweiß)

Als ich in UWSC gesucht habe, wurde es anscheinend durch die folgende Site ergänzt, daher werde ich versuchen, die Funktion zu implementieren, die ich im Forum schreiben möchte.

CSWU-Was zu tun Kompatibles System ohne UWSC https://wiki3.jp/CSWU

letztes Mal UWSC durch Python (4) Cheet Sheet [2] ersetzen nächstes Mal unentschlossen </ font>

Lassen Sie uns die fehlende Funktion machen

Wir werden einige der Funktionen erstellen, die UWSC in dieser Umgebung nicht bietet. Die zu machende Funktion ist

―― 1. Hervorhebung der Bildsuche (Fokus) ―― 2. Hervorhebung der Elementsuche (Fokus) --3. GETID / CLKITEM-Kompatibilitätsfunktion

Darüber hinaus waren die folgenden Websites beim Erstellen der Funktionen sehr hilfreich. Wenn Sie eine Funktion haben, die Sie erstellen möchten, sollten Sie darauf verweisen.

Python Example https://www.programcreek.com/python/

1. Markieren Sie die Bildsuche (Fokus)

Wenn Sie nach Bildern suchen, können Sie leicht erkennen, wo auf dem Bildschirm die Übereinstimmung hergestellt wurde, indem Sie ein Rechteck auf dem Bildschirm zeichnen. Wenn Sie win32gui importieren und geben (links, oben, rechts, unten), wird der erkannte Ort hervorgehoben. Wenn Sie den Linientyp oder die Farbe des Rechtecks ändern möchten, müssen Sie ihn mit "win32ui.CreatePen", "win32api.RGB", "pyhandle", "win32con" festlegen.

func_dhlight.py


import win32gui

##Desktop-Highlights
def dhlight(x1, y1, x2, y2):
    hwnd=win32gui.WindowFromPoint((x1,y1))
    hdc=win32gui.GetDC(hwnd)
    rc=(x1, y1, x2, y2)
    win32gui.DrawFocusRect(hdc, rc)
    win32gui.ReleaseDC(hwnd,hdc)

if __name__ == '__main__':
    ##Es fühlt sich an, als würde man es in Kombination mit pyautoguis locateOnScreen verwenden.
    ##LocateOnScreen ist jedoch Box(left, top, width, height)Weil es zurückkehrt
    pos_x,pos_y,size_w,size_h  = pyautogui.locateOnScreen('target.png')
    x1 = pos_x
    y1 = pos_y
    x2 = pos_x + size_w
    y2 = pos_y + size_h
    dhlight(x1, y1, x2, y2)
    ##Wenn Sie schreiben, zielen Sie.Dort, wo sich das PNG befindet, wird ein gepunktetes Rechteck angezeigt.

2. Markierung der Elementsuche (Fokus)

Bei der Suche nach einem Element im Browser wird hervorgehoben, welches Element ausgewählt wurde. Dies verwendet die CSS-Einfügung von Selen, sodass es bei dynamischer UI / UX möglicherweise nicht reagiert oder das Umschreiben von CSS verbietet (es ist besser, die Koordinaten des Elements zu nehmen und mit win32gui zu zeichnen). vielleicht) Ich habe gerade CSS angeschlossen ("Hintergrund: Weiß; Rand: 1px durchgehend blau;"), damit ich es nach meinen Wünschen ändern kann.

func_hhlight.py


from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException

##Highlights von Html Element
def hhlight(element):
    driver = element._parent
    def apply_style(s):
        driver.execute_script("arguments[0].setAttribute('style', arguments[1]);",element, s)
    original_style = element.get_attribute('style')
    apply_style("background: white; border: 1px solid blue;")
    time.sleep(.3)
    apply_style(original_style)


if __name__ == '__main__':
    driver = webdriver.Chrome()
    driver.implicitly_wait(10) 
    driver.set_page_load_timeout(5)
    driver.set_script_timeout(5)
    driver.get('https://www.google.com/')
    
    ##Wenn Sie nach einem Element suchen und das Element an die erstellte Funktion übergeben, wird das angegebene CSS angewendet.
    ##Sie können sehen, welches Element ausgewählt ist
    search_box = driver.find_element_by_name("q")
    hhlight(search_box)

3. GETID / CLKITEM-Kompatibilitätsfunktion

In UWSC habe ich GETID verwendet, um die Fenster-ID abzurufen und zu betreiben. In Python ist dies jedoch schwierig. Daher habe ich eine Funktion verwendet, um die Prozess-ID aus dem Fensternamen (get_pid) und das Fensterhandle aus der Prozess-ID (get_hwnds) abzurufen. Ich beschloss, es zu schaffen und damit umzugehen.

func_getid.py


import os,sys,re,time,subprocess
import win32api, win32gui, win32con, win32process

def get_pid(title):
    hwnd = win32gui.FindWindow(None, title)
    threadid,pid = win32process.GetWindowThreadProcessId(hwnd)
    return pid

def get_hwnds(pid):
    def callback(hwnd, hwnds):
        if win32gui.IsWindowVisible(hwnd) and win32gui.IsWindowEnabled(hwnd):
            _, found_pid = win32process.GetWindowThreadProcessId(hwnd)
            if found_pid == pid:
                hwnds.append(hwnd)
        return True
    hwnds = []
    win32gui.EnumWindows(callback, hwnds)
    return hwnds 

def clkitem(win_title,itemid):
    #Suche nach Fenstertitel
    hwnd = win32gui.FindWindow(0, win_title)

    #Listen Sie die Elemente im Fenster auf
    inplay_children = []
    def is_win_ok(hwnd, *args):
        s = win32gui.GetWindowText(hwnd)
        inplay_children.append(hwnd)
    win32gui.EnumChildWindows(hwnd, is_win_ok, None)

    #Geben Sie die Artikel-ID und den Artikel an/Holen Sie sich den Griff der Schaltfläche
    button_hwnd = inplay_children[itemid]

    #Aktivieren Sie das Fenster
    win32gui.SetForegroundWindow(hwnd)
    #Klicken Sie auf die angegebene Schaltfläche (drücken Sie)->Release senden)
    win32api.PostMessage(button_hwnd, win32con.WM_LBUTTONDOWN, 0, 0)
    win32api.PostMessage(button_hwnd, win32con.WM_LBUTTONUP, 0, 0)

#Prozess-ID von Fenster-ID abrufen
pid = get_pid(u"Taschenrechner")

#Klicken Sie auf die erste Schaltfläche im Taschenrechner
clkitem(u"Taschenrechner",1)

#Holen Sie sich das Handle von der Prozess-ID und arbeiten Sie[GETCTLHND]Gleichwertig
for hwnd in get_hwnds(pid):
    if hwnd == 0:
        print(u"Fenster nicht gefunden")
    else:
        #Größenangabe(Größe ändern)
        win32gui.MoveWindow(hwnd, 100, 100, 500, 500, True)
        #Maximieren
        win32gui.ShowWindow(hwnd, win32con.SW_MAXIMIZE)
        time.sleep(1)
        #schließen
        win32gui.SendMessage(hwnd,win32con.WM_CLOSE,0,0)

Sie können jetzt die Größe von nativen Apps auf Ihrem Bildschirm ändern, sie verschieben und fokussieren. Für den Browser ist es einfacher, mit Selen zu arbeiten.

Lass uns einen Roboter bauen

<< Betriebsszenario >>

Der in [] enthaltene Teil ist der zu verwendende Modulname

--1. Laden Sie ini (settings.ini) mit Anmeldeinformationen: [ConfigParser] --2 Öffnen Sie den Browser, maximieren Sie ihn und gehen Sie zu inis login_url: [Selenium] --3 Anmeldung mit Anmeldeinformationen: [Selen] --4. Zum angegebenen Bildschirm (Beitrag) wechseln: [Selenium / win32gui] --5. Öffnen Sie die Excel-Datei mit der Eintragsinformationsliste [xlrd]. --6.1 Zeile für Zeile im Eingabeformular [Selen] ―― 7. Wenn die letzte Zeile der Excel-Datei erkannt wird, schließen Sie den Bildschirm und beenden Sie [Selen]

Einstellungsdatei (settings.ini)

setting.ini


[Server]
login_id = user01
login_pw = password
login_url = https://127.0.0.1/wp/wp-login.php

[SitePage]
write_fourm =Post

[WriteFile]
excel_file = input_list.xlsx

input_list.xlsx


[Sheet1]
title,text,tag,format
Test 1,Erster Beitrag 1,Nicht kategorisiert,Standard
Test 2,Erster Beitrag 2,Nicht kategorisiert,Standard
Test 3,Erster Beitrag 3,Nicht kategorisiert,Standard
Test 4,Erster Beitrag 4,Nicht kategorisiert,Standard
Test 5,Erster Beitrag 5,Nicht kategorisiert,Standard
Test 6,Erster Beitrag 6,Nicht kategorisiert,Standard

Roboterquelle

Eigentlich werde ich die Quelle entsprechend dem Szenario schreiben. Eigentlich sollte ich mehr Funktionen erstellen und sie leichter lesbar machen, aber ich habe sie flach geschrieben, damit das Szenario leicht verfolgt werden kann. Bitte beachten Sie, dass es in UTF-8 geschrieben ist.

wordpress_auto_post.py


# -*- coding: utf-8 -*-

#Modul laden
import os,sys,re,time,subprocess
import pyautogui
import win32gui
import configparser
import xlrd
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.alert import Alert
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.select import Select

##Desktop-Highlights
def dhlight(x1, y1, x2, y2):
    hwnd=win32gui.WindowFromPoint((x1,y1))
    hdc=win32gui.GetDC(hwnd)
    rc=(x1, y1, x2, y2)
    win32gui.DrawFocusRect(hdc, rc)
    win32gui.ReleaseDC(hwnd,hdc)

##Highlights von Html Element
def hhlight(element):
    driver = element._parent
    def apply_style(s):
        driver.execute_script("arguments[0].setAttribute('style', arguments[1]);",element, s)
    original_style = element.get_attribute('style')
    apply_style("background: white; border: 1px solid blue;")
    time.sleep(.3)
    apply_style(original_style)

#Konfigurationsdatei lesen
CONF_FILEPATH = 'setting.ini'
config = configparser.ConfigParser()
config.read( CONF_FILEPATH, 'UTF-8')

#In der conf-Datei[]Geben Sie den Ort an, der von umgeben ist
config_server = config['Server']
config_page   = config['SitePage']
config_excel  = config['WriteFile']

#In conf[]Holen Sie sich den Inhalt, der Variablen und Daten enthält, unter
uid = config_server['login_id']
upw = config_server['login_pw']
url = config_server['login_url']
search_button = config_page['write_fourm']
xlsxfile = config_excel['excel_file']

##Chrome initialisieren
options = Options()

##Chrome-Pfad (normalerweise nicht angegeben, wenn tragbare Version usw. oder stabil verwendet wird/Beim Beta-Wechsel)
options.binary_location = 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'
options.add_argument('--start-maximized')
options.add_argument('--disable-gpu')

##Erstellen Sie ein Chrome WebDriver-Objekt.
driver = webdriver.Chrome(options=options,executable_path="C:\Python37\chromedriver.exe")

#Die Wartezeit bis zum Auffinden des Elements kann nur unmittelbar nach der Treibergenerierung angegeben werden
driver.implicitly_wait(10) 

#Geben Sie an, dass bis zu 5 Sekunden gewartet werden soll, bis die Seite vollständig geladen ist, nur unmittelbar nach der Treibergenerierung
driver.set_page_load_timeout(5)

#Geben Sie an, dass bis zu 5 Sekunden gewartet werden soll, bis die Ausführung von Javascript abgeschlossen ist
driver.set_script_timeout(5)

#URL verschieben
driver.get(url)

#Anmeldevorgang
user_id_elm  = driver.find_element_by_id("user_login")
#Element hervorheben
hhlight(user_id_elm)
user_id_elm.send_keys(uid)

user_pw_elm  = driver.find_element_by_id("user_pass")
hhlight(post_fourm)
user_pw_elm.send_keys(upw)

login_submit = driver.find_element_by_id("wp-submit")
hhlight(post_fourm)
login_submit.submit()

time.sleep(5)

#Post
menu_post_elm = driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[2]/ul/li[3]/a/div[3]")
hhlight(menu_post_elm)
menu_post_elm.click()

time.sleep(2)

#Neuer Zusatz
new_post_elm = driver.find_element_by_xpath("/html/body/div[1]/div[2]/div[2]/div[1]/div[3]/a")
hhlight(new_post_elm)
new_post_elm.click()

time.sleep(2)

#Öffnen Sie die Excel-Datei
wb = xlrd.open_workbook(xlsxfile)

#Blattbezeichnung
sheet = wb.sheet_by_name('sheet1')

#Erkennung der letzten Zeile
last_row = sheet.nrows

#Lesen Sie in ein zweidimensionales Array aller Zeilen(Wenn Sie nicht genügend Speicher haben, sollten Sie Zeile für Zeile lesen)
readcells = [sheet.row_values(row) for row in range(sheet.nrows)]

time.sleep(5)

#Artikelüberschrift
card_title_elm = driver.find_element_by_xpath("//*[@id='post-title-0']")

#Artikel Text
card_body_elm = driver.find_element_by_xpath("/html/body/div[1]/div[2]/div[2]/div[1]/div[3]/div[1]/div/div/div/div[2]/div[3]/div/div[1]/div/div/div[2]/div[1]/div[3]/div/div/div/div/div/div/p")

#Fahrer verlassen
driver.close()

Bewegen Sie den Roboter

python ./wordpress_auto_post.py

Es sollte sich ohne Probleme bewegen und veröffentlicht werden.

Schließlich

Es tut wirklich weh, UWSC zu verlieren, und ich hoffe, dass es einfachere Automatisierungstools gibt. Nächstes Mal werde ich eine Fortsetzung schreiben, wenn mir etwas einfällt.

Recommended Posts

Ersetzen wir UWSC durch Python (5) Machen wir einen Roboter
Lassen Sie uns eine GUI mit Python erstellen.
Lassen Sie uns ein Diagramm mit Python erstellen! !!
Lassen Sie uns mit Python ein Shiritori-Spiel machen
Lassen Sie uns mit Python langsam sprechen
Erstellen Sie ein Webframework mit Python! (1)
Machen wir einen Twitter-Bot mit Python!
Erstellen Sie ein Webframework mit Python! (2)
Machen Sie eine Lotterie mit Python
[Lass uns mit Python spielen] Ein Haushaltsbuch erstellen
Versuchen Sie, ein einfaches Spiel mit Python 3 und iPhone zu erstellen
[Super einfach] Machen wir einen LINE BOT mit Python.
Machen wir einen Blockbruch mit wxPython
Erstellen Sie ein Empfehlungssystem mit Python
Machen wir mit xCAT einen Spacon
Lassen Sie uns mit Python einen Web-Socket-Client erstellen. (Zugriffstoken-Authentifizierung)
Erstellen wir mit Python eine kostenlose Gruppe
Lassen Sie uns mit PLY 1 eine einfache Sprache erstellen
Machen wir mit Pylearn 2 eine dreiäugige KI
Lassen Sie uns eine Kombinationsberechnung mit Python durchführen
Erstellen Sie eine Desktop-App mit Python mit Electron
Lassen Sie uns einen Web-Chat mit WebSocket mit AWS serverless (Python) durchführen!
Machen Sie Twitter Trend Bot mit Heroku + Python
Ich möchte ein Spiel mit Python machen
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
[Ev3dev] Lassen Sie uns ein Fernsteuerungsprogramm von Python mit dem RPyC-Protokoll erstellen
Versuchen Sie, mit Python eine Diedergruppe zu bilden
Lassen Sie uns mit SWIG ein Modul für Python erstellen
Wenn Sie einen Discord-Bot mit Python erstellen möchten, verwenden wir ein Framework
Kombinieren Sie sich wiederholende Zeichenfolgen mit regulären Python-Ausdrücken zu einer.
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
[Übung] Erstellen Sie eine Watson-App mit Python! # 2 [Übersetzungsfunktion]
[Übung] Erstellen Sie eine Watson-App mit Python! # 1 [Sprachdiskriminierung]
Erstellen Sie einen einfachen Slackbot mit einer interaktiven Schaltfläche in Python
Machen Sie mit Python einen Haltepunkt auf der c-Ebene
Ich möchte mit einem Roboter in Python arbeiten.
Lassen Sie uns das Abhängigkeitsmanagement mit pip etwas einfacher machen
[Zum Spielen] Versuche Yuma zu einem LINE Bot zu machen (Python)
Erstellen Sie mit Python Pandas Py Installer ein CSV-Formatierungswerkzeug
Lassen Sie uns eine Mac-App mit Tkinter und py2app erstellen
Versuchen Sie, mit Rhinoceros / Grasshopper / GHPython ein sphärisches Gitter zu erstellen
Was ist Gott? Erstelle einen einfachen Chatbot mit Python
[Piyopiyokai # 1] Spielen wir mit Lambda: Erstellen eines Python-Skripts
Machen wir einen Discord Bot.
Machen wir Othello mit wxPython
Erstellen Sie ein Lesezeichen in Python
Schreiben wir Python mitinema4d.
Erstellen Sie ein Verzeichnis mit Python
Lassen Sie uns Git-Cat mit Python bauen
Machen Sie ein Feuer mit kdeplot
[Übung] Erstellen Sie eine Watson-App mit Python! # 3 [Klassifizierung der natürlichen Sprache]
Verknüpfen Sie Python Enum mit einer Funktion, um es aufrufbar zu machen
Erstellen wir ein Skript, das sich bei Ideone.com in Python registriert.
Experimentieren Sie mit Python, um ein PDF für Selbstversorger für Kindle zu erstellen
Lassen Sie uns ein PRML-Diagramm mit Python, Numpy und matplotlib erstellen.
Lassen Sie uns einen Roboter bauen, der den Zauberwürfel löst! 2 Algorithmus
Machen wir einen Spot Sale Service 4 (in Python Mini Hack-a-thon)