"""
版本号:1.0
日期:2024/11/14
描述:
"""
import uuid
import jwt
import time
import requests
# OAuth应用的相关信息,需从扣子平台获取并替换
APP_ID = "" # auth应用id
PUBLIC_KEY_FINGERPRINT = "" # 公钥
PRIVATE_KEY_PATH = "private_key.pem" # 私钥文件路径
# 扣子API的Endpoint
API_ENDPOINT = "api.coze.cn"
def generate_jwt():
"""
生成JWT
"""
# 读取私钥文件
with open(PRIVATE_KEY_PATH, 'r') as f:
private_key = f.read()
# JWT头部信息
header = {
"alg": "RS256",
"typ": "JWT",
"kid": PUBLIC_KEY_FINGERPRINT
}
# JWT负载信息
payload = {
"iss": APP_ID,
"aud": API_ENDPOINT,
"iat": int(time.time()),
"exp": int(time.time()) + 86400, # 这里设置JWT过期时间为1小时,可根据需求调整
"jti": uuid.uuid4().hex # 需替换为真正的随机字符串,每次生成JWT时应不同
}
# 生成JWT
jwt_token = jwt.encode(payload, private_key, algorithm='RS256', headers=header)
return jwt_token
def get_access_token(jwt_token):
"""
使用JWT获取访问令牌
"""
url = "https://api.coze.cn/api/permission/oauth2/token"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {jwt_token}"
}
data = {
"grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
"duration_seconds": 86399 # 可根据需求调整有效期,最大为86399秒(24小时)
}
response = requests.post(url, headers=headers, json=data)
if response.status_code == 200:
return response.json()["access_token"]
else:
print(f"获取访问令牌失败,错误码: {response.status_code},错误信息: {response.text}")
return None
def get_conversion_id(access_token):
create_url = ' https://api.coze.cn/v1/conversation/create'
headers = {
'Authorization': f'Bearer {access_token}',
'Content-Type': 'application/json'
}
res = requests.post(create_url, headers=headers)
return res.json()['data']['id']
def chat_with_bot(access_token, conversation_id):
url = 'https://api.coze.cn/v3/chat?conversation_id='+conversation_id
headers = {
'Authorization': f'Bearer {access_token}',
'Content-Type': 'application/json'
}
data = {
"bot_id": "", # 智能体id,就是智能体详情url后面的那个id
"user_id": '1234566758',
"stream": False,
"auto_save_history": True,
"additional_messages": [
{"role": "user", "content": "你是", "content_type": "text"}
]
}
res = requests.post(url, headers=headers, json=data)
print(res.json())
return res.json()['data']['id']
def get_chat_content(i, c, a):
url = 'https://api.coze.cn/v3/chat/retrieve'
headers = {
'Authorization': f'Bearer {a}',
'Content-Type': 'application/json'
}
data = {
"conversation_id": i,
"chat_id": c
}
res = requests.get(url, headers=headers, json=data)
print(res.json())
if __name__ == "__main__":
jwt_token = generate_jwt()
print(f"生成的JWT: {jwt_token}")
access_token = get_access_token(jwt_token)
if access_token:
print(f"获取的访问令牌: {access_token}")
# access_token = 'czs_85DxsJ631VZ7owpzB2ucDmo0iiT0cs3UifDhuvD3yRUEhaDH4GU2pbvWXY4aiNwm'
conversion_id = get_conversion_id(access_token)
chat_id = chat_with_bot(access_token, conversion_id)
time.sleep(1)
get_chat_content(conversion_id, chat_id, access_token)