【Liblib】基于LiblibAI自定义模型,总结一下Python开发步骤

一、前言

Liblib AI(哩布哩布 AI)是一个集成了先进人工智能技术和用户友好设计的 AI 图像创作绘画平台和模型分享社区。

  • 强大的图像生成能力 :以 Stable Diffusion 技术为核心,提供文生图、图生图、图像后期处理等功能,支持多种模型和风格特征的模型(LoRA 模型),并允许用户进行面部修复和高清修复等操作。
  • 丰富的模型素材库 :拥有 10 万 + 的模型库,涵盖插画、摄影、3D 立体、商品摄影、设计、数字艺术、油画、水彩、二次元等 300 多种风格,用户可训练专属 LoRA 模型并参与社区互动。
  • 多端支持 :除了电脑端,还有手机端 APP,用户可以通过手机号验证登录使用,APP 版本具备 AI 绘画、AI 写作、AI 音频合成等功能。

Liblib是个图像ai平台,有根据文字生成图片,修复图片,图片重绘等多种功能。

LiblibAI官网:LiblibAI-哩布哩布AI - 中国领先的AI创作平台

LiblibAI开放平台文档:Docs

API试用计划:登录后可领取500试用积分,限时7天免费测试体验。

二、准备

1、首先要去官网注册一个账号并登录。

2、在官网首页左侧导航栏有API开发平台的菜单,点击进去,记得先登录账号。

3、点击进去会看到两个使用api平台需要用到的key,把这两个key复制出来保存好。

三、主要步骤:

1、获取AccessKey与SecretKey

2、使用秘钥,获取网址必要的参数

3、请求网址,基于文生图参数,获取任务id

4、请求网址,基于任务id,获取图片网址

四、具体操作

1、接口网址

Liblib开放平台域名:https://openapi.liblibai.cloud(无法直接打开,需配合密钥访问)

2、生成API密钥

在登录Liblib领取API试用积分或购买API积分后,Liblib会生成开放平台访问密钥,用于后续API接口访问,密钥包括:​

  • AccessKey,API访问凭证,唯一识别访问用户,长度通常在20-30位左右,如:KIQMFXjHaobx7wqo9XvYKA
  • SecretKey,API访问密钥,用于加密请求参数,避免请求参数被篡改,长度通常在30位以上,如:KppKsn7ezZxhi6lIDjbo7YyVYzanSu2d

3、使用密钥​获取网址必要的参数

申请API密钥之后,需要在每次请求API接口的查询字符串中固定传递以下参数:​


如请求地址:https://test.xxx.com/api/genImg?AccessKey=KIQMFXjHaobx7wqo9XvYKA\&Signature=test1232132\&Timestamp=1725458584000\&SignatureNonce=random1232

4、Python生成密码代码:

复制代码
# 请求API接口的uri地址
text2img_uri = "/api/generate/webui/text2img"

def make_sign(uri):
    """
    生成签名
    """
    # 当前毫秒时间戳
    timestamp = str(int(time.time() * 1000))
    # 随机字符串
    signature_nonce = str(uuid.uuid4()).replace('-', '')
    # 拼接请求数据
    content = '&'.join((uri, timestamp, signature_nonce))

    # 生成签名
    digest = hmac.new(SECRET_KEY.encode(), content.encode(), sha1).digest()
    # 移除为了补全base64位数而填充的尾部等号
    sign = base64.urlsafe_b64encode(digest).rstrip(b'=').decode()
    return sign, timestamp, signature_nonce

注意:uri要与调用的接口保持一致

5、Python调用接口代码:

