Remplaçons UWSC par Python (5) Faisons un robot

introduction

"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>

Faisons la fonction manquante

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/

1. Recherche d'image (mise au point) en surbrillance

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.

2. Mise en évidence de la recherche d'élément (mise au point)

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)

3. Fonction de compatibilité GETID / CLKITEM

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.

Faisons un robot

<< Scénario de fonctionnement >>

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]

Fichier de configuration (setting.ini)

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

Source du robot

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()

Déplacer le robot

python ./wordpress_auto_post.py

Il devrait bouger et être affiché sans aucun problème.

finalement

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

Remplaçons UWSC par Python (5) Faisons un robot
Faisons une interface graphique avec python.
Faisons un graphe avec python! !!
Faisons un jeu de shiritori avec Python
Faisons la voix lentement avec Python
Créez un framework Web avec Python! (1)
Faisons un bot Twitter avec Python!
Créez un framework Web avec Python! (2)
Faites une loterie avec Python
[Jouons avec Python] Créer un livre de comptes de ménage
Essayez de créer un jeu simple avec Python 3 et iPhone
[Super facile] Faisons un LINE BOT avec Python.
Faisons une rupture de bloc avec wxPython
Créer un système de recommandation avec python
Faisons un spacon avec xCAT
Créons un client de socket Web avec Python. (Authentification par jeton d'accès)
Créons un groupe gratuit avec Python
Faisons un langage simple avec PLY 1
Faisons une IA à trois yeux avec Pylearn 2
Faisons un calcul de combinaison avec Python
Créez une application de bureau avec Python avec Electron
Faisons une discussion WEB en utilisant WebSocket avec AWS sans serveur (Python)!
Créer un bot Twitter Trend avec heroku + Python
Je veux faire un jeu avec Python
Essayez de créer un code de "décryptage" en Python
[Ev3dev] Faisons un programme de contrôle à distance par Python avec le protocole RPyC
Essayez de créer un groupe de dièdre avec Python
Faisons un module pour Python en utilisant SWIG
Si vous voulez créer un bot discord avec python, utilisons un framework
Combinez des chaînes répétitives en une seule avec des expressions régulières Python.
Faisons un outil de veille de commande avec python
[Pratique] Créez une application Watson avec Python! # 2 [Fonction de traduction]
[Pratique] Créez une application Watson avec Python! # 1 [Discrimination linguistique]
Créez un Slackbot simple avec un bouton interactif en python
Faire un point d'arrêt sur la couche c avec python
Je veux travailler avec un robot en python.
Facilitons un peu la gestion des dépendances avec pip
[Pour jouer] Essayez de faire de Yuma un robot LINE (Python)
Créer un outil de formatage CSV avec Python Pandas Py Installer
Créons une application Mac avec Tkinter et py2app
Essayez de créer une grille sphérique avec Rhinoceros / Grasshopper / GHPython
Qu'est-ce que Dieu? Créez un chatbot simple avec python
[Piyopiyokai # 1] Jouons avec Lambda: création d'un script Python
Faisons un robot Discord.
Faisons Othello avec wxPython
Créer un bookmarklet en Python
Écrivons python avec cinema4d.
Créer un répertoire avec python
Construisons git-cat avec Python
Faire un feu avec kdeplot
[Pratique] Créez une application Watson avec Python! # 3 [Classification du langage naturel]
Associez Python Enum à une fonction pour la rendre appelable
Créons un script qui s'enregistre avec Ideone.com en Python.
Expérimentez pour créer un PDF indépendant pour Kindle avec Python
Créons un diagramme PRML avec Python, Numpy et matplotlib.
Faisons un robot qui résout le Rubik Cube! 2 Algorithme
Faisons un service de vente au comptant 4 (en Python mini Hack-a-thon)