utils 源代码

import asyncio
import hashlib
import socket
from functools import wraps

import gmalg
import ifaddr


[文档] def get_sign(dynamicSecret, params): """ 获取sign值 :param str dynamicSecret: login后自动获取,来自 login-token 请求 :param str params: URL请求参数 :return: sign值 :rtype: str """ paramsDict = {} for param in params.split("&"): if param.split("=")[0] == "timestamp": timestamp = param.split("=")[1] elif param.split("=")[0] == "random": random = param.split("=")[1] else: paramsDict[param.split("=")[0]] = param.split("=")[1] paramsDict = dict(sorted(paramsDict.items())) original = f"{dynamicSecret}|" for key in paramsDict: original += f"{paramsDict[key]}|" original += f"{timestamp}|{random}" sign = hashlib.md5(original.encode("utf-8")).hexdigest().upper() return sign
def _kget(kwargs, key, default=None): return kwargs[key] if key in kwargs else default
[文档] def get_ip_by_interface(interface): """ 获取指定网卡的IP地址 :param interface: 网卡名称 :return: 给定王卡的 IP 地址 """ adapters = ifaddr.get_adapters() for adapter in adapters: if adapter.name == interface: for ip in adapter.ips: # 只返回IPv4地址 if isinstance(ip.ip, str): return ip.ip return None
[文档] def pkcs7_unpad(padded_data: bytes, block_size: int) -> bytes: """ 去除数据中的PKCS#7填充。 :param bytes padded_data: 带填充的数据 :param int block_size: 用于填充的块大小 :return: 去除填充后的数据 :rtype: bytes :raises ValueError: 如果填充无效 """ if not padded_data or len(padded_data) % block_size != 0: raise ValueError("无效的填充数据长度") # 从最后一个字节获取填充长度 padding_len = padded_data[-1] # 检查填充长度是否有效 if padding_len > block_size or padding_len == 0: raise ValueError("无效的填充长度") # 检查所有填充字节是否正确 for i in range(1, padding_len + 1): if padded_data[-i] != padding_len: raise ValueError("无效的填充") # 返回去除填充后的数据 return padded_data[:-padding_len]
[文档] def sm4_decrypt_ecb(ciphertext: bytes, key: bytes): """ SM4 解密,ECB模式 :param bytes ciphertext: 密文 :param bytes key: 密钥 :return: 明文 Hex :rtype: str """ sm4 = gmalg.SM4(key) block_size = 16 decrypted_padded = b"" for i in range(0, len(ciphertext), block_size): block = ciphertext[i : i + block_size] decrypted_padded += sm4.decrypt(block) decrypted = pkcs7_unpad(decrypted_padded, block_size) return decrypted.decode()
[文档] def check_permission(self): """ 检查用户是否登录 :param self: """ if self.is_logged_in: pass else: raise PermissionError("需要登录")
[文档] def sync_wrapper(async_func): """ 将异步方法包装为同步方法的装饰器 """ @wraps(async_func) def wrapper(*args, **kwargs): try: # 尝试获取当前事件循环 loop = asyncio.get_event_loop() new_loop = False except RuntimeError: # 如果没有事件循环,创建一个新的 loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) new_loop = True try: return loop.run_until_complete(async_func(*args, **kwargs)) finally: # 只有当我们创建了新的事件循环时才关闭它 if new_loop: loop.close() return wrapper
[文档] def get_local_ip(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: s.connect(("119.29.29.29", 80)) local_ip = s.getsockname()[0] return local_ip except Exception: return "127.0.0.1" finally: s.close()
[文档] def get_interface_by_ip(target_ip): adapters = ifaddr.get_adapters() for adapter in adapters: for ip in adapter.ips: if ip.is_IPv4: if ip.ip == target_ip: return adapter.name else: if isinstance(ip.ip, str): ip_addr = ip.ip.split("%")[0] if "%" in ip.ip else ip.ip if ip_addr == target_ip: return adapter.name elif isinstance(ip.ip, tuple): ip_addr = ip.ip[0] if len(ip.ip) > 0 else None if ip_addr == target_ip: return adapter.name return None
# 以下代码来自 https://github.com/zidou-kiyn/share_zzu_wlan # 窝就是 Ctrl + CV 领域大神,哈哈
[文档] def get_key(ip: str = "") -> int: """计算输入字符串的异或密钥""" ret = 0 for char in ip: ret ^= ord(char) return ret
[文档] def enc_pwd(pass_in: str, key: int) -> str: """加密函数:将密码与密钥进行异或运算,并转为十六进制字符串""" if len(pass_in) > 512: return "-1" pass_out = "" for char in pass_in: ch = ord(char) ^ key hex_str = format(ch, "02x") pass_out += hex_str return pass_out
[文档] def dec_pwd(hex_string: str, key: int) -> str: """解密函数:将十六进制字符串解密回原始密码""" if len(hex_string) % 2 != 0: return "错误:十六进制字符串长度必须为偶数" original_password = "" for i in range(0, len(hex_string), 2): hex_pair = hex_string[i : i + 2] decimal_value = int(hex_pair, 16) original_char = chr(decimal_value ^ key) original_password += original_char return original_password