每日自动登录系统打卡 --selenium无头模式

selenium --Chrome

@功能1:实现了获取浏览器版本、Webdriver驱动下载、解压文件
@功能2:实现了定时启动、检测驱动完整性、存储用户的账号密码邮箱
@功能3:实现了自动输入账号密码、动作链操作滑块(验证码)
@功能4:实现了网络等异常捕获反馈以及邮件通知功能
@功能5:检测网页的大小,并自动调整浏览器的分辨率
@功能6:浏览器的无头模式,网页节点id获取像素坐标img(验证码)定位、截图,裁剪
@功能7:防扣费(打码费)机制、程序异常重启机制
@功能8:异常日志收集功能

  • 实际演示效果(本文章仅用于学习参考)


    9a665451cfef583f4e478ad8a4acd3a.jpg

    邮件信息通知.PNG
异常日志.PNG
获取到的验证码.png
捕获屏幕截图.PNG

以下为(主脚本实现功能)核心的代码

#!/usr/home/orangepi/pythonWJ python3
# -*- encoding: utf-8 -*-
"""
@File    :   Epidemic prevention and control.py
@Contact :   t.ianxi@foxmail.com
@License :   // Copyright (C) 2018 Milo Yip<dell>

@Modify Time      @Author    @Version    @Desciption
------------      -------    --------    -----------
2022/2/21 13:28     MuKe~       1.0      1、第二次优化新增字符画
2022/5/16 19:26     MuKe~       5.0      1、优化邮件发送问题
                                         2、优化了代码的稳定性
                                         3、降低了对硬件资源的占用率
                                         4、彻底修复了因超级鹰识别坐标值过大导致的滑块验证码(ActionChains动作链)异常
                                         5、已修复验证码截图像素点偏移问题
                                         6、新增日志记录功能
                                         7、解决了当超级鹰识别不准确时,判定验证码失败上报超级鹰平台防误扣分功能
                                         8、加入了检测网络不稳定或无法访问服务器功能
"""

import smtplib,winreg, tqdm, zipfile, os, time, requests, csv,datetime
import urllib.request
from selenium.webdriver.chrome.options import Options
from urllib import error
from email.mime.text import MIMEText
from email.utils import formataddr
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from PIL import Image
from hashlib import md5
from requests import get
from re import findall
from selenium import webdriver
from urllib.request import urlretrieve as urlrt
from selenium.webdriver import ActionChains
from selenium.webdriver.support.wait import WebDriverWait
Epidemicpreventionandcontrol_url = 'http://wjwsqpctwo.chutianyun.gov.cn:16090/community/home'  # 疫情防控管理平台
URL = 'http://chromedriver.storage.googleapis.com/?delimiter=/&prefix='  # chromedriver官网
REG = r'<Prefix>(\d.*?)</Prefix>'  # 过滤网页html的表达式
FILE_NAME = 'chromedriver_win32.zip'  # 压缩包名称
FILE_EXE = 'chromedriver.exe'  # 解压后的可执行程序名称
url_down = 'http://chromedriver.storage.googleapis.com/%schromedriver_win32.zip'  # 下载链接

# ============================================= User Password reader ===================================================
try:# 用于记录未知异常日志
    cycle_Tuer = True # 用于发生异常后维持程序运行
    while cycle_Tuer:
        try: # 用于捕获可能在打开文件中发生的异常
            # 打开User_Password.csv文件数据
            with open(f'{os.getcwd()}\\User_Password.csv','r',newline='',encoding='utf-8') as file_csv:
                # 读取账户、密码、邮箱数据
                data_User_Password_Gmail = csv.reader(file_csv)
                # 历遍数据
                for row in data_User_Password_Gmail:
                    Cvs_data = row
                    # print(Cvs_data)
            # 读取账户
            User = Cvs_data[0]
            # 读取密码
            Password = Cvs_data[1]
            # 读取邮箱
            Gmail = Cvs_data[2]
            cycle_Tuer = False
            print(User)
            print(Password)
            print(Gmail)
        # 捕获User_Password.csv可能发生的异常
        except Exception as r:
            print('未知错误 %s' % (r))
            # 重试(循环)
            cycle_Tuer = True
            print("【User_Password.csv】文件被占用!请关闭")
            print("正在重试中…………")
