宝塔批量建站三条路径,从简单到复杂:
· 路径一:命令行 bt 指令——一行代码建一个站,用循环批量跑。零学习成本,适合临时需要。
· 路径二:宝塔API + 脚本——Python/PHP调用官方API,建站+数据库+SSL+部署一站式。适合日常运维。
· 路径三:开源图形化工具——下载即用,可视化操作,批量建站+批量SSL+批量部署。适合不想写代码的用户。
路径一:bt命令行——一行命令一个站,Shell循环批量跑
宝塔面板自带 bt 命令行工具,SSH登录服务器后可以直接用。这是最原始但最快上手的方式,不需要开API,不需要写签名。
bt add_site test1.com 74
# PHP版本号对照:00=纯静态 74=PHP7.4 80=PHP8.0 81=PHP8.1 82=PHP8.2
# 批量建站:从sites.txt读取域名列表
while read domain; do
bt add_site $domain 74
done < sites.txt
执行前先把域名列表放进 sites.txt,每行一个域名。PHP版本必须已在宝塔中安装(去软件商店确认)。跑完之后有三件事必须检查:
命令行方式的局限性:bt add_site 建出来的站点不带数据库、不带FTP、不带SSL。它只是创建了站点配置和根目录。如果你需要数据库+SSL+WordPress,这条路后面还需要手动补很多操作。所以bt命令更适合"先快速建好50个空站点占坑,后面再慢慢配置"的场景。
路径二:宝塔API + Python脚本——建站+数据库+SSL+部署全自动
这是最灵活、最完整的方式。宝塔API可以做到的事远不止"建站"——创建数据库、申请SSL证书、解压文件、设置伪静态,全部可以通过API调用。一次脚本跑下来,站点从创建到上线一条龙搞定。
第一步:开启宝塔API
登录宝塔面板 → 设置 → 面板设置 → 勾选底部的"开启API接口" → 保存 → 点击"API密钥管理"生成新密钥。生成后立刻复制 key 和 secret——secret刷新页面后不再显示,无法找回。同时在API设置中配置IP白名单,只允许你的脚本所在服务器的IP调用。
第二步:理解签名算法(90%的人卡在这一步)
宝塔API不是简单的Token认证。每次请求需要携带动态签名:
sign = SHA256( key + secret + timestamp(秒级) + path + '?' + query_string(按字母序排列) )
三个关键点:①时间戳必须是UTC+8秒级整数,服务器时间误差超过5分钟即失败;②查询参数必须按字母序排序后再拼接;③POST的Body数据不参与签名,但路径和查询参数必须计算。
第三步:完整Python脚本——从域名列表到站点上线
# ====== 配置区 ======
BT_URL = "https://你的服务器IP:8888"
API_KEY = "你的key"
API_SECRET = "你的secret"
PHP_VERSION = "74" # 00=静态 74=PHP7.4 82=PHP8.2
# ====== 签名函数 ======
def make_sign(path, query_str):
ts = int(time.time())
raw = API_KEY + API_SECRET + str(ts) + path + "?" + query_str
sign = hashlib.sha256(raw.encode()).hexdigest()
return ts, sign
# ====== 添加站点 ======
def add_site(domain):
path = "/site?action=AddSite"
params = {
"webname": json.dumps({"domain": domain, "domainlist": [], "count": 0}),
"type": "PHP",
"version": PHP_VERSION,
"port": "80",
"ps": "批量建站",
"path": "/www/wwwroot/" + domain
}
query_str = "&".join(sorted([f"{k}={v}" for k,v in params.items()]))
ts, sign = make_sign(path, query_str)
url = f"{BT_URL}/site?action=AddSite&{query_str}&sign={sign}&time={ts}"
r = requests.post(url, timeout=30)
return r.json()
# ====== 批量执行 ======
sites = ["site1.com", "site2.com", "site3.com"]
for site in sites:
result = add_site(site)
print(f"{site} → {result.get('msg', 'OK')}")
time.sleep(1) # 请求间隔,避免触发频率限制
第四步:建站只是开始——后面还有四件事
创建数据库
API路径:/database?action=AddDatabase。参数:name(数据库名)、username(用户名)、password(密码)。建议数据库名用域名去点加下划线,如 site1_com_db。

