"Remplaçons UWSC par Python" Partie 5. Cette fois, nous allons fabriquer un robot. Je n'ai pas pu publier pendant un certain temps pour diverses raisons.
Comme je l'ai écrit la dernière fois, j'écris en vérifiant, donc je pense qu'il y a des erreurs. Dans ce cas, veuillez faire une demande de modification Bishibashi (transpiration)
Quand j'ai cherché sur UWSC, il semble qu'il ait été complété par le site suivant, donc je vais essayer d'implémenter la fonction que je veux écrire dans le forum.
CSWU-Que faire Système compatible sans UWSC https://wiki3.jp/CSWU
dernière fois Remplacez UWSC par Python (4) Cheet Sheet [2] la prochaine fois indécis </ font>
Nous allons créer certaines des fonctionnalités que UWSC n'a pas dans cet environnement. La fonction à faire est
―― 1. Recherche d'image (mise au point) en surbrillance ―― 2. Mise en évidence de la recherche d'élément (mise au point) --3. Fonction de compatibilité GETID / CLKITEM
De plus, les sites suivants ont été très utiles pour créer les fonctions. Si vous souhaitez créer une fonction, vous devez vous y référer.
Python Example https://www.programcreek.com/python/
Lorsque vous recherchez des images, vous pouvez facilement comprendre où sur l'écran la correspondance a été faite en dessinant un rectangle sur l'écran.
Si vous importez win32gui et donnez (gauche, haut, droite, bas), il mettra en évidence l'emplacement détecté. Si vous voulez changer le type de ligne ou la couleur du rectangle, vous devez le définir avec win32ui.CreatePen
, win32api.RGB
, pyhandle
, win32con
.
func_dhlight.py
import win32gui
##Points forts du bureau
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__':
##On a l'impression de l'utiliser en combinaison avec LocateOnScreen de pyautogui.
##Cependant, LocateOnScreen est Box(left, top, width, height)Parce qu'il revient
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)
##Si vous écrivez, ciblez.Un rectangle en pointillé s'affiche là où le png se trouve.
Lors de la recherche d'un élément sur le navigateur, il mettra en évidence quel élément a été sélectionné. Cela utilise l'insertion css de sélénium, il peut donc ne pas répondre dans le cas de l'interface utilisateur / UX dynamique ou interdire la réécriture de css (il est préférable de prendre les coordonnées de l'élément et de dessiner avec win32gui) peut être) Je viens de brancher css ("background: white; border: 1px solid blue;"), donc je peux le changer à mon goût.
func_hhlight.py
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
##Faits saillants de l'élément Html
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/')
##Comme ça, lorsque vous recherchez un élément et passez l'élément à la fonction créée, le CSS spécifié est appliqué,
##Vous pourrez voir quel élément est sélectionné
search_box = driver.find_element_by_name("q")
hhlight(search_box)
Dans UWSC, j'ai utilisé GETID pour obtenir l'ID de fenêtre et je l'ai exploité, mais il est difficile de le faire en Python tel quel, j'ai donc utilisé une fonction pour obtenir l'ID de processus à partir du nom de la fenêtre (get_pid) et le handle de fenêtre à partir de l'ID de processus (get_hwnds). J'ai décidé de le faire et de m'en occuper.
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):
#Recherche par titre de fenêtre
hwnd = win32gui.FindWindow(0, win_title)
#Liste des éléments dans la fenêtre
inplay_children = []
def is_win_ok(hwnd, *args):
s = win32gui.GetWindowText(hwnd)
inplay_children.append(hwnd)
win32gui.EnumChildWindows(hwnd, is_win_ok, None)
#Spécifiez le numéro d'identification de l'article et l'article/Prenez la poignée du bouton
button_hwnd = inplay_children[itemid]
#Activer la fenêtre
win32gui.SetForegroundWindow(hwnd)
#Cliquez sur le bouton spécifié (appuyez sur)->Envoyer un communiqué)
win32api.PostMessage(button_hwnd, win32con.WM_LBUTTONDOWN, 0, 0)
win32api.PostMessage(button_hwnd, win32con.WM_LBUTTONUP, 0, 0)
#Obtenir l'ID de processus à partir de l'ID de fenêtre
pid = get_pid(u"calculatrice")
#Cliquez sur le premier bouton de la calculatrice
clkitem(u"calculatrice",1)
#Obtenir la poignée de l'ID de processus et fonctionner[GETCTLHND]Équivalent à
for hwnd in get_hwnds(pid):
if hwnd == 0:
print(u"Fenêtre introuvable")
else:
#Spécification de taille(redimensionner)
win32gui.MoveWindow(hwnd, 100, 100, 500, 500, True)
#Maximiser
win32gui.ShowWindow(hwnd, win32con.SW_MAXIMIZE)
time.sleep(1)
#Fermer
win32gui.SendMessage(hwnd,win32con.WM_CLOSE,0,0)
Vous pouvez désormais redimensionner, déplacer et concentrer les applications natives sur votre écran. En ce qui concerne le navigateur, il est plus facile d'utiliser le sélénium.
La partie entre [] est le nom du module à utiliser
--1. Charger le fichier ini (setting.ini) contenant les informations de connexion: [ConfigParser] --2 Ouvrez le navigateur, agrandissez-le, puis accédez à login_url d'ini: [Selenium] --3 Connexion en utilisant les informations de connexion: [Selenium] --4. Passer à l'écran spécifié (post): [Selenium / win32gui] --5. Ouvrez le fichier Excel contenant la liste des informations sur les entrées [xlrd] --6.1 Ligne par ligne publiée dans le formulaire de saisie [Selenium] ―― 7. Lorsque la dernière ligne du fichier Excel est détectée, fermez l'écran et quittez [Selenium]
setting.ini
[Server]
login_id = user01
login_pw = password
login_url = https://127.0.0.1/wp/wp-login.php
[SitePage]
write_fourm =Publier
[WriteFile]
excel_file = input_list.xlsx
input_list.xlsx
[Sheet1]
title,text,tag,format
Test 1,Premier message 1,Non classé,la norme
Test 2,Premier message 2,Non classé,la norme
Test 3,Premier message 3,Non classé,la norme
Test 4,Premier message 4,Non classé,la norme
Test 5,Premier message 5,Non classé,la norme
Test 6,Premier message 6,Non classé,la norme
En fait, j'écrirai la source en fonction du scénario. En fait, je devrais créer plus de fonctions et les rendre plus faciles à lire, mais je les ai écrites à plat pour que le scénario puisse être facilement suivi. Veuillez noter qu'il est écrit en UTF-8.
wordpress_auto_post.py
# -*- coding: utf-8 -*-
#Chargement du module
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
##Points forts du bureau
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)
##Faits saillants de l'élément HTML
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)
#Lire le fichier de configuration
CONF_FILEPATH = 'setting.ini'
config = configparser.ConfigParser()
config.read( CONF_FILEPATH, 'UTF-8')
#Dans le fichier conf[]Spécifiez le lieu entouré de
config_server = config['Server']
config_page = config['SitePage']
config_excel = config['WriteFile']
#En conf[]Récupérez le contenu contenant des variables et des données sous
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']
##Initialiser Chrome
options = Options()
##Chemin Chrome (généralement pas besoin de spécifier, lors de l'utilisation de la version portable, etc. ou stable/Lors du passage à la version bêta)
options.binary_location = 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'
options.add_argument('--start-maximized')
options.add_argument('--disable-gpu')
##Créez un objet Chrome WebDriver.
driver = webdriver.Chrome(options=options,executable_path="C:\Python37\chromedriver.exe")
#Temps d'attente jusqu'à ce que l'élément soit trouvé, ne peut être spécifié qu'immédiatement après la génération du pilote
driver.implicitly_wait(10)
#Spécifiez d'attendre jusqu'à 5 secondes pour que la page se charge complètement, uniquement immédiatement après la génération du pilote
driver.set_page_load_timeout(5)
#Spécifiez d'attendre jusqu'à 5 secondes pour que l'exécution de Javascript se termine
driver.set_script_timeout(5)
#Déplacement d'URL
driver.get(url)
#Processus de connexion
user_id_elm = driver.find_element_by_id("user_login")
#Élément en évidence
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)
#Publier
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)
#Nouvel ajout
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)
#Ouvrez le fichier Excel
wb = xlrd.open_workbook(xlsxfile)
#Désignation de la feuille
sheet = wb.sheet_by_name('sheet1')
#Détection de la dernière ligne
last_row = sheet.nrows
#Lire dans un tableau à deux dimensions de toutes les lignes(Si vous n'avez pas assez de mémoire, vous devriez lire ligne par ligne)
readcells = [sheet.row_values(row) for row in range(sheet.nrows)]
time.sleep(5)
#Le titre de l'article
card_title_elm = driver.find_element_by_xpath("//*[@id='post-title-0']")
#Texte de l'article
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")
#Quitter le pilote
driver.close()
python ./wordpress_auto_post.py
Il devrait bouger et être affiché sans aucun problème.
Cela fait vraiment mal de perdre UWSC, et j'espère qu'il y aura des outils d'automatisation plus faciles. La prochaine fois, j'écrirai une suite si je trouve quelque chose.
Recommended Posts