背景 / 痛点: 最近折腾境外手机卡,发现部分运营商非常“硬核”,开通 eSIM 后不发二维码图片,直接发来一串 LPA:1$... 开头的激活码字符串。

虽然现在的手机也支持手动输入激活码,但总是没扫码来得方便,特别是要把码给备用机扫的时候。网上虽然有在线转二维码的工具,但考虑到 eSIM 信息包含敏感的鉴权数据,把这玩意贴到不知名的网站上生成总感觉心里不踏实。

解决方案: 于是随手搓了一个 Python 脚本,完全本地运行,断网也能用,主打一个安全放心。

脚本功能特点:

智能识别输入:不管你是规规矩矩选菜单,还是手快直接把 LPA: 开头的一长串代码粘贴进去了,程序都能自动识别并处理,不用重新打开。

支持分段输入:如果你只有 SM-DP+ 地址和 Activation Code,也可以分步输入,自动拼接。

防覆盖机制:生成的图片会自动命名为 esim_qr.png,如果文件已存在,会自动顺延生成 esim_qr_1.png、esim_qr_2.png,不用担心之前的码被覆盖。

依赖简单:基于 qrcode 库。

环境要求:

安装 Python

安装依赖库:pip install qrcode[pil]

代码分享: 直接保存为 gen_esim.py 即可运行。

Python

import qrcodeimport sysimport osdef get_unique_filename(base_name="esim_qr", ext=".png"):    """    生成唯一的文件名,防止覆盖已有图片。    如果 esim_qr.png 存在,则尝试 esim_qr_1.png,以此类推。    """    filename = f"{base_name}{ext}"    if not os.path.exists(filename):        return filename        counter = 1    while True:        filename = f"{base_name}_{counter}{ext}"        if not os.path.exists(filename):            return filename        counter += 1def generate_esim_qr():    print("--- eSIM QR Code Generator (Local & Safe) ---")        # 1. 获取输入 (智能判断)    print("请选择输入方式,或者直接在此处粘贴 LPA 字符串:")    print("1. 手动粘贴 LPA 字符串")    print("2. 分别输入服务器地址和激活码")        # 去除首尾空格    user_input = input("\n请输入(1/2) 或 直接粘贴代码: ").strip()    final_lpa_string = ""    # 情况 A: 智能识别用户直接粘贴了长代码    if user_input.upper().startswith("LPA:"):        print("\n[检测到已直接粘贴 LPA 字符串]")        final_lpa_string = user_input    # 情况 B: 用户输入 1    elif user_input == '1':        raw_input = input("\n请粘贴完整的 LPA 字符串: ").strip()        final_lpa_string = raw_input    # 情况 C: 用户输入 2 (分段输入)    elif user_input == '2':        sm_dp = input("\n请输入 SM-DP+ 地址 (例如 rsp.life.ch): ").strip()        act_code = input("请输入激活码 (Activation Code): ").strip()        # 自动拼接标准格式        final_lpa_string = f"LPA:1${sm_dp}${act_code}"    # 情况 D: 无效输入    else:        print("\n❌ 无效的选择或格式错误。")        sys.exit()    if not final_lpa_string:        print("错误:内容为空!")        sys.exit()    # 2. 生成二维码    print(f"\n正在处理数据...")     qr = qrcode.QRCode(        version=1,        # 使用中等纠错(M),在保证可读性的同时控制密度        error_correction=qrcode.constants.ERROR_CORRECT_M,        box_size=10,        border=4,    )    qr.add_data(final_lpa_string)    qr.make(fit=True)    # 3. 保存文件 (自动处理文件名,防覆盖)    try:        save_filename = get_unique_filename()                img = qr.make_image(fill_color="black", back_color="white")        img.save(save_filename)                print(f"\n✅ 成功!二维码已保存为: 【 {save_filename} 】")        print(f"文件位于当前脚本运行目录下,请用手机直接扫描。")            except Exception as e:        print(f"\n❌ 保存失败: {e}")if __name__ == "__main__":    try:        generate_esim_qr()    except KeyboardInterrupt:        print("\n程序已取消。")

使用提示: 生成的二维码图片就在脚本同级目录下。用完记得保管好或者删除图片,毕竟这也是你的卡片密钥。
有改进空间也欢迎大家给出建议
希望对经常折腾 eSIM 的朋友有帮助!