【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地址更新uriuri = 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地址更新uriuri = 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_noncedef call_liblibai_api():generateUuid = ""# 生成签名sign, timestamp, signature_nonce = make_sign(text2img_uri)# 准备请求参数uri = 'https://openapi.liblibai.cloud/api/generate/webui/text2img'  # 根据API地址更新uriuri = 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 generateUuiddef 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地址更新uriuri = 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 resultif __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}")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/905476.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编程日志5.5

树的结构代码 #include<iostream> using namespace std; //由于树的每个结点可能有一些孩子结点,这些孩子结点的数量不确定,所以可以用一个链表来把所有的孩子结点给串起来 //链表结点定义 //这段代码定义了一个结构体ListNode,用于表示链表中的一个结点。这个结构…

【消息队列】RabbitMQ基本认识

目录 一、基本概念 1. 生产者&#xff08;Producer&#xff09; 2. 消费者&#xff08;Consumer&#xff09; 3. 队列&#xff08;Queue&#xff09; 4. 交换器&#xff08;Exchange&#xff09; 5. 绑定&#xff08;Binding&#xff09; 6. 路由键&#xff08;Routing …

uniapp -- 验证码倒计时按钮组件

jia-countdown-verify 验证码倒计时按钮组件 一个用于发送短信验证码的倒计时按钮组件&#xff0c;支持自定义样式、倒计时时间和文本内容。适用于各种需要验证码功能的表单场景。 代码已经 发布到插件市场 可以自行下载 下载地址 特性 支持自定义按钮样式&#xff08;颜色、…

知识图谱重构电商搜索:下一代AI搜索引擎的底层逻辑

1. 搜索引擎的进化论 从雅虎目录式搜索到Google的PageRank算法&#xff0c;搜索引擎经历了三次技术跃迁。而AI搜索引擎正在掀起第四次革命&#xff1a;在电商场景中&#xff0c;传统的「关键词匹配」已无法满足个性化购物需求&#xff0c;MOE搜索等新一代架构开始融合知识图谱…

深度学习 自然语言处理(RNN) day_02

1. 感知机与神经网络 1.1 感知机 生物神经元&#xff1a; 1.1.1 感知机的概念 感知机&#xff08;Perceptron&#xff09;&#xff0c;又称神经元&#xff08;Neuron&#xff0c;对生物神经元进行了模仿&#xff09;是神 经网络&#xff08;深度学习&#xff09;的起源算法&am…

PYTHON训练营DAY25

BUG与报错 一、try else try:# 可能会引发异常的代码 except ExceptionType: # 最好指定具体的异常类型&#xff0c;例如 ZeroDivisionError, FileNotFoundError# 当 try 块中发生 ExceptionType 类型的异常时执行的代码 except: # 不推荐&#xff1a;捕获所有类型的异常&…

LU分解求解线性方程组

L U LU LU分解 前言 L U LU LU分解 由以下定理得以保证&#xff1a; 设 A \boldsymbol{A} A为 n n n阶方阵&#xff0c;若其各界阶顺序主子式都不为 0 0 0&#xff0c;那么它可以 被唯一的上下三角矩阵积分解。 步骤 确定各矩阵形式 A L U \mathbf{A}\mathbf{LU} ALU ( a 1…

Linux——数据库备份与恢复

一&#xff0c;Mysql数据库备份概述 1&#xff0c;数据库备份的重要性 数据灾难恢复&#xff1a;数据库可能会因为各种原因出现故障&#xff0c;如硬件故障、软件错误、误操作、病毒攻击、自然灾害等。这些情况都可能导致数据丢失或损坏。如果有定期的备份&#xff0c;就可以…

SVM在医疗设备故障维修服务决策中的应用:策略、技术与实践

SVM在医疗设备故障维修服务决策中的应用&#xff1a;策略、技术与实践 医疗设备的高可靠性、安全性及严格合规性要求&#xff0c;使其故障维修决策具有显著的特殊性。支持向量机&#xff08;SVM&#xff09;凭借小样本学习、非线性建模及高精度分类能力&#xff0c;可有效解决…