复制代码
def call_liblibai_api():
    generateUuid = ""
    # 生成签名
    sign, timestamp, signature_nonce = make_sign(text2img_uri)

    # 准备请求参数
    uri = 'https://openapi.liblibai.cloud/api/generate/webui/text2img'  # 根据API地址更新uri

    uri = f"{uri}?AccessKey={ACCESS_KEY}&Signature={sign}&Timestamp={timestamp}&SignatureNonce={signature_nonce}"
    print(uri)

    headers = {
        'Content-Type': 'application/json'
    }

    data = {
        "templateUuid": "e10adc3949ba59abbe56e057f20f883e",
        "generateParams": {
            "checkPointId": "ba34a22f1c044472a42b6051aac2afb3",
            "prompt": "This is a 12-story hospital building. The ground floor houses the emergency room and pharmacy. The entrance is spacious and has a sheltered structure. Each floor from the second to the twelfth floor has a ward area, including a nurse station, ward Windows, and space for placing medical equipment. The building's exterior is simple, with Windows arranged regularly. From the outside, a clear 12-story structure can be seen.",
            "negativePrompt": "ng_deepnegative_v1_75t,(badhandv4:1.2),EasyNegative,(worst quality:2),",
            "sampler": 15,
            "steps": 20,
            "cfgScale": 7,
            "width": 768,
            "height": 1024,
            "imgCount": 1,
            "randnSource": 0,
            "seed": 2228967414,
            "restoreFaces": 0,

            "hiResFixInfo": {
                "hiresSteps": 20,
                "hiresDenoisingStrength": 0.75,
                "upscaler": 10,
                "resizedWidth": 1024,
                "resizedHeight": 1536
            }
        }
    }

    try:
        # 发送POST请求
        response = requests.post(uri, headers=headers, data=json.dumps(data))
        # 处理响应
        if response.status_code == 200:
            result = response.json()
            generateUuid = result['data']['generateUuid']
            print('API调用成功,返回结果:', result)
        else:
            print('API调用失败,状态码:', response.status_code, ',响应内容:', response.text)
    except requests.exceptions.RequestException as e:
        print('请求异常:', e)

    return generateUuid

注意:具体参数说明,请参考开发文档

6、接口返回示例,获取任务id:

复制代码
{
    "code": 0,
    "msg": "",
    "data": {
        "generateUuid": "8dcbfa2997444899b71357ccb7db378b"
    }
}

7、Python查看任务,并得到图片地址:

复制代码
def get_cd_laowang_img(generateUuid):
    result = {}
    # 生成签名
    sign, timestamp, signature_nonce = make_sign(generate_webui_status_uri)

    # 准备请求参数
    uri = 'https://openapi.liblibai.cloud/api/generate/webui/status'  # 根据API地址更新uri

    uri = f"{uri}?AccessKey={ACCESS_KEY}&Signature={sign}&Timestamp={timestamp}&SignatureNonce={signature_nonce}"
    print(uri)

    headers = {
        'Content-Type': 'application/json'
    }

    data = {
        "generateUuid": generateUuid,
    }

    try:
        # 发送POST请求
        response = requests.post(uri, headers=headers, data=json.dumps(data))
        # 处理响应
        if response.status_code == 200:
            result = response.json()
            print('API调用成功,返回结果:', result)
        else:
            print('API调用失败,状态码:', response.status_code, ',响应内容:', response.text)
    except requests.exceptions.RequestException as e:
        print('请求异常:', e)

    return result

注意:因为api接口改变,所以需要再次生成签名

五、全部代码如下:

复制代码
import requests
import json
import hmac
from hashlib import sha1
import base64
import time
import uuid

# 配置信息
ACCESS_KEY = 'MXYG3cwFHVRa3wsLU5iJwQ'  # 替换为你的AccessKey
SECRET_KEY = '*************************'  # 替换为你的SecretKey

# 请求API接口的uri地址
text2img_uri = "/api/generate/webui/text2img"
generate_webui_status_uri = "/api/generate/webui/status"


def make_sign(uri):
    """
    生成签名
    """
    # 当前毫秒时间戳
    timestamp = str(int(time.time() * 1000))
    # 随机字符串
    signature_nonce = str(uuid.uuid4()).replace('-', '')
    # 拼接请求数据
    content = '&'.join((uri, timestamp, signature_nonce))

    # 生成签名
    digest = hmac.new(SECRET_KEY.encode(), content.encode(), sha1).digest()
    # 移除为了补全base64位数而填充的尾部等号
    sign = base64.urlsafe_b64encode(digest).rstrip(b'=').decode()
    return sign, timestamp, signature_nonce