# =============================================  detection network  ====================================================
    def Theinternet():
        """
        @说明:该函数主要用于检测机器是否能连接到外网
        :return:
        """
        try:# 检测网络是否能访问外网
            # 利用urllib库的urlopen方法打开URL来检测网络是否连通,(10秒内服务器未回应则抛出异常)
            urllib.request.urlopen(Epidemicpreventionandcontrol_url, timeout=10)
            theinternet = True
        # 该异常属于urllib.error模块,用于解决错误网络超时(捕获因网络问题或无法连接服务器而引发的异常)
        except urllib.error.URLError as error:
            print("无法访问到网络!!!请稍后重试…………")
            # 维持程序运行
            time.sleep(10)
            theinternet = False

        # 向函数外返回结果(用于判断机器是否可以连接到外网)
        return theinternet


# ============================================= Download the driver ====================================================
    def Download_driver():
        """
        @说明:该函数主要用于对sd_chrome类中的所有函数调用
        :return: False or True
        """
        Download_cycle_Tuer = True
        while Download_cycle_Tuer:
            try:  # 捕获网络可能引发的异常
                # 该代码主要修复网络不稳定或驱动官网失效而引发的异常,(10秒内服务器未回应则抛出异常)
                urllib.request.urlopen(URL, timeout=10)
                # 创建一个sd_chrome类
                class sd_chrome():
                    def __init__(self, _folder=os.getcwd()):
                        # 防止文件夹路径不存在
                        # 指定下载路径文件夹
                        if not os.path.exists(_folder):
                            os.makedirs(_folder)
                        self.down_folder = _folder

                    def getChromeVersion(self):
                        # 从注册表获取chrome版本
                        key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r'Software\Google\Chrome\BLBeacon')
                        self.chrome_version = winreg.QueryValueEx(key, 'version')[0]
                        return self.chrome_version

                    def getChromeDriverVersionList(self):
                        # 从网页源代码获取目前提供的版本号
                        resp = get(URL)
                        # 返回正则括号中结果的列表
                        self.driver_version = findall(REG, resp.text)
                        return self.driver_version

                    def compareVersion(self):
                        # 版本号的前两部分相等即为匹配
                        self.right_version = ''
                        chrome_version_list = self.chrome_version.split('.')
                        for ver in self.driver_version:
                            _tmp = ver.split('.')
                            if chrome_version_list[0] == _tmp[0] and chrome_version_list[1] == _tmp[1]:
                                self.right_version = ver
                                break
                        return self.right_version

                    def downloadChromeDriver(self):
                        # 下载,为了指定路径必须用urllib库
                        if self.right_version != '':
                            url_download = url_down % self.right_version
                            self.path_file = r'%s\%s' % (self.down_folder, FILE_NAME)
                            # (已测试会自动覆盖)
                            urlrt(url_download, self.path_file)
                            print('已下载到:%s' % self.path_file)
                            return self.path_file
                        else:
                            print('未获取到版本号,没有下载')

                if __name__ == '__main__':
                    goo = sd_chrome()
                    a = goo.getChromeVersion()
                    print("Chrome当前版本(", a, ")")
                    print("正在连接服务器检测驱动中…………")
                    goo.getChromeDriverVersionList()
                    goo.compareVersion()
                    goo.downloadChromeDriver()
                    Download_cycle_Tuer = False
            # 该异常属于urllib.error模块,用于解决错误网络超时(捕获因网络问题或无法连接服务器而引发的异常)
            except urllib.error.URLError as error:
                print("检测到网络异常无法下载驱动请检查网络…… =_=!")
                print("切勿关闭窗口否则会无法启动!正在重试网络连接中…………")
                # 防止断网后请求过快 延时10/s
                time.sleep(10)
                # 重试请求(循环)
                Download_cycle_Tuer = True
        # 向函数外返回结果(用于判断是否正常下载驱动)
        return Download_cycle_Tuer

