通用函数
引言
通用函数我们都统一放到common.py
文件里面,在需要的页面引用,这里统一记录下,方便使用
引入
import os
import sys
sys.path.append(os.path.abspath(os.path.join(os.getcwd())))
from common import *
代码
import os
import sys
import re
from datetime import datetime,date
import time
import threading
from selenium import webdriver
from selenium.webdriver.chrome.options import Options as ChromeOptions
from selenium.webdriver.edge.options import Options as EdgeOptions
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.edge.service import Service as EdgeService
import logging
import json
import uuid
import hashlib
def dict_reversal(mydict):
"""
dict反转
{'a': 1, 'b': 2, 'c': 3, 'd': 3} 反转后 {1: 'a', 2: 'b', 3: 'd'}
"""
return dict(zip(mydict.values(), mydict.keys()))
def get_mac_address():
"""
获取机器的MAC地址
"""
mac=uuid.UUID(int = uuid.getnode()).hex[-12:]
return ":".join([mac[e:e+2] for e in range(0,11,2)])
def md5_encryption(data):
md5 = hashlib.md5() # 创建一个md5对象
md5.update(data.encode('utf-8')) # 使用utf-8编码数据
return md5.hexdigest() # 返回加密后的十六进制字符串
def verify_key(key):
"""
卡密验证
"""
return md5_encryption(get_mac_address()+"wWhvonBlEN").upper() == key
def get_resource_path(relative_path):
"""
获取资源路径
"""
if hasattr(sys, '_MEIPASS'):
return os.path.join(sys._MEIPASS, relative_path)
return os.path.join(os.path.abspath("."), relative_path)
def match_domain(url):
"""
匹配域名(不含协议)
"""
domain_pattern = r'(?:https?:\/\/)?([^\/]+)'
match = re.search(domain_pattern, url)
if match:
return match.group(1)
return None
def check_url(url):
"""
检测连通性
"""
try:
result = os.system(f"ping -n 1 {match_domain(url)} > /dev/null 2>&1")
if result == 0:
return True
else:
return False
except Exception:
return False
def get_datetime():
"""
当前时间,格式 2022-11-11 11:11:11
"""
current_time = datetime.now()
return str(current_time.replace(microsecond=0))
def get_ms():
"""
当前13位时间戳
"""
return int(time.time() * 1000)
def new_thread(func, *args):
"""
将函数打包进线程
"""
myThread = threading.Thread(target=func, args=args)
myThread.setDaemon(True) # 主线程退出就直接让子线程跟随退出,不论是否运行完成。
myThread.start()
def new_browser():
"""
初始化浏览器
浏览器类型:chrome=谷歌浏览器;msedge=Microsoft Edge浏览器
"""
browser_type = 'msedge'
# selenium 4.11.2 以上可以不用指定 chromedriver.exe ,但是不建议,因为这样打开网站会特别的慢
# selenium 4.0 以上executable_path 被重构到了 Service 函数里
if browser_type == 'chrome':
myoptions = ChromeOptions()
# 不自动关闭浏览器
myoptions.add_experimental_option('detach', True)
# 确保无界面模式
myoptions.add_argument("--headless")
myoptions.add_argument("--disable‐gpu")
myoptions.add_argument("--start-maximized") # 最大化窗口
browser_service = ChromeService(executable_path=get_resource_path('chromedriver.exe'))
browser = webdriver.Chrome(service=browser_service,options=myoptions)
else:
myoptions = EdgeOptions()
# 不自动关闭浏览器
myoptions.add_experimental_option('detach', True)
# 确保无界面模式
myoptions.add_argument("--headless")
myoptions.add_argument("--disable‐gpu")
myoptions.add_argument("--start-maximized") # 最大化窗口
browser_service = EdgeService(executable_path=get_resource_path('msedgedriver.exe'))
browser = webdriver.Edge(service=browser_service,options=myoptions)
# 最大化
browser.maximize_window()
return browser
def close_browser(browsers):
"""
关闭浏览器
"""
for browser in browsers:
browser.quit()
def log(content,level = 'info'):
"""
日志
"""
# 获取当前日期
current_date = date.today().strftime('%Y_%m_%d')
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(levelname)s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
filename=f"log_{current_date}.log",
encoding="utf-8",
filemode='a')
match level:
case 'debug':
logging.debug(content)
case 'warning':
logging.warning(content)
case 'error':
logging.error(content)
case 'critical':
logging.critical(content)
case _: # _表示匹配到其他任何情况
logging.info(content)