logo NodeSeekbeta

运营商只发了激活码?写了个 Python 脚本本地一键转 eSIM 二维码 (安全/离线/防覆盖)

背景 / 痛点: 最近折腾境外手机卡,发现部分运营商非常“硬核”,开通 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 qrcode
import sys
import os

def 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 += 1

def 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 的朋友有帮助!

12
12

你好啊,陌生人!

我的朋友,看起来你是新来的,如果想参与到讨论中,点击下面的按钮!

📈用户数目📈

目前论坛共有72782位seeker

🎉欢迎新用户🎉