# =================================================== unzip files ======================================================
    # tqdm()方法获取进度条数量 因为只有填1个压缩包所以参数为1
    Schedule = tqdm.tqdm(range(1))
    for i in Schedule:
        # 为解压chromedriver提供缓冲 (由于本机CPU频率只有1.1GHZ)
        time.sleep(3)
        Unzip_while = True
        while Unzip_while:
            try: # 捕获解压文件是可能发生的异常(上个版本中发现由于在官网下载驱动时,偶尔会发生网络丢包,导致下载的驱动不完整从而导致解压失败)
                # 使用ZipFile()方法解压 参数path(路径)
                with zipfile.ZipFile(f"{os.getcwd()}\chromedriver_win32.zip") as file_zip:
                    file_zip.extractall(os.getcwd())
                # 使用set_description()方法输出进度条的文本信息
                Schedule.set_description(f"正在解压驱动文件")
                Unzip_while = False
            # 捕获unzip解压时可能发生的异常
            except Exception as r:
                print('\n未知错误 %s' % (r))
                print("\n【chromedriver_win32.zip】解压失败!")
                print("\n正在重试中…………")
                # 重试(循环)
                Unzip_while = True
                # 调用下载驱动函数重新下载chromedriver驱动压缩包
                wait_Download_driver = True
                # 维持程序运行(重试)
                wait_i = 0
                while wait_Download_driver:
                    # (函数返回值为True或False)
                    wait_True = Download_driver()
                    # print(wait_True)
                    # 为下载驱动留缓冲
                    time.sleep(15+wait_i)
                    # 判断是否Download_driver()函数是否执行完毕(判断函数的返回值)
                    if wait_True != False:
                        # 重试
                        wait_Download_driver = True
                        # 缓冲时间乘以2(目的是为了延迟下载时间)
                        wait_i = wait_i*2
                    elif wait_True == False:
                        # 结束
                        wait_Download_driver = False
                        print("驱动重新下载完成")

# ===================================================== chaojiying ======================================================
    # 该代码由第三方平台超级鹰提供的Demo打码服务
    class Chaojiying_Client(object):
        def __init__(self, username, password, soft_id):
            self.username = username
            password = password.encode('utf8')
            self.password = md5(password).hexdigest()
            self.soft_id = soft_id
            self.base_params = {
                'user': self.username,
                'pass2': self.password,
                'softid': self.soft_id,
            }
            self.headers = {
                'Connection': 'Keep-Alive',
                'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
            }

        def PostPic(self, im, codetype):
            """
            im: 图片字节
            codetype: 题目类型 参考 http://www.chaojiying.com/price.html
            """
            params = {
                'codetype': codetype,
            }
            params.update(self.base_params)
            files = {'userfile': ('screenshot.png', im)}
            r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files,
                              headers=self.headers)
            return r.json()

        def ReportError(self, im_id):
            """
            im_id:报错题目的图片ID
            """
            params = {
                'id': im_id,
            }
            params.update(self.base_params)
            r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
            return r.json()



