下载地址:https://www.pan38.com/dow/share.php?code=JCnzE 提取密码:8192
这个工具包含四个主要模块:核心转换模块、工具类模块、主程序入口和测试模块。核心模块使用qrcode库生成二维码,工具类提供日志和系统信息功能,主程序处理命令行参数,测试模块确保代码质量。使用时可以通过命令行参数指定wxid和输出路径。
import qrcode
import hashlib
import base64
from PIL import Image
import io
import os
class WXIDConverter:
def init(self):
self.qr_version = 1
self.qr_box_size = 10
self.qr_border = 4
self.qr_fill_color = "black"
self.qr_back_color = "white"
def validate_wxid(self, wxid):
"""验证wxid格式"""
if not wxid.startswith('wxid_'):
return False
if len(wxid) < 6 or len(wxid) > 32:
return False
return True
def generate_qr_data(self, wxid):
"""生成二维码数据"""
if not self.validate_wxid(wxid):
raise ValueError("Invalid WXID format")
# 生成加密数据防止被扫描
salt = os.urandom(16)
hashed = hashlib.sha256((wxid + salt.hex()).encode()).digest()
encoded = base64.b64encode(hashed).decode('utf-8')
return f"weixin://dl/add?wxid={wxid}&v={encoded[:8]}"
def create_qr_code(self, wxid, save_path=None):
"""创建二维码图片"""
qr_data = self.generate_qr_data(wxid)
qr = qrcode.QRCode(
version=self.qr_version,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=self.qr_box_size,
border=self.qr_border,
)
qr.add_data(qr_data)
qr.make(fit=True)
img = qr.make_image(fill_color=self.qr_fill_color, back_color=self.qr_back_color)
if save_path:
img.save(save_path)
return save_path
# 返回字节流
img_byte_arr = io.BytesIO()
img.save(img_byte_arr, format='PNG')
return img_byte_arr.getvalue()
time
from datetime import datetime
import logging
import json
import platform
class Logger:
def init(self, name='wxid_qr_tool'):
self.logger = logging.getLogger(name)
self.logger.setLevel(logging.DEBUG)
# 创建文件处理器
file_handler = logging.FileHandler('wxid_qr.log')
file_handler.setLevel(logging.INFO)
# 创建控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# 创建格式化器
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
# 添加处理器
self.logger.addHandler(file_handler)
self.logger.addHandler(console_handler)
def get_logger(self):
return self.logger
class SystemInfo:
@staticmethod
def get_system_info():
return {
'system': platform.system(),
'release': platform.release(),
'machine': platform.machine(),
'processor': platform.processor(),
'python_version': platform.python_version(),
'timestamp': datetime.now().isoformat()
}
wxid_to_qr import WXIDConverter
from utils import Logger, SystemInfo
import argparse
import sys
def main():
# 初始化日志和系统信息
logger = Logger().get_logger()
sys_info = SystemInfo.get_system_info()
logger.info(f"System Info: {json.dumps(sys_info, indent=2)}")
# 解析命令行参数
parser = argparse.ArgumentParser(
description='微信WXID转二维码工具',
epilog='示例: python main.py --wxid wxid_123456789 --output qr.png'
)
parser.add_argument('--wxid', required=True, help='微信WXID')
parser.add_argument('--output', help='二维码输出路径')
parser.add_argument('--version', action='version', version='1.0.0')
args = parser.parse_args()
try:
converter = WXIDConverter()
logger.info(f"开始处理WXID: {args.wxid}")
start_time = time.time()
if args.output:
result = converter.create_qr_code(args.wxid, args.output)
logger.info(f"二维码已保存到: {args.output}")
else:
result = converter.create_qr_code(args.wxid)
logger.info("二维码生成成功(内存字节流)")
elapsed = time.time() - start_time
logger.info(f"处理完成,耗时: {elapsed:.2f}秒")
return 0
except Exception as e:
logger.error(f"处理失败: {str(e)}")
return 1
if name == 'main':
sys.exit(main())