This commit is contained in:
2025-09-02 16:26:38 +08:00
parent 6cec8cf580
commit f7b365a1b8
2 changed files with 67 additions and 144 deletions

View File

@@ -1,45 +1,44 @@
import hashlib
import requests
import json
import hmac import hmac
from hashlib import sha1 from hashlib import sha1
import base64 import base64
import time import time
import string import uuid
import secrets
from Config.Config import LIBLIB_SECRETKEY, LIBLIB_URL, LIBLIB_ACCESSKEY import Config.Config
class SignatureInfo: def make_sign(uri):
"""签名信息封装类对应Java的SignatureInfo类""" """
生成签名
"""
def __init__(self, signature: str, timestamp: int, signature_nonce: str): # API访问密钥
self.signature = signature secret_key = Config.Config.LIBLIB_SECRETKEY
self.timestamp = timestamp
self.signature_nonce = signature_nonce
def __repr__(self) -> str: # 当前毫秒时间戳
return f"SignatureInfo(signature='{self.signature}', timestamp={self.timestamp}, signature_nonce='{self.signature_nonce}')" timestamp = str(int(time.time() * 1000))
# 随机字符串
signature_nonce = str(uuid.uuid4())
# 拼接请求数据
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 make_sign(uri, timestamp, signatureNonce): if __name__ == '__main__':
# 当前毫秒时间戳(修正:使用整数类型) uri = "/api/model/version/get"
if timestamp == 0: print(make_sign(uri))
timestamp = int(time.time() * 1000) sign, timestamp, signature_nonce = make_sign(uri)
if signatureNonce is None: url = f'{Config.Config.LIBLIB_URL}{uri}?AccessKey={Config.Config.LIBLIB_ACCESSKEY}&Signature={sign}&Timestamp={timestamp}&SignatureNonce={signature_nonce}'
signatureNonce = ''.join(secrets.choice(string.ascii_letters + string.digits) for _ in range(10)) print(url)
content = f"{uri}&{timestamp}&{signatureNonce}" # Content-Type application/json
print(content) # - 请求body
signature = hmac.new(LIBLIB_SECRETKEY.encode('utf-8'), content.encode('utf-8'), digestmod=hashlib.sha1).digest() versionUuid="21df5d84cca74f7a885ba672b5a80d19"
signature = base64.urlsafe_b64encode(signature).decode('utf-8').strip() # 编写POST提交并接收返回值
return SignatureInfo(signature, timestamp, signatureNonce) import requests
response = requests.post(url, json={"versionUuid":versionUuid})
print(response.json())
# 请求API接口的uri地址修正使用相对路径不包含域名
uri = f"/api/model/version/get"
# 生成签名信息确保在URL构建前调用
signature_info = make_sign(LIBLIB_URL+uri,1756799766502,'K91nkXyrCH') # 使用API_PATH而非完整URL
print(signature_info)

View File

@@ -1,120 +1,44 @@
import hashlib
import requests
import json
import hmac import hmac
from hashlib import sha1 from hashlib import sha1
import base64 import base64
import time import time
import string import uuid
import secrets
from Config.Config import LIBLIB_SECRETKEY, LIBLIB_URL, LIBLIB_ACCESSKEY import Config.Config
class SignatureInfo:
"""签名信息封装类对应Java的SignatureInfo类"""
def __init__(self, signature: str, timestamp: int, signature_nonce: str):
self.signature = signature
self.timestamp = timestamp
self.signature_nonce = signature_nonce
def __repr__(self) -> str:
return f"SignatureInfo(signature='{self.signature}', timestamp={self.timestamp}, signature_nonce='{self.signature_nonce}')"
def make_sign(uri): def make_sign(uri):
# 当前毫秒时间戳(修正:使用整数类型) """
timestamp = int(time.time() * 1000) 生成签名
# 生成10位字母数字随机字符串修正匹配Java的randomAlphanumeric """
signature_nonce = ''.join(secrets.choice(string.ascii_letters + string.digits) for _ in range(10))
# 拼接签名内容修正使用Java相同的顺序和分隔符 # API访问密钥
content = f"{uri}&{timestamp}&{signature_nonce}" secret_key = Config.Config.LIBLIB_SECRETKEY
# HMAC-SHA1签名修正确保编码一致
signature = hmac.new(LIBLIB_SECRETKEY.encode('utf-8'), content.encode('utf-8'), digestmod=hashlib.sha1).digest() # 当前毫秒时间戳
# Base64 URL安全编码修正使用URL安全编码 timestamp = str(int(time.time() * 1000))
signature = base64.urlsafe_b64encode(signature).decode('utf-8').strip() # 随机字符串
print(f"签名调试信息:\nURI: {uri}\nTimestamp: {timestamp}\nNonce: {signature_nonce}\nContent: {content}\nSignature: {signature}") signature_nonce = str(uuid.uuid4())
return SignatureInfo(signature, timestamp, signature_nonce) # 拼接请求数据
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
# 请求API接口的uri地址修正使用相对路径不包含域名 if __name__ == '__main__':
uri = f"/api/model/version/get" uri = "/api/model/version/get"
# 生成签名信息确保在URL构建前调用 print(make_sign(uri))
signature_info = make_sign(uri) # 使用API_PATH而非完整URL sign, timestamp, signature_nonce = make_sign(uri)
url = f'{Config.Config.LIBLIB_URL}{uri}?AccessKey={Config.Config.LIBLIB_ACCESSKEY}&Signature={sign}&Timestamp={timestamp}&SignatureNonce={signature_nonce}'
# 构建完整URL修正此处才拼接基础URL print(url)
# API配置确保以下常量已定义 # Content-Type application/json
LIBLIB_URL = "https://openapi.liblibai.cloud" # - 请求body
API_PATH = '/api/model/version/get' versionUuid="21df5d84cca74f7a885ba672b5a80d19"
LIBLIB_ACCESSKEY = 'sOCtVLVTNOZkRMajlhzCmg' # 从Java代码同步的AccessKey # 编写POST提交并接收返回值
version_uuid = 'YOUR_VERSION_UUID' # 替换为实际UUID import requests
# 构建完整URL修正使用signature_info对象属性 response = requests.post(url, json={"versionUuid":versionUuid})
full_url = f"{LIBLIB_URL}{API_PATH}?version_uuid={version_uuid}&AccessKey={LIBLIB_ACCESSKEY}&Signature={signature_info.signature}&Timestamp={signature_info.timestamp}&SignatureNonce={signature_info.signature_nonce}" print(response.json())
# 定义请求头
headers = {"Content-Type": "application/json"}
# 定义请求体
version_uuid = "4bb1335feb1e4d2eafe5a77bb93e861f"
request_body = {"version_uuid": version_uuid}
# 发送请求使用正确的full_url变量
response = requests.post(full_url, headers=headers, json=request_body)
# 添加详细调试输出
#print(f"请求URL: {url}")
# 修正在使用headers前定义请求头
headers = {"Content-Type": "application/json"}
# 定义version_uuid变量请替换为实际的UUID值
version_uuid = "4bb1335feb1e4d2eafe5a77bb93e861f"
# 构建请求体
request_body = {"version_uuid": version_uuid}
print(f"请求头: {headers}")
print(f"请求体: {json.dumps(request_body)}")
try:
# 修改请求方法为POST并添加完整参数
response = requests.post(LIBLIB_URL+uri, headers=headers, json=request_body)
# 增加详细调试输出
print(f"完整请求URL: {LIBLIB_URL}{uri}")
print(f"请求方法: POST")
print(f"请求头: {headers}")
print(f"请求体: {json.dumps(request_body, ensure_ascii=False)}")
print(f"响应状态码: {response.status_code}")
print(f"响应内容: {response.text}")
# 验证version_uuid有效性请替换为实际有效的UUID
version_uuid = "有效的模型版本UUID"
print(f"请求体: {json.dumps(request_body)}")
print(f"响应状态码: {response.status_code}")
print(f"响应内容: {response.text}") # 打印完整响应内容
response.raise_for_status()
result = response.json()
print(result.get("code"))
print(result.get("msg"))
# 解析响应数据
print("API响应结果:")
print(f"模型名称: {result.get('model_name')}")
print(f"版本号: {result.get('version_name')}")
print(f"是否可商用: {'' if result.get('commercial_use') == '1' else ''}")
print(f"模型链接: {result.get('model_url')}")
except requests.exceptions.RequestException as e:
print(f"请求发生错误: {str(e)}")
"""
{
"version_uuid": "21df5d84cca74f7a885ba672b5a80d19",//LiblibAI官网模型链接后缀
"model_name": "AWPortrait XL"
"version_name": "1.1"
"baseAlgo": "基础算法 XL"
"show_type": "1"//公开可用的模型
"commercial_use": "1"//可商用为1不可商用为0
"model_url": "https://www.liblib.art/modelinfo/f8b990b20cb943e3aa0e96f34099d794?versionUuid=21df5d84cca74f7a885ba672b5a80d19"
}
}
"""