# ================================================= selenium_chromedriver ===============================================
    # 声明一个变量用于控制while循环
    True_mistake = True
    # 计数器
    prevent_i = 0
    while True_mistake:
        # 创建一个main(程序的入口)
        if __name__ == '__main__':
            # 检测机器能否访问外网
            if Theinternet():
                # 实例Options类(启用谷歌浏览器的无头模式)注意:在调用save_screenshot()方法截图时,无头模式下截图没有非无头模式完整
                opts = Options()
                # 设置无头模式,相当于执行了opt.add_argument('--headless')和opt.add_argument('--disable-gpu')(--disable-gpu禁用gpu加速仅windows系统下执行)。
                opts.headless = True
                # 实例Chrome浏览器 os.getcwd()方法可以获取当前目录的完整路径 如果没有将chromedriver加入环境变量,第一个参数需传入其绝对路径
                browser = webdriver.Chrome(executable_path=os.getcwd() + "\chromedriver.exe",options=opts)
                # browser = webdriver.Chrome(executable_path=os.getcwd() + "\chromedriver.exe")
                # 隐式等待 15/s
                browser.implicitly_wait(15)
                # 发送GET请求打开疫情防控平台
                browser.get(Epidemicpreventionandcontrol_url)

                # 用js获取页面的宽高
                width = browser.execute_script("return document.documentElement.scrollWidth")
                height = browser.execute_script("return document.documentElement.scrollHeight")
                # 同时设置浏览的位置和窗口大小 set_window_rect()方法 参数(浏览器窗口位置坐标xy,浏览器窗口大小分辨率)
                browser.set_window_rect(0, 0, width, height)
                # 调用浏览器截图,并将截图命名为screenshot
                browser.save_screenshot(r'screenshot.png')
                # 指定验证码区域 节点名“captcha”(通过网页节点id定位)
                img = browser.find_element_by_xpath('//*[@id="captcha"]')
                # 截图像素逻辑(左上右下坐标)参数:left, up, right, below
                # print(img.location) #{'x': 580, 'y': 220}“左,上”
                # print(img.size)     #{'height': 200, 'width': 280}580+200 = “右” 220+200 = “下”
                # 获取x坐标“左”
                left = img.location['x']
                # 获取y坐标“上”
                top = img.location['y']
                # 获取width(调用size 参数数据类型为列表)
                left_width = img.size['width']
                # 获取height
                tup_height = img.size['height']

                # 计算坐标点“右”(左上右下坐标)
                right = left + left_width
                # 计算坐标点“下”(左上右下坐标)
                bottom = top + tup_height

                # 打开浏览器的截图(浏览器全屏截图)
                im = Image.open(r'screenshot.png')
                # 对截图进行裁剪(裁剪出滑块验证码)im.crop()方法包含的参数left, up, right, below(左上右下坐标)
                im = im.crop((left, top, right, bottom))
                # 保存裁剪好的截图(用于提交第三方打码平台)
                im.save(r'screenshot.png')

                # Chaojiying_Client('账户', '密码', '软件ID') 该代码由第三方平台超级鹰Demo,用户中心>>软件ID 生成一个替换 96001
                chaojiying = Chaojiying_Client('muke123', 'WWW.hao123.com', '929581')
                # 打开截图读取,注意:有时WIN系统须要//
                im = open(r'screenshot.png', 'rb').read()
                # 9102 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()
                code = chaojiying.PostPic(im, 9101)
                # 将超级鹰返回的字典切片(包含滑块缺口坐标信息)
                pic_str = str(code["pic_str"])
                # 获取X坐标 使用“,”对其分割、切片
                x_dicti = str(pic_str.split(",")[0])
                print("已获取X坐标:",x_dicti)
                # 获取验证码的ID(用于提交报错)
                pic_id = str(code["pic_id"])
                Tup_ID = pic_id.split(",")[0]
                # print("图片ID号:",Tup_ID)

                # 使用XPath定位标签 输入user
                browser.find_element_by_xpath('/html/body/div[1]/div[3]/form/div[2]/label/input').send_keys(User)
                # 使用XPath定位标签 输入password
                browser.find_element_by_xpath('/html/body/div[1]/div[3]/form/div[3]/label/input').send_keys(Password)
                # 使用XPath定位标签 滑块
                menu = browser.find_element_by_xpath("/html/body/div[1]/div[3]/form/div[4]/div[1]/div[2]/div/div/span")
                hidden_submenu = browser.find_element_by_xpath("/html/body/div[1]/div[3]/form/div[4]/div[1]/div[2]")

                # 移动滑块验证码 X轴
                try:  # 忽略异常 由于超级鹰9101题分识别率不是很高难免出现坐标不准过大现象从而引发以下异常
                    """引发异常类(消息、屏幕、堆栈跟踪)
        selenium.common.exceptions.MoveTargetOutOfBoundsException:消息:将目标移出边界
           (会话信息:chrome=99.0.4844.74)"""
                    div = browser.find_element_by_class_name('slider')                                  # 点击位置div标签
                    action = ActionChains(browser)                                                      # 实例化ActionChains
                    action.click_and_hold(div)                                                          # 点击'slider'标签
                    action.move_by_offset(x_dicti, 0).perform()                                         # 使用滑动move_by_offset方法、x轴传入坐标
                    action.release().perform()                                                          # 释放动作链

                # 忽略异常 并执行下一句
                except Exception:
                    print("第三方打码平台返回的识别数据不准确!")
                    pass
                try:# 捕获异常、延时网页在10秒钟在规定的时间内未找到网页节点id为“loginButton”则抛处异常,使用XPath定位标签 点击“登录”控件
                    browser.find_element_by_xpath('//*[@id="loginButton"]').click()
                    # 显示等待 参数为browser对象
                    wait = WebDriverWait(browser, 10)
                    # 定位id为“q"的标签 10/s秒内请求超时则抛出异常 使用selenium的expected_conditions的presence_of_element_located()方法
                    input = wait.until(EC.presence_of_element_located((By.ID, 'zxrs')))
                    print("登录成功!")
                except:# 捕获网页节点引发的异常(通过查找节点来判断是否已登录成功)
                    # 上报错误(实例化超级鹰传入异常函数提交验证码id)
                    chaojiying.ReportError(im_id=Tup_ID)
                    print("验证码识别错误 请不要关闭程序…… =_=!")

                    if pic_str == '':
                        # 邮件内容(参数)
                        contentofemail_0 = '题分不足请联系开发者充值: https://www.chaojiying.com/'
                        # 邮件标题(参数)
                        successorfailure_0 = "失败"
                        print("已欠费!等待续费中…………")
                        # 退出谷歌浏览器(减少对硬件资源的占用)
                        browser.quit()
                        # 等待3小时
                        time.sleep(10800)
                    # 关闭浏览器节省硬件资源
                    browser.quit()

                else:# 程序正常则执行(如果登录成功则会跳过这一步)
                    # print(f"超级鹰反馈原始坐标变量:{pic_str}", format(pic_str))
                    # print(f"运算后实际坐标:{x_dicti}", format(x_dicti))
                    # 登录系统时间
                    now = datetime.datetime.now()
                    # 格式24小时制
                    time_date = now.strftime('%H:%M')
                    # 邮件内容(参数)
                    contentofemail_0 = f'登陆时间:{time_date}'
                    # 邮件标题(参数)
                    successorfailure_0 = "成功"

