要在Python中稳定调用LiblibAI文生图API,核心要点只有三个:正确配置签名参数、构造完整的JSON请求体,以及严格按照规则轮询任务状态并获取图片。如果遗漏Timestamp、拼错URI路径,或者跳过轮询机制,结果通常是请求被拒绝或返回空数据——这恰恰是许多新手容易踩坑的地方。
那么,具体该如何操作?下面逐步拆解。
获取并安全存储密钥
登录LiblibAI官网,进入左侧导航栏的“API开发平台”,点击“创建密钥”,系统会生成一对AccessKey和SecretKey。AccessKey用于标识你的身份,SecretKey则负责签名计算。SecretKey仅在创建时显示一次,关闭页面后便无法再次查看,必须立即复制保存到环境变量或加密文件中。
建议在项目根目录新建一个.env文件,写入类似如下内容:
LIBLIB_ACCESS_KEY="KIQMFXjHaobx7wqo9XvYKA"
LIBLIB_SECRET_KEY="KppKsn7ezZxhi6lIDjbo7YyVYzanSu2d"
构造合法签名参数
LiblibAI要求每次请求都必须包含Signature、Timestamp、SignatureNonce三个参数,签名算法为HMAC-SHA1,拼接顺序固定为:URI + “&” + Timestamp + “&” + SignatureNonce。
这里有几点容易踩坑的细节:
- Timestamp必须是毫秒级整数,误差不得超过300秒,否则请求会被判定为过期无效。
- SignatureNonce必须使用UUID v4字符串,且需去除短横线,每次请求必须唯一,重复使用会触发风控拦截。
下面是一段可以直接使用的签名函数:
def make_signature(uri, secret_key):
timestamp = str(int(time.time() * 1000))
nonce = str(uuid.uuid4()).replace('-', '')
content = uri + '&' + timestamp + '&' + nonce
digest = hmac.new(secret_key.encode(), content.encode(), sha1).digest()
signature = base64.urlsafe_b64encode(digest).rstrip(b'=').decode()
return signature, timestamp, nonce
提交文生图任务
第一步:调用/api/generate/webui/text2img接口,POST请求体为JSON格式,包含提示词、模型名、分辨率等核心参数。
第二步:请求必须附带四个查询参数——AccessKey、Signature、Timestamp、SignatureNonce,缺一不可。
第三步:请求成功返回的JSON中,task_id字段是后续轮询的唯一依据。注意:如果返回中没有task_id,或者code不是0,说明参数校验未通过,此时不要继续轮询,应先检查配置。
一个完整的请求体示例如下:
{
"prompt": "水墨江南,青瓦白墙,撑油纸伞的少女侧影",
"model_name": "Seedream 4.0",
"width": 1024,
"height": 1024,
"steps": 30,
"cfg_scale": 7
}
轮询获取图片URL
拿到task_id后,需要向/api/task/status发送GET请求,查询参数同样需携带task_id、AccessKey、Signature、Timestamp、SignatureNonce。
轮询时需注意以下几点:
- 每次轮询间隔不少于2秒,过于频繁会被限流。
- 如果连续5次返回status为pending,应主动终止并检查任务ID是否有效——可能是参数有误或任务根本没有提交成功。
- 当status变为
success时,从result.images数组中提取第一个元素的url字段,该链接有效期为24小时。 - 如果status为
failed,需读取error_msg字段判断原因。常见原因包括:积分不足、模型未启用、提示词中含违禁词三类。
整体流程其实并不复杂,但每个细节都直接影响最终的调用成功率。只要签名参数、轮询逻辑和错误处理都做到位,API调用完全可以稳定运行。