WEB安全--Java安全--CC1利用链

一、梳理基本逻辑 WEB后端JVM通过readObject()的反序列化方式接收用户输入的数据 用户编写恶意代码并将其序列化为原始数据流 WEB后端JVM接收到序列化后恶意的原始数据并进行反序列化 当调用&#xff1a; ObjectInputStream.readObject() JVM 内部逻辑&#xff1a; → 反…

FlashInfer - 介绍 LLM服务加速库 地基的一块石头

FlashInfer - 介绍 LLM服务加速库 地基的一块石头 flyfish 大型语言模型服务中的注意力机制 大型语言模型服务&#xff08;LLM Serving&#xff09;迅速成为重要的工作负载。Transformer中的算子效率——尤其是矩阵乘法&#xff08;GEMM&#xff09;、自注意力&#xff08;S…

反向操作:如何用AI检测工具优化自己的论文“人味”?

大家好&#xff0c;这里是论文写手的一线自救指南&#x1f624; 在AIGC横行的今天&#xff0c;谁还没偷偷用过AI写几段论文内容&#xff1f;但问题来了&#xff1a;学校越来越会“识AI”了&#xff01; 有的学校甚至不看重复率&#xff0c;只盯AIGC率报告&#xff0c;一句“AI…

关于单片机的基础知识(一)

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于单片机基础知识的相关内容&#xf…

AWS技术助力企业满足GDPR合规要求

GDPR(通用数据保护条例)作为欧盟严格的数据保护法规,给许多企业带来了合规挑战。本文将探讨如何利用AWS(亚马逊云服务)的相关技术来满足GDPR的核心要求,帮助企业实现数据保护合规。 一、GDPR核心要求概览 GDPR的主要目标是保护欧盟公民的个人数据和隐私权。其核心要求包括: 数…

FFplay 音视频同步机制解析:以音频为基准的时间校准与动态帧调整策略

1.⾳视频同步基础 1.2 简介 看视频时&#xff0c;要是声音和画面不同步&#xff0c;体验会大打折扣。之所以会出现这种情况&#xff0c;和音视频数据的处理过程密切相关。音频和视频的输出不在同一个线程&#xff0c;就像两个工人在不同车间工作&#xff0c;而且不一定会同时…

车载网关--- 职责边界划分与功能解耦设计

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…

最优化方法Python计算:有约束优化应用——近似线性可分问题支持向量机

二分问题的数据集 { ( x i , y i ) } \{(\boldsymbol{x}_i,y_i)\} {(xi​,yi​)}&#xff0c; i 1 , 2 , ⋯ , m i1,2,\cdots,m i1,2,⋯,m中&#xff0c;特征数据 { x i } \{\boldsymbol{x}_i\} {xi​}未必能被一块超平面按其标签值 y i ∈ { − 1 , 1 } y_i\in\{-1,1\} yi​∈…

aardio - 将文本生成CSS格式显示

import win.ui; /*DSG{{*/ var winform win.form(text"aardio form";right759;bottom469) winform.add( button{cls"button";text"Button";left340;top130;right430;bottom180;z3}; edit{cls"edit";text"我是一串文本";lef…

数字IC后端设计实现 | 如何自动删除Innovus 中冗余的hold buffer?

我们都知道在postCTS阶段做optDesign时序优化时需要进行hold violation的fixing。所以这个过程势必要通过插hold buffer来解决hold violation。这类hold buffer的名字带有"PHC"的关键词。 select_obj [dbGet top.insts.name PHC] llength [dbGet top.insts.name PH…

c# 倒序方法

在C#中&#xff0c;有几种方法可以对List进行倒序排列&#xff1a; 1. 使用List的Reverse()方法&#xff08;原地反转&#xff09; List<int> numbers new List<int> { 1, 2, 3, 4, 5 };numbers.Reverse(); // 直接修改原列表// 结果&#xff1a;5, 4, 3, 2, 1 …