# ===================================================== Gmsil Log  =====================================================
                my_sender = '22xx4xxxx20@qq.com'
                # 发件人邮箱密码(QQ邮箱的SMTP中生成的授权码)
                my_pass = 'zxxxiwxxxxexxxjtxxxxde'
                # 收件人邮箱账号
                my_user = Gmail
                FromRunoob = 'FromRunoob'
                FK = 'Muke123~'

                def mail():
                    ret = True
                    try:
                        # 填写邮件内容
                        msg = MIMEText(contentofemail_0, 'plain', 'utf-8')
                        # 括号里的对应发件人邮箱昵称、发件人邮箱账号
                        msg['From'] = formataddr([FromRunoob, my_sender])
                        # 括号里的对应收件人邮箱昵称、收件人邮箱账号
                        msg['To'] = formataddr([FK, my_user])
                        # 邮件的主题,也可以说是标题
                        msg['Subject'] = f"疫情防控排查系统登录{successorfailure_0}!"
                        # 发件人邮箱中的SMTP服务器,端口是25
                        server = smtplib.SMTP_SSL("smtp.qq.com", 465)
                        # 括号中对应的是发件人邮箱账号、邮箱密码
                        server.login(my_sender, my_pass)
                        # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
                        server.sendmail(my_sender, [my_user, ], msg.as_string())
                        # 关闭连接
                        server.close()
                    # 如果 try 中的语句没有执行,则会执行下面的 ret=False
                    except Exception:
                        ret = False
                    return ret


                ret = mail()
                if ret:
                    print("邮件已发送")
                    try:# 维持程序运行(关闭谷歌时会抛出异常)
                        # 退出谷歌浏览器(防止在后台进程占用硬件资源,经测试还会导致程序下次无法解压驱动文件)
                        browser.quit()
                        # 结束对while循环(防止产生大量的打码费用)
                        True_mistake = False
                    finally:# 捕获因quit()函数引发的异常(关闭浏览器时偶尔会发生异常)
                        time.sleep(3)

                else:
                    print("邮件未发送")
                    time.sleep(5)
                    prevent_i += 1
                    if prevent_i >= 3:
                        # 结束对while循环(防止产生大量的打码费用)
                        True_mistake = False
                        try:# 维持程序运行(关闭谷歌时会抛出异常)
                            # 退出谷歌浏览器(防止在后台进程占用硬件资源,经测试还会导致程序下次无法解压驱动文件)
                            browser.quit()
                        finally:# 捕获因quit()函数引发的异常(关闭浏览器时偶尔会发生异常)
                            time.sleep(3)

            # 判断网络
            else:
                print("重新连接网络中…………")