def call_liblibai_api():
    generateUuid = ""
    # 生成签名
    sign, timestamp, signature_nonce = make_sign(text2img_uri)

    # 准备请求参数
    uri = 'https://openapi.liblibai.cloud/api/generate/webui/text2img'  # 根据API地址更新uri

    uri = f"{uri}?AccessKey={ACCESS_KEY}&Signature={sign}&Timestamp={timestamp}&SignatureNonce={signature_nonce}"
    print(uri)

    headers = {
        'Content-Type': 'application/json'
    }

    data = {
        "templateUuid": "e10adc3949ba59abbe56e057f20f883e",
        "generateParams": {
            "checkPointId": "ba34a22f1c044472a42b6051aac2afb3",
            "prompt": "This is a 12-story hospital building. The ground floor houses the emergency room and pharmacy. The entrance is spacious and has a sheltered structure. Each floor from the second to the twelfth floor has a ward area, including a nurse station, ward Windows, and space for placing medical equipment. The building's exterior is simple, with Windows arranged regularly. From the outside, a clear 12-story structure can be seen.",
            "negativePrompt": "ng_deepnegative_v1_75t,(badhandv4:1.2),EasyNegative,(worst quality:2),",
            "sampler": 15,
            "steps": 20,
            "cfgScale": 7,
            "width": 768,
            "height": 1024,
            "imgCount": 1,
            "randnSource": 0,
            "seed": 2228967414,
            "restoreFaces": 0,

            "hiResFixInfo": {
                "hiresSteps": 20,
                "hiresDenoisingStrength": 0.75,
                "upscaler": 10,
                "resizedWidth": 1024,
                "resizedHeight": 1536
            }
        }
    }

    try:
        # 发送POST请求
        response = requests.post(uri, headers=headers, data=json.dumps(data))
        # 处理响应
        if response.status_code == 200:
            result = response.json()
            generateUuid = result['data']['generateUuid']
            print('API调用成功,返回结果:', result)
        else:
            print('API调用失败,状态码:', response.status_code, ',响应内容:', response.text)
    except requests.exceptions.RequestException as e:
        print('请求异常:', e)

    return generateUuid


def get_cd_laowang_img(generateUuid):
    result = {}
    # 生成签名
    sign, timestamp, signature_nonce = make_sign(generate_webui_status_uri)

    # 准备请求参数
    uri = 'https://openapi.liblibai.cloud/api/generate/webui/status'  # 根据API地址更新uri

    uri = f"{uri}?AccessKey={ACCESS_KEY}&Signature={sign}&Timestamp={timestamp}&SignatureNonce={signature_nonce}"
    print(uri)

    headers = {
        'Content-Type': 'application/json'
    }

    data = {
        "generateUuid": generateUuid,
    }

    try:
        # 发送POST请求
        response = requests.post(uri, headers=headers, data=json.dumps(data))
        # 处理响应
        if response.status_code == 200:
            result = response.json()
            print('API调用成功,返回结果:', result)
        else:
            print('API调用失败,状态码:', response.status_code, ',响应内容:', response.text)
    except requests.exceptions.RequestException as e:
        print('请求异常:', e)

    return result


if __name__ == '__main__':
    generateUuid = call_liblibai_api()
    time.sleep(20)
    if generateUuid != "":
        print("generateUuid:", generateUuid)
        result = get_cd_laowang_img(generateUuid)
        image_url = result['data']['images'][0]["imageUrl"]
        print(f"generateUuid:{generateUuid}")
        print(f"图片地址:{image_url}")
相关推荐
胡玉洋1 小时前
从新手到高手:全面解析 AI 时代的「魔法咒语」——Prompt
人工智能·ai·prompt·transformer·协议
带刺的坐椅2 小时前
SpringBoot3 使用 SolonMCP 开发 MCP
java·ai·springboot·solon·mcp
wang_yb7 小时前
同样的数据,更强的效果:如何让模型学会‘互补思维’?
ai·databook
视觉&物联智能9 小时前
【杂谈】-AI 重塑体育营销:从内容管理到创意释放的全面变革
人工智能·ai·aigc·agi·营销
云边有个稻草人9 小时前
GpuGeek:为创新者提供灵活、快速、高效的云计算服务!
人工智能·大模型·算力·gpugeek平台·qwen3-32b
伊织code15 小时前
PyTorch API 5 - 全分片数据并行、流水线并行、概率分布
pytorch·python·ai·api·-·5
CM莫问15 小时前
<论文>(微软)避免推荐域外物品:基于LLM的受限生成式推荐
人工智能·算法·大模型·推荐算法·受限生成
jc_hook17 小时前
Python 接入DeepSeek
python·大模型·deepseek
TGITCIC20 小时前
为何大模型都使用decoder-only?
人工智能·大模型·transformer·ai agent·大模型面试·ai面试