申请SSL证书
走Let's Encrypt,但注意频率限制:同一域名每周最多5次申请。批量申请时一定要用time.sleep(5)间隔,否则会被ACME服务器限流。
部署网站程序
先用文件管理API上传WordPress压缩包到根目录,再调用解压API。或者更简单的:在服务器上统一放一份WordPress,用cp -r批量复制到各站点根目录,然后批量修改wp-config.php中的数据库连接信息。
设置伪静态
WordPress需要伪静态规则。API路径:/site?action=SetRewriteRule。或者最省事的办法:在宝塔中把一个站配置好伪静态,然后在 /www/server/panel/vhost/rewrite/ 目录下复制规则文件。

路径三:开源图形化工具——不想写代码,下载即用
如果你不想碰命令行和代码,GitHub上有一个叫 baota_BT_SSL 的开源工具(作者xiaocaiji61),专门解决这个痛点:
使用方式:从GitHub Release页面下载 BaoTaApi.exe(Windows单文件,免安装),输入宝塔面板地址和API密钥即可连接。工具同时显示服务器CPU、内存等状态。完全免费开源,MIT许可。适合"需要可视化操作、不想写脚本、站点数量几十到几百个"的用户。
五个翻车现场,每一个都能让你重新建50个站
翻车一:API签名报401,调了三个小时才发现服务器时间差5分钟
宝塔API签名里带了时间戳,服务器时间误差超过5分钟直接报"签名错误"。你在本地写好脚本测试没问题,放到另一台服务器上跑就401——因为两台机器时间不同步。解决办法:执行脚本的服务器先跑一次 ntpdate ntp.aliyun.com 同步时间。或者把脚本直接放在宝塔服务器本地执行。

翻车二:批量申请SSL证书,跑到第20个就被ACME服务器封了
Let's Encrypt对同一IP每小时有证书申请次数限制(约50个/小时,具体看服务器类型)。50个域名一口气申请,跑到一半就开始报错。解决办法:在循环里加 time.sleep(30)——每申请一个证书等30秒。50个域名大概25分钟跑完。或者用通配符证书(一个证书覆盖所有子域名),减少申请次数。
翻车三:域名DNS没解析就批量建站,50个站建好了全打不开
宝塔建站不检查DNS是否已解析。你脚本跑完50个站全建好了,但域名DNS还指着别的地方,或者根本没解析。SSL证书申请也会因此失败(ACME验证需要DNS能解析到服务器)。解决办法:批量建站前先确认所有域名的A记录都指向这台服务器IP。用 nslookup 或 ping 批量验证一遍。
翻车四:宝塔版本更新后API参数名变了,老脚本全挂
宝塔官方文档明确写了"API接口可能随面板版本变更,不保证稳定性"。7.x到8.x版本间API参数名可能变化(比如建站参数从webname变成别的)。解决办法:重大版本更新后先在测试服务器上跑一遍脚本,确认参数兼容。生产环境的批量建站脚本保留版本注释,注明在哪个面板版本测试通过。
翻车五:50个站同一台服务器,一个站被打所有站跟着挂
批量建站之前就要想好的问题。50个站在同一台服务器上,共享同一个CPU、内存、带宽、IP。一个站被CC攻击,CPU跑满,50个站全挂。或者一个站被搜索引擎判定为垃圾站,同一个IP上的其他站点也可能受影响。解决办法:建站之前做好资源规划,每个站点设置CPU/内存限制(宝塔有"网站资源限制"功能)。如果有预算,把核心站和长尾站放在不同服务器上。
六种场景,选什么路径对号入座
三种路径全维度对比速查表
宝塔批量建站的核心不在于"会不会写脚本"——Shell循环一句话的事,API调用的签名也有现成模板可以抄。真正决定效率的是建站前有没有想清楚:域名DNS都解析了吗?SSL证书申请频率限制怎么处理?数据库和FTP要不要自动创建?网站程序要不要一起部署?这些前置问题想清楚了,批量建站就是复制粘贴改域名列表的事。没想清楚就开跑,跑完才发现一半的站缺这缺那,一个一个补花的时间比手动建还多。脚本跑得快,坑踩得也快——先想清楚,再跑脚本。