# ===================================================  except and log   ================================================
except Exception as r:# 捕获异常
    # 定义日志文件名
    log_file = 'log.csv'
    # 赋值给now(用于记录未知异常发生的时间)
    now = datetime.datetime.now()
    Data_time = now.strftime('%Y-%m-%d %H:%M:%S')
    # 异常信息
    Dxcept = str('未知错误 %s' % (r))
    Dxcept_Google = "未知错误 Message: unknown error: cannot find Chrome binary"
    if Dxcept == Dxcept_Google:
        print("检测到该机器没有安装谷歌浏览器请安装后重试!")
        print("谷歌浏览器下载链接:https://www.google.cn/chrome/")
        time.sleep(60)

    with open(log_file,'a+',newline='',encoding='utf-8') as csv_log:
        # log.csv文件的首行标题(时间、程序异常)
        fieldnames = ['Data_time','Dxcept']
        # DictWriter()方法初始化,已字典类型写入对象(该fieldnames参数用于字典)
        weiter = csv.DictWriter(csv_log,fieldnames=fieldnames)
        # 写入文件的首行标题
        weiter.writeheader()
        # 写入日志数据(时间、异常的内容)
        weiter.writerow({'Data_time':Data_time,'Dxcept':Dxcept})
        print('未知错误 %s' % (r))
        print('抱歉,程序崩溃…… =_=!')
        browser.quit()
        time.sleep(20)

以下为(启动主脚本)的代码

-@_@: 代码写的比较烂希望大佬指出不足!!!

# -*- encoding: utf-8 -*-
"""
@File    :   启动器.py    
@Contact :   t.ianxi@foxmail.com
@License :   // Copyright (C) 2018 Milo Yip<dell>

@Modify Time      @Author    @Version    @Desciption
------------      -------    --------    -----------
2022/3/14 15:53     MuKe~       1.0          None
2022/3/22 20:59     MuKe~       4.0          第二次优化新增字符画
"""
import datetime
import os
import re
import time
import win32api
import win32con
import subprocess                                        # 使用subprocess库可以使shell或者cmd不会弹出命令行窗口(重要)
import Muke_cat
"""
    @功能:主要实现定时启动疫情防控脚本
"""


Muke_cat.cat()
name = 'yiqinfangkong'                                   # 要添加的项值名称
path = os.getcwd()+"启动器.exe"                           # 要添加的exe路径
KeyName = 'Software\Microsoft\Windows\CurrentVersion\QiD'# 注册表项名
path_exe = os.getcwd()+'\疫情防控脚本.exe'                  # 疫情防控脚本路径
# 异常处理
try:
    key = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER, KeyName, 0, win32con.KEY_ALL_ACCESS)
    win32api.RegSetValueEx(key, name, 0, win32con.REG_SZ, path)
    win32api.RegCloseKey(key)
except:
    print('已添加开机启动项!')

True_False = True
while True_False:
    now = datetime.datetime.now()
    time_date = now.strftime('%H:%M')
    print("*"*50)
    print(f"设置启动时间例如:{time_date}“(24小时格式)输入==(Q)修改已添加的启动时间")
    input_time = input("输入时间:").strip()
    print("*"*50)
    if 'q' and 'Q' == input_time:
        """
            @说明:1、这里使用了DOS命令的schtasks命令(win10已经取消at命令)/TN任务明 /TR要执行的脚本路径 /ST 时间(24小时制)
                  2、/delete删除 /tn要删除的任务名称
        """
        # SCHTASKS /Create /SC DAILY /TN MUKE启动器 /TR D:\KuGou\SunloginClient\SunloginClient.exe /ST 12:00
        # schtasks /delete /tn MUKE启动器
        subprocess.call('schtasks /delete /tn MUKE启动器',shell=True)
        print("以取消启动项")
        continue
    else:
        RE_gs = r'[0-9]{2}:[0-9]{2}'
        match_str = re.match(RE_gs,input_time)
        if match_str==None:
            print("格式错误!请重新输入")
            time.sleep(3)
            True_False = True
        else:
            subprocess.call(f'SCHTASKS /Create /SC DAILY /TN MUKE启动器 /TR {path_exe} /ST {input_time}',shell=True)
            print("成功")
            time.sleep(3)
            True_False = False

以下为(自定义的Logo模块)代码

# -*- encoding: utf-8 -*-
"""
@File    :   Muke_cat.py    
@Contact :   t.ianxi@foxmail.com
@License :   // Copyright (C) 2018 Milo Yip<dell>

@Modify Time      @Author    @Version    @Desciption
------------      -------    --------    -----------
2022/3/27 23:35     MuKe~       1.0          None
"""
import time

def cat():
    print("# ================================ 《 欢迎使用!》 ================================== #")
    print("# ================================================================================ #")
    time.sleep(0.6)
    print("#         _ _                                                                 ")
    time.sleep(0.6)
    print("#      / >  フ                                                               ")
    time.sleep(0.6)
    print("#     |   _  _ l                                __    __                      ")
    time.sleep(0.6)
    print("#     /` ミ_ x ノ         /———\      /———\       |  | /  /     |  |         |  |")
    time.sleep(0.6)
    print("#     /      |          / /—\ \    / /—\ \      |  |/  /      |  |        |  |  ")
    time.sleep(0.3)
    print("#    /  ヽ   ノ          / /   \ \  / /   \ \     |  |\  \      |  |        |  |   ")
    time.sleep(0.3)
    print("#    │  | | |         / /     \ \/ /     \ \     |  | \  \     \  |-------|  /  ")
    time.sleep(0.3)
    print("# / ̄|   | | |       /_/       \__/       \_\    |__|  \__\      \__________/    ")
    time.sleep(0.3)
    print("# | ( ̄ヽ__ヽ_)__)")
    time.sleep(0.3)
    print("# \二つ  ")
    print("# ================================================================================ #")
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容