python脚本 : 基于opencv和pyautogui的天翼校园掉线自动重连脚本

# main.py
import sys
import threading
import cv2
import numpy as np
import pyautogui
import time
from PIL import ImageGrab
import logging
from PyQt5 import QtWidgets
from qt_material import apply_stylesheet
from main_window import Ui_Form

# 读取目标图片
image_message = cv2.imread('message.png')
image_login = cv2.imread('login.png')
h1, w1, _ = image_message.shape
h2, w2, _ = image_login.shape
threshold = 0.6
run_flag = False
labelEdit = None
errorNum = 0


# 子线程
class start_threading:

    def __init__(self):
        self.image = None
        self.run()

    def find(self, image):
        self.image = image
        screenshot = None
        # 获取屏幕截图
        # screenshot = ImageGrab.grab()
        try:
            screenshot = ImageGrab.grab()
        except OSError as OSE:
            print(f'[{self.get_time()}] {OSE}')
        except Exception as other_err:
            print(f'[{self.get_time()}] {other_err}')

        # screenshot.save(f'src/{self.get_time()}.png')
        if screenshot is None:
            return [-1, -1]
        screenshot = np.array(screenshot)
        # 在屏幕截图上搜索目标图片
        result = cv2.matchTemplate(screenshot, image, cv2.TM_CCOEFF_NORMED)
        loc = np.where(result >= threshold)
        if len(loc[0]) > 0 and len(loc[1]) > 0:
            return [loc[1][0], loc[0][0]]
        else:
            return [0, 0]

    def get_time(self):
        now = time.strftime('%Y-%m-%d %H-%M-%S', time.localtime())
        return now

    def run(self):
        try:
            while True:

                global run_flag, errorNum

                while run_flag:
                    now = self.get_time()
                    set_label_text(f'[{now}]\nchecking...\nerrorNum: {errorNum}')
                    print(f'[{now}]\n checking...')
                    x, y = self.find(image_message)

                    if x == 0:
                        # print(f' running normally!')
                        pass
                    elif x < 0:
                        set_label_text(f'[{self.get_time()}] 截图失败!')
                        # print(f'[{self.get_time()}] screen grab failed')
                    else:
                        errorNum = errorNum + 1
                        now = self.get_time()
                        set_label_text(f'[{now}]\n Error! Enable automated scripts...')
                        # print(f'[{now}]\n Error! Enable automated scripts...')
                        time.sleep(1)
                        # print(f'[message_pos]: {x},{y}')
                        pyautogui.click(x + w1 // 2, y + h1 // 2)
                        time.sleep(1)

                        while run_flag:
                            x, y = self.find(image_login)
                            if x == 0:
                                now = self.get_time()
                                set_label_text(f'[{now}]\nError!\ncant not find login button!\ntrying again...')
                                # print("Error! can't not find login! trying again...")
                                time.sleep(3)
                            else:
                                time.sleep(1)
                                # print(f'[login_pos]: {x},{y}')
                                pyautogui.click(x + w2 // 2, y + h2 // 2)
                                now = self.get_time()
                                set_label_text(f'[{now}]\nSuccess!\nAutomation script completed.')
                                # print("Success! Automation script completed.")
                                break
                    time.sleep(3)
                time.sleep(3)

        except OSError as OSE:
            set_label_text(f'系统错误: {OSE}')
            print(f'[{self.get_time()}]系统错误: {OSE}')

        except Exception as other_error:
            now = self.get_time()
            set_label_text(f'{now}未知错误\n:{other_error}')
            print(f'{now}未知错误\n:{other_error}')

        finally:
            print("STOP")


# 主窗口
class MainWindow(QtWidgets.QWidget, Ui_Form):

    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        global labelEdit
        labelEdit = self.label
        apply_stylesheet(app, theme='dark_teal.xml')

    def click_start_button(self):
        global run_flag
        if run_flag:
            run_flag = False
            self.startButton.setText("RESTART")
            self.label.setText("Click button to start.")
        else:
            run_flag = True
            self.startButton.setText("STOP")
            self.label.setText("Running...\n")


thread = threading.Thread(target=start_threading)


def set_label_text(message):
    labelEdit.setText(message)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    # 开启检测子线程
    thread.daemon = True
    thread.start()

    test_ui = MainWindow()
    test_ui.show()

    sys.exit(app.exec_())
# main_window.py
from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("AutoLogin")
        Form.resize(300, 250)
        Form.setMinimumSize(QtCore.QSize(300, 250))
        Form.setMaximumSize(QtCore.QSize(300, 250))
        font = QtGui.QFont()
        font.setFamily("微软雅黑")
        font.setPointSize(12)
        Form.setFont(font)
        Form.setContextMenuPolicy(QtCore.Qt.NoContextMenu)
        self.verticalLayoutWidget = QtWidgets.QWidget(Form)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 311, 261))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.label = QtWidgets.QLabel(self.verticalLayoutWidget)
        self.label.setMinimumSize(QtCore.QSize(0, 180))
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.verticalLayout.addWidget(self.label)
        spacerItem = QtWidgets.QSpacerItem(20, 25, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)
        self.verticalLayout.addItem(spacerItem)
        self.startButton = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.startButton.setMinimumSize(QtCore.QSize(130, 0))
        self.startButton.setMaximumSize(QtCore.QSize(150, 16777215))
        self.startButton.setObjectName("startButton")
        self.verticalLayout.addWidget(self.startButton, 0, QtCore.Qt.AlignHCenter)
        spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout.addItem(spacerItem1)

        self.retranslateUi(Form)
        self.startButton.clicked.connect(Form.click_start_button) # type: ignore
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "AutoLogin"))
        self.label.setText(_translate("Form", "Click to Start."))
        self.startButton.setText(_translate("Form", "Start"))

 

posted @ 2023-10-21 00:19  memo2586  阅读(147)  评论(0)    收藏  举报