'commit'
This commit is contained in:
@@ -1,45 +1,44 @@
|
||||
import hashlib
|
||||
|
||||
import requests
|
||||
import json
|
||||
import hmac
|
||||
from hashlib import sha1
|
||||
import base64
|
||||
import time
|
||||
import string
|
||||
import secrets
|
||||
import uuid
|
||||
|
||||
from Config.Config import LIBLIB_SECRETKEY, LIBLIB_URL, LIBLIB_ACCESSKEY
|
||||
import Config.Config
|
||||
|
||||
|
||||
class SignatureInfo:
|
||||
"""签名信息封装类,对应Java的SignatureInfo类"""
|
||||
def make_sign(uri):
|
||||
"""
|
||||
生成签名
|
||||
"""
|
||||
|
||||
def __init__(self, signature: str, timestamp: int, signature_nonce: str):
|
||||
self.signature = signature
|
||||
self.timestamp = timestamp
|
||||
self.signature_nonce = signature_nonce
|
||||
# API访问密钥
|
||||
secret_key = Config.Config.LIBLIB_SECRETKEY
|
||||
|
||||
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 timestamp == 0:
|
||||
timestamp = int(time.time() * 1000)
|
||||
if signatureNonce is None:
|
||||
signatureNonce = ''.join(secrets.choice(string.ascii_letters + string.digits) for _ in range(10))
|
||||
content = f"{uri}&{timestamp}&{signatureNonce}"
|
||||
print(content)
|
||||
signature = hmac.new(LIBLIB_SECRETKEY.encode('utf-8'), content.encode('utf-8'), digestmod=hashlib.sha1).digest()
|
||||
signature = base64.urlsafe_b64encode(signature).decode('utf-8').strip()
|
||||
return SignatureInfo(signature, timestamp, signatureNonce)
|
||||
|
||||
|
||||
# 请求API接口的uri地址(修正:使用相对路径,不包含域名)
|
||||
uri = f"/api/model/version/get"
|
||||
# 生成签名信息(确保在URL构建前调用)
|
||||
signature_info = make_sign(LIBLIB_URL+uri,1756799766502,'K91nkXyrCH') # 使用API_PATH而非完整URL
|
||||
|
||||
print(signature_info)
|
||||
if __name__ == '__main__':
|
||||
uri = "/api/model/version/get"
|
||||
print(make_sign(uri))
|
||||
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}'
|
||||
print(url)
|
||||
# Content-Type application/json
|
||||
# - 请求body:
|
||||
versionUuid="21df5d84cca74f7a885ba672b5a80d19"
|
||||
# 编写POST提交并接收返回值
|
||||
import requests
|
||||
response = requests.post(url, json={"versionUuid":versionUuid})
|
||||
print(response.json())
|
@@ -1,120 +1,44 @@
|
||||
import hashlib
|
||||
|
||||
import requests
|
||||
import json
|
||||
import hmac
|
||||
from hashlib import sha1
|
||||
import base64
|
||||
import time
|
||||
import string
|
||||
import secrets
|
||||
import uuid
|
||||
|
||||
from Config.Config import LIBLIB_SECRETKEY, LIBLIB_URL, LIBLIB_ACCESSKEY
|
||||
|
||||
|
||||
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}')"
|
||||
import Config.Config
|
||||
|
||||
|
||||
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相同的顺序和分隔符)
|
||||
content = f"{uri}&{timestamp}&{signature_nonce}"
|
||||
# HMAC-SHA1签名(修正:确保编码一致)
|
||||
signature = hmac.new(LIBLIB_SECRETKEY.encode('utf-8'), content.encode('utf-8'), digestmod=hashlib.sha1).digest()
|
||||
# Base64 URL安全编码(修正:使用URL安全编码)
|
||||
signature = base64.urlsafe_b64encode(signature).decode('utf-8').strip()
|
||||
print(f"签名调试信息:\nURI: {uri}\nTimestamp: {timestamp}\nNonce: {signature_nonce}\nContent: {content}\nSignature: {signature}")
|
||||
return SignatureInfo(signature, timestamp, signature_nonce)
|
||||
|
||||
|
||||
# 请求API接口的uri地址(修正:使用相对路径,不包含域名)
|
||||
uri = f"/api/model/version/get"
|
||||
# 生成签名信息(确保在URL构建前调用)
|
||||
signature_info = make_sign(uri) # 使用API_PATH而非完整URL
|
||||
|
||||
# 构建完整URL(修正:此处才拼接基础URL)
|
||||
# API配置(确保以下常量已定义)
|
||||
LIBLIB_URL = "https://openapi.liblibai.cloud"
|
||||
API_PATH = '/api/model/version/get'
|
||||
LIBLIB_ACCESSKEY = 'sOCtVLVTNOZkRMajlhzCmg' # 从Java代码同步的AccessKey
|
||||
version_uuid = 'YOUR_VERSION_UUID' # 替换为实际UUID
|
||||
# 构建完整URL(修正:使用signature_info对象属性)
|
||||
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}"
|
||||
|
||||
# 定义请求头
|
||||
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"
|
||||
}
|
||||
}
|
||||
生成签名
|
||||
"""
|
||||
|
||||
# API访问密钥
|
||||
secret_key = Config.Config.LIBLIB_SECRETKEY
|
||||
|
||||
# 当前毫秒时间戳
|
||||
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
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
uri = "/api/model/version/get"
|
||||
print(make_sign(uri))
|
||||
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}'
|
||||
print(url)
|
||||
# Content-Type application/json
|
||||
# - 请求body:
|
||||
versionUuid="21df5d84cca74f7a885ba672b5a80d19"
|
||||
# 编写POST提交并接收返回值
|
||||
import requests
|
||||
response = requests.post(url, json={"versionUuid":versionUuid})
|
||||
print(response.json())
|
Reference in New Issue
Block a user