本文目录导读:

我来为你创建一个定时将文本转换为二维码的Python脚本,支持定时任务和手动转换功能。
完整解决方案
import qrcode
import os
from datetime import datetime
import schedule
import time
from PIL import Image
import json
from typing import List, Dict, Optional
import hashlib
from pathlib import Path
class QRCodeScheduler:
"""定时文本转二维码工具类"""
def __init__(self, output_dir: str = "qr_codes"):
"""
初始化二维码生成器
Args:
output_dir: 输出目录路径
"""
self.output_dir = output_dir
# 创建输出目录
Path(output_dir).mkdir(parents=True, exist_ok=True)
# 存储定时任务
self.tasks = []
# 支持中文的配置文件编码
self.config_file = "qr_config.json"
# 加载配置
self.load_config()
def text_to_qrcode(self, text: str, filename: Optional[str] = None,
size: int = 10, border: int = 4) -> str:
"""
将文本转换为二维码图像
Args:
text: 要转换的文本内容
filename: 输出文件名(不含后缀)
size: 二维码大小(1-40)
border: 边框宽度
Returns:
生成的文件路径
"""
try:
# 创建二维码对象
qr = qrcode.QRCode(
version=size,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=border,
)
# 添加数据
qr.add_data(text)
qr.make(fit=True)
# 创建图像
qr_img = qr.make_image(fill_color="black", back_color="white")
# 生成文件名
if not filename:
# 使用时间戳生成唯一文件名
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
# 计算文本哈希作为部分文件名
text_hash = hashlib.md5(text.encode()).hexdigest()[:8]
filename = f"qr_{timestamp}_{text_hash}"
# 添加时间戳确保文件不重复
filename = f"{filename}_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
# 保存图像
filepath = os.path.join(self.output_dir, f"{filename}.png")
qr_img.save(filepath)
print(f"[✓] QR码已生成: {filepath}")
return filepath
except Exception as e:
print(f"[✗] 生成QR码失败: {e}")
return ""
def batch_text_to_qrcodes(self, text_list: List[str]) -> List[str]:
"""
批量转换多个文本为二维码
Args:
text_list: 文本列表
Returns:
生成的文件路径列表
"""
results = []
for i, text in enumerate(text_list):
print(f"正在处理第 {i+1}/{len(text_list)} 项...")
path = self.text_to_qrcode(text, filename=f"batch_{i+1}")
if path:
results.append(path)
return results
def schedule_daily_task(self, hour: int, minute: int, text: str,
task_name: str = "daily_task"):
"""
安排每日定时任务
Args:
hour: 小时(0-23)
minute: 分钟(0-59)
text: 要转换的文本
task_name: 任务名称
"""
job = schedule.every().day.at(f"{hour:02d}:{minute:02d}").do(
self.text_to_qrcode,
text=text,
filename=task_name
)
task_info = {
"name": task_name,
"type": "daily",
"time": f"{hour:02d}:{minute:02d}",
"text": text,
"job": job
}
self.tasks.append(task_info)
print(f"[✓] 每日任务 '{task_name}' 已安排: 每天 {hour:02d}:{minute:02d}")
print(f" 转换文本: {text[:50]}...")
# 保存配置
self.save_config()
def schedule_interval_task(self, seconds: int, text: str,
task_name: str = "interval_task"):
"""
安排间隔任务
Args:
seconds: 间隔秒数
text: 要转换的文本
task_name: 任务名称
"""
job = schedule.every(seconds).seconds.do(
self.text_to_qrcode,
text=text,
filename=task_name
)
task_info = {
"name": task_name,
"type": "interval",
"seconds": seconds,
"text": text,
"job": job
}
self.tasks.append(task_info)
print(f"[✓] 间隔任务 '{task_name}' 已安排: 每 {seconds} 秒")
# 保存配置
self.save_config()
def run_scheduler(self):
"""运行定时调度器"""
print("\n=== 定时任务调度器启动 ===")
print(f"当前时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print(f"输出目录: {self.output_dir}")
print("-" * 50)
if not self.tasks:
print("没有配置任何任务")
return
print(f"已配置 {len(self.tasks)} 个任务:")
for i, task in enumerate(self.tasks):
if task["type"] == "daily":
print(f" {i+1}. [{task['name']}] 每日 {task['time']}")
else:
print(f" {i+1}. [{task['name']}] 每 {task['seconds']} 秒")
print("\n按 Ctrl+C 停止调度器...")
print("-" * 50)
try:
while True:
schedule.run_pending()
time.sleep(1)
except KeyboardInterrupt:
print("\n\n[!] 调度器已停止")
def save_config(self):
"""保存任务配置到文件"""
try:
config = {
"output_dir": self.output_dir,
"tasks": [
{
k: v for k, v in task.items()
if k != "job" # 排除job对象
}
for task in self.tasks
]
}
with open(self.config_file, 'w', encoding='utf-8') as f:
json.dump(config, f, ensure_ascii=False, indent=2)
print(f"[✓] 配置已保存到 {self.config_file}")
except Exception as e:
print(f"[!] 保存配置失败: {e}")
def load_config(self):
"""从配置文件加载任务"""
if not os.path.exists(self.config_file):
return
try:
with open(self.config_file, 'r', encoding='utf-8') as f:
config = json.load(f)
# 恢复输出目录
if "output_dir" in config:
self.output_dir = config["output_dir"]
Path(self.output_dir).mkdir(parents=True, exist_ok=True)
# 恢复任务配置
if "tasks" in config:
print(f"[✓] 从配置加载 {len(config['tasks'])} 个任务:")
for task in config["tasks"]:
if task["type"] == "daily":
time_str = task["time"].split(":")
self.schedule_daily_task(
hour=int(time_str[0]),
minute=int(time_str[1]),
text=task["text"],
task_name=task["name"]
)
else:
self.schedule_interval_task(
seconds=task["seconds"],
text=task["text"],
task_name=task["name"]
)
except Exception as e:
print(f"[!] 加载配置失败: {e}")
def list_tasks(self):
"""显示当前任务列表"""
print("\n=== 当前任务列表 ===")
if not self.tasks:
print("没有配置任何任务")
return
for i, task in enumerate(self.tasks):
if task["type"] == "daily":
print(f" {i+1}. [{task['name']}] 每日 {task['time']}")
else:
print(f" {i+1}. [{task['name']}] 每 {task['seconds']} 秒")
print(f" 文本: {task['text'][:50]}...")
def clear_all_tasks(self):
"""清除所有任务"""
schedule.clear()
self.tasks = []
print("[✓] 所有任务已清除")
self.save_config()
def main():
"""主函数 - 交互式命令行界面"""
print("=== 定时文本转二维码工具 ===")
print("=" * 50)
# 创建调度器实例
scheduler = QRCodeScheduler()
while True:
print("\n请选择操作:")
print(" 1. 立即转换文本为二维码")
print(" 2. 批量转换多个文本")
print(" 3. 配置每日定时任务")
print(" 4. 配置间隔定时任务")
print(" 5. 启动定时调度器")
print(" 6. 查看任务列表")
print(" 7. 清除所有任务")
print(" 8. 退出程序")
choice = input("\n请输入选项 (1-8): ").strip()
if choice == "1":
text = input("请输入要转换的文本: ")
if text:
scheduler.text_to_qrcode(text)
else:
print("[!] 文本不能为空")
elif choice == "2":
print("请输入多个文本(每行一个,输入空行结束):")
texts = []
while True:
line = input()
if not line:
break
texts.append(line)
if texts:
scheduler.batch_text_to_qrcodes(texts)
else:
print("[!] 未输入任何文本")
elif choice == "3":
try:
hour = int(input("请输入小时 (0-23): "))
minute = int(input("请输入分钟 (0-59): "))
text = input("请输入要转换的文本: ")
task_name = input("请输入任务名称 (默认: daily_task): ").strip()
if not task_name:
task_name = "daily_task"
if 0 <= hour <= 23 and 0 <= minute <= 59 and text:
scheduler.schedule_daily_task(hour, minute, text, task_name)
else:
print("[!] 输入无效")
except ValueError:
print("[!] 请输入有效的数字")
elif choice == "4":
try:
seconds = int(input("请输入间隔秒数: "))
text = input("请输入要转换的文本: ")
task_name = input("请输入任务名称 (默认: interval_task): ").strip()
if not task_name:
task_name = "interval_task"
if seconds > 0 and text:
scheduler.schedule_interval_task(seconds, text, task_name)
else:
print("[!] 输入无效")
except ValueError:
print("[!] 请输入有效的数字")
elif choice == "5":
scheduler.run_scheduler()
elif choice == "6":
scheduler.list_tasks()
elif choice == "7":
confirm = input("确定要清除所有任务吗? (y/n): ").lower()
if confirm == 'y':
scheduler.clear_all_tasks()
elif choice == "8":
print("\n[✓] 程序已退出")
break
else:
print("[!] 无效选项,请重新选择")
# 示例:直接运行特定场景
def run_example():
"""示例:展示几种典型使用场景"""
scheduler = QRCodeScheduler()
# 示例1: 立即转换
print("\n示例1: 立即转换")
scheduler.text_to_qrcode("https://example.com", "example")
# 示例2: 每日定时任务
print("\n示例2: 每日9:00生成")
scheduler.schedule_daily_task(9, 0, "每日报告内容", "daily_report")
# 示例3: 间隔任务(每5分钟)
print("\n示例3: 每5分钟生成一次")
scheduler.schedule_interval_task(300, "间隔更新的数据", "interval_data")
# 开始调度
scheduler.run_scheduler()
return scheduler
if __name__ == "__main__":
main()
安装依赖
# 安装所需的库 pip install qrcode[pil] pip install schedule pip install Pillow
使用说明
基本使用
运行脚本后,选择选项1,输入文本即可立即生成二维码。
定时任务配置
- 每日任务:设置每天固定时间生成二维码
- 间隔任务:每隔指定秒数自动生成
批量处理
支持一次输入多行文本,批量生成二维码。
高级功能
自定义样式版本
# 添加自定义颜色和样式的二维码生成
def create_custom_qrcode(self, text, filename,
fill_color="black", back_color="white",
box_size=10, border=4):
"""自定义彩色二维码"""
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=box_size,
border=border,
)
qr.add_data(text)
qr.make(fit=True)
img = qr.make_image(fill_color=fill_color, back_color=back_color)
filepath = os.path.join(self.output_dir, f"{filename}_{fill_color}.png")
img.save(filepath)
return filepath
常见问题
中文乱码问题
# 确保在读取和写入时使用UTF-8编码
with open(file_path, 'r', encoding='utf-8') as f:
text = f.read()
# 添加BOM解决Windows兼容性问题
with open(file_path, 'w', encoding='utf-8-sig') as f:
f.write(text)
# 处理长度超过二维码容量的文本
def split_text_for_qr(self, text, max_length=200):
"""将长文本分段生成多个二维码"""
if len(text) <= max_length:
return [text]
chunks = [text[i:i+max_length] for i in range(0, len(text), max_length)]
print(f"长文本被分割为 {len(chunks)} 段")
return chunks
定时任务持久化
任务配置会自动保存到 qr_config.json,重启后可恢复。
这个脚本提供了完整的文本转二维码功能:
- ✅ 即时转换功能
- ✅ 每日定时任务
- ✅ 间隔定时任务
- ✅ 批量处理
- ✅ 配置持久化
- ✅ 自定义样式支持
可以根据实际需求调整使用方式,比如集成到其他系统中作为自动化工具。