小白可移植指南 · v1.0

把密钥,
从代码里
解救出来。

把 API Key 写进一个单独的 .txt 文件,让 Python 运行时再去读它。 改 key 不用动代码,分享代码不会泄露密钥。

改 key 不动代码 分享不泄露 3 步就能移植
token-demo — zsh
为什么要这样做

写死在代码里,
到底哪里不对?

密钥一旦明文写进 .py,它就和你的代码绑死了——改一下要翻代码,发出去就跟着泄露。把它独立出来,一切都简单了。

✕

老办法:写死在代码里

HARDCODE
  • ✕改 key:要打开 .py 改代码,容易改错
  • ✕分享代码:key 会跟着泄露,危险
  • ✕多人协作:别人直接看到你的 key
  • ✕加新 key:改代码 + 重新测试
✓

新办法:放外部文件

EXTERNAL
  • ✓改 key:只改 txt 文件,安全简单
  • ✓分享代码:代码里没有 key,放心传
  • ✓多人协作:每人用自己的 txt
  • ✓加新 key:txt 里加一行就行
三步上手

从零到能用,
只要三步。

复制 → 粘贴 → 改个文件名。整个过程不用理解原理,照着做就能跑。

01

新建一个 key 文件

在脚本同目录建一个 txt 文件,一行写一个 key。空行和 # 注释会自动忽略。

# my_token.txt ms-aaaa1111-... ms-ffff2222-... # 备用 key ms-55553333-...
02

复制这段代码

把读取函数粘到脚本上方,唯一要改的就是文件名 my_token.txt。

from pathlib import Path TOKEN_FILE = Path(__file__) .resolve().parent / "my_token.txt" def load_api_keys(p): ...
03

用 API_KEYS

读取后 API_KEYS 就是一个 key 列表,直接拿来用:打印、轮换、塞进请求头都行。

API_KEYS = load_api_keys(TOKEN_FILE) key = API_KEYS[0] headers = {"Authorization": f"Bearer {key}"}
完整代码

复制这一段,
就能用。

下面是可移植的核心代码。带行号、带高亮,右侧是运行后你会看到的结果。点右上角一键复制。

load_api_keys.py
from pathlib import Path

# ====== 从外部文件读取 API Key(复制这一段就能用)======

# Token 文件路径:和你这个脚本在同一个文件夹里
# 只要把 "my_token.txt" 换成你自己的文件名就行
TOKEN_FILE = Path(__file__).resolve().parent / "my_token.txt"


def load_api_keys(token_path):
    """从文件读取 API Key,一行一个 key。
    - 自动跳过空行
    - 自动跳过 # 开头的注释行
    - 自动去掉每行首尾的空格
    - 文件不存在 / 没有有效 key 时会报错
    """
    if not token_path.is_file():
        raise FileNotFoundError(f"没找到 key 文件:{token_path}")
    keys = []
    with open(token_path, "r", encoding="utf-8-sig") as f:
        for line in f:
            line = line.strip()
            if not line or line.startswith("#"):
                continue
            keys.append(line)
    if not keys:
        raise ValueError(f"key 文件里没有读到任何有效 key:{token_path}")
    return keys


# 读出来的 key 列表,后面就可以直接用了
API_KEYS = load_api_keys(TOKEN_FILE)
运行结果
$ python app.py
✅ 成功读取 3 个 key
 
 #0: ms-aaaa1111-b...eeee
 #1: ms-ffff2222-1...4444
 #2: ms-55553333-6...9999
小白必看

每行代码,
到底在干嘛?

不用懂 Python 也能看懂。左边是代码,右边是大白话翻译。

Path(__file__).resolve().parent
「我这个 .py 脚本所在的文件夹」。不管你在哪个目录运行,都能找到 key 文件,不会因路径不对报错。
/ "my_token.txt"
在那个文件夹里找叫这个名字的文件。换成你自己的文件名即可。
encoding="utf-8-sig"
读取时自动处理编码,中文 / 带 BOM 的文件都能正常读,几乎不会乱码。
line.strip()
去掉每行开头结尾的空格和换行符。
if not line or line.startswith("#")
空行、# 注释行直接跳过,不读进 key 列表。
if not keys: raise ...
万一文件是空的,主动报错停下来,而不是默默用空列表继续跑,避免出大问题。
进阶用法

多个 key,
怎么轮换着用?

一个 key 挂了(限流、过期)就换下一个,循环复用。下面这个动画演示了「取余数循环」的效果——高亮的就是当前正在用的 key。

key #0
key #1
key #2
key #3
当前使用:key #0  ·  第 1 次调用
# 按顺序循环用:第 1 次 key0,第 2 次 key1,... 用完回到 key0 index = 0 def get_next_key(): global index key = API_KEYS[index % len(API_KEYS)] index += 1 return key # % 取余数,自然实现「到头回到第一个」的循环

核心就一行:index % len(API_KEYS)。 不管 index 涨到多大,取余后永远落在 0 ~ N-1 之间,自然形成循环。

进阶路径

想把 key 文件,
放在别的地方?

不想和脚本放一起?只需要改 TOKEN_FILE 那一行。

情况 1:放上一级文件夹 推荐

多一个 .parent,就往上一层。换电脑也能用。

TOKEN_FILE = Path(__file__).resolve().parent.parent / "my_token.txt" # ^^^^^^ 多一个 .parent

情况 2:绝对路径 直观

写死位置,最直观。缺点是换电脑 / 换系统要改。

TOKEN_FILE = Path("/Users/你的用户名/my_secrets/my_token.txt")
常见问题

跑不起来?
先看这里。

新手最容易踩的 5 个坑,对着报错找答案。

原因:脚本找不到你的 txt 文件。
检查:
  • txt 是不是和 .py 在同一个文件夹?
  • 文件名拼对了吗?(包括大小写、后缀 .txt)
  • 代码里的 "my_token.txt" 和实际文件名完全一致吗?
原因:文件找到了,但里面全是空行或注释,没有真正的 key。
检查:打开 txt 看看,是不是每一行都是空的或 # 开头?至少要有一行真实的 key。
原因:文件编码不对。
解决:代码已用 encoding="utf-8-sig",正常情况没问题。如果还乱码,用 VS Code / Sublime 打开 txt,另存为时选 UTF-8 编码再保存一次。
检查:Mac 默认隐藏文件扩展名。你以为是 my_token,实际可能是 my_token.txt.txt(多了个后缀)。在终端 ls 一下确认真实文件名。
可以,但不推荐。建议一种服务一个 txt 文件,比如 modelscope_token.txt、openai_token.txt,各自读各自的,清清楚楚。

移植到新脚本,3 步搞定。✅

以后任何 Python 脚本想用这个功能,照着做就行——不用再回来翻文档。

第 1 步:在脚本同目录建一个 txt 文件,一行一个 key 写进去。
第 2 步:把「完整代码」那段复制到脚本上方,改一下 "my_token.txt" 文件名。
第 3 步:用 API_KEYS 这个变量取 key 用(打印、轮换、塞进请求头都行)。