Files
huike-front/test_coze_api.sh
T
weli a661e439a0 chore: initialize frontend repo with teaching terminology updates
Add the current frontend codebase with a baseline .gitignore and update piano-specific UI terms to teaching-oriented terms for the current product context.

Made-with: Cursor
2026-04-23 16:37:14 +08:00

447 lines
14 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# Coze AI客服接口测试脚本
# 用于测试前端与后端AI客服系统的跨域通信和接口功能
# 作者: AlchemyStudio
# 创建时间: 2025-09-06
# 设置颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 配置变量
BACKEND_URL="http://localhost:5000"
FRONTEND_URL="http://localhost:8000"
API_BASE="${BACKEND_URL}/coze"
AUTH_HEADER="Authorization: Basic aHVpd2luZzo5dm9EOVNSMVNMS3h3SnhNeVFNVQ=="
# 全局变量
SESSION_ID=""
SESSION_STATUS=""
CHAT_ID=""
# 打印带颜色的消息
print_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
print_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
# 解码Unicode转义序列为可读文本
decode_unicode() {
local text="$1"
# 尝试使用Python解码Unicode,如果失败则返回原文本
echo "$text" | python3 -c "import sys, json; print(json.loads('\"' + sys.stdin.read().strip() + '\"'))" 2>/dev/null || echo "$text"
}
# 检查服务是否运行
check_services() {
print_info "检查服务状态..."
# 检查后端服务
if curl -s "${BACKEND_URL}/coze/health" > /dev/null 2>&1; then
print_success "后端服务运行正常 (${BACKEND_URL})"
else
print_error "后端服务未运行或无法访问 (${BACKEND_URL})"
return 1
fi
# 检查前端服务
if curl -s "${FRONTEND_URL}" > /dev/null 2>&1; then
print_success "前端服务运行正常 (${FRONTEND_URL})"
else
print_warning "前端服务未运行或无法访问 (${FRONTEND_URL})"
fi
echo
}
# 测试创建会话接口
test_create_session() {
print_info "测试创建会话接口..."
local response=$(curl -s -X POST "${API_BASE}/sessions" \
-H "${AUTH_HEADER}" \
-H 'Content-Type: application/json' \
-H "Origin: ${FRONTEND_URL}" \
-H "Referer: ${FRONTEND_URL}/tester/ai-cs" \
-d '{"user_id": "test_user", "bot_id": "default-bot-id"}')
if echo "$response" | grep -q '"success":true'; then
# 提取会话ID
SESSION_ID=$(echo "$response" | grep -o '"session_id":"[^"]*"' | cut -d'"' -f4)
print_success "会话创建成功,会话ID: ${SESSION_ID}"
echo "响应: $response" | head -c 200
echo "..."
echo
return 0
else
print_error "会话创建失败"
echo "响应: $response"
echo
return 1
fi
}
# 测试发送消息接口
test_send_message() {
if [ -z "$SESSION_ID" ]; then
print_error "没有可用的会话ID,请先创建会话"
return 1
fi
print_info "测试发送消息接口..."
local test_message="你好,这是一个测试消息,请问你能帮我做什么?"
local response=$(curl -s -X POST "${API_BASE}/sessions/${SESSION_ID}/messages" \
-H "${AUTH_HEADER}" \
-H 'Content-Type: application/json' \
-H "Origin: ${FRONTEND_URL}" \
-H "Referer: ${FRONTEND_URL}/tester/ai-cs" \
-d "{\"message\": \"${test_message}\"}")
if echo "$response" | grep -q '"success":true'; then
print_success "消息发送成功"
# 提取聊天ID (从task_result.data中获取,应该是coze_chat_格式)
local chat_id=$(echo "$response" | grep -o '"chat_id":"coze_chat_[^"]*"' | head -1 | cut -d'"' -f4)
if [ -z "$chat_id" ]; then
# 备用:尝试提取任何格式的chat_id
chat_id=$(echo "$response" | grep -o '"chat_id":"[^"]*"' | head -1 | cut -d'"' -f4)
fi
if [ ! -z "$chat_id" ]; then
CHAT_ID="$chat_id"
print_info "聊天ID: $chat_id"
# 立即开始监控聊天状态,等待completed
print_info "开始监控聊天状态,等待AI处理完成..."
if wait_for_chat_completion "$chat_id"; then
print_success "聊天处理完成!"
return 0
else
print_error "聊天处理失败或超时"
return 1
fi
else
print_error "未能提取到聊天ID"
return 1
fi
else
print_error "消息发送失败"
echo "响应: $response"
echo
return 1
fi
}
# 测试获取会话信息接口
test_get_session() {
if [ -z "$SESSION_ID" ]; then
print_error "没有可用的会话ID,请先创建会话"
return 1
fi
print_info "测试获取会话信息接口..."
local response=$(curl -s -X GET "${API_BASE}/sessions/${SESSION_ID}" \
-H "${AUTH_HEADER}" \
-H "Origin: ${FRONTEND_URL}" \
-H "Referer: ${FRONTEND_URL}/tester/ai-cs")
if echo "$response" | grep -q '"success":true'; then
print_success "会话信息获取成功"
# 提取会话状态
local session_status=$(echo "$response" | grep -o '"status":"[^"]*"' | cut -d'"' -f4)
if [ ! -z "$session_status" ]; then
print_info "会话状态: $session_status"
SESSION_STATUS="$session_status"
fi
echo "响应: $response" | head -c 200
echo "..."
echo
return 0
else
print_error "会话信息获取失败"
echo "响应: $response"
echo
return 1
fi
}
# 测试获取会话聊天记录接口
test_get_session_chats() {
if [ -z "$SESSION_ID" ]; then
print_error "没有可用的会话ID,请先创建会话"
return 1
fi
print_info "测试获取会话聊天记录接口..."
local response=$(curl -s -X GET "${API_BASE}/sessions/${SESSION_ID}/chats" \
-H "${AUTH_HEADER}" \
-H "Origin: ${FRONTEND_URL}" \
-H "Referer: ${FRONTEND_URL}/tester/ai-cs")
if echo "$response" | grep -q '"success":true'; then
print_success "会话聊天记录获取成功"
# 提取聊天记录数量
local chat_count=$(echo "$response" | grep -o '"chat_id"' | wc -l | tr -d ' ')
print_info "聊天记录数量: $chat_count"
echo "响应: $response" | head -c 300
echo "..."
echo
return 0
else
print_error "会话聊天记录获取失败"
echo "响应: $response"
echo
return 1
fi
}
# 等待聊天完成的函数
wait_for_chat_completion() {
local chat_id="$1"
local max_wait_time=120 # 最大等待时间(秒)
local poll_interval=2 # 轮询间隔(秒)
local start_time=$(date +%s)
local attempt_count=0
local last_status=""
while true; do
local current_time=$(date +%s)
local elapsed_time=$((current_time - start_time))
# 检查是否超时
if [ $elapsed_time -ge $max_wait_time ]; then
print_warning "聊天状态监控超时 (超过${max_wait_time}秒)"
return 1
fi
attempt_count=$((attempt_count + 1))
# 获取聊天结果
local response=$(curl -s -X GET "${API_BASE}/chats/${chat_id}/result" \
-H "${AUTH_HEADER}" \
-H "Origin: ${FRONTEND_URL}" \
-H "Referer: ${FRONTEND_URL}/tester/ai-cs")
if echo "$response" | grep -q '"success":true'; then
# 提取当前状态
local current_status=$(echo "$response" | grep -o '"status":"[^"]*"' | cut -d'"' -f4)
# 只在状态变化时或每5次检查时打印进度
if [ "$current_status" != "$last_status" ] || [ $((attempt_count % 5)) -eq 0 ]; then
print_info "[${elapsed_time}s] 第${attempt_count}次检查 - 聊天状态: $current_status"
last_status="$current_status"
fi
# 检查状态是否为completed
if [ "$current_status" = "completed" ]; then
print_success "检测到聊天状态为 completed"
return 0
elif [ "$current_status" = "failed" ]; then
print_error "聊天状态变为 failed (耗时: ${elapsed_time}s)"
local error_msg=$(echo "$response" | grep -o '"message":"[^"]*"' | cut -d'"' -f4)
if [ ! -z "$error_msg" ]; then
print_error "错误详情: $error_msg"
fi
return 1
elif [ "$current_status" = "pending" ] || [ "$current_status" = "processing" ] || [ "$current_status" = "in_progress" ]; then
# 继续等待,状态正在进行中
:
else
print_warning "未知状态: $current_status"
fi
else
print_warning "${attempt_count}次尝试获取状态失败,重试中..."
local error_msg=$(echo "$response" | grep -o '"message":"[^"]*"' | cut -d'"' -f4)
if [ ! -z "$error_msg" ]; then
print_warning "错误信息: $error_msg"
fi
fi
# 等待后再次检查
sleep $poll_interval
done
}
# 测试获取聊天结果接口(获取最终完成的结果)
test_get_chat_result() {
if [ -z "$CHAT_ID" ]; then
print_warning "没有可用的聊天ID,跳过聊天结果测试"
return 0
fi
print_info "测试获取聊天结果接口..."
print_info "聊天ID: $CHAT_ID"
# 获取聊天结果
local response=$(curl -s -X GET "${API_BASE}/chats/${CHAT_ID}/result" \
-H "${AUTH_HEADER}" \
-H "Origin: ${FRONTEND_URL}" \
-H "Referer: ${FRONTEND_URL}/tester/ai-cs")
if echo "$response" | grep -q '"success":true'; then
local current_status=$(echo "$response" | grep -o '"status":"[^"]*"' | cut -d'"' -f4)
if [ "$current_status" = "completed" ]; then
print_success "获取完整聊天结果成功!"
# 提取并显示对话内容(解码Unicode转义序列)
local user_content_raw=$(echo "$response" | grep -o '"user_message":{[^}]*"content":"[^"]*"' | grep -o '"content":"[^"]*"' | cut -d'"' -f4)
local ai_content_raw=$(echo "$response" | grep -o '"assistant_message":{[^}]*"content":"[^"]*"' | grep -o '"content":"[^"]*"' | cut -d'"' -f4)
local user_content=$(decode_unicode "$user_content_raw")
local ai_content=$(decode_unicode "$ai_content_raw")
echo
print_success "完整聊天结果:"
echo "==========================================="
if [ ! -z "$user_content" ]; then
echo "👤 用户: $user_content"
fi
if [ ! -z "$ai_content" ]; then
echo "🤖 AI: $ai_content"
fi
echo "==========================================="
print_info "最终状态: $current_status"
print_info "聊天ID: $CHAT_ID"
echo "完整响应: $response" | head -c 300
echo "..."
echo
return 0
else
print_warning "聊天状态不是completed: $current_status"
return 1
fi
else
print_error "获取聊天结果失败"
echo "响应: $response"
echo
return 1
fi
}
# 测试健康检查接口
test_health_check() {
print_info "测试健康检查接口..."
local response=$(curl -s -X GET "${API_BASE}/health" \
-H "${AUTH_HEADER}" \
-H "Origin: ${FRONTEND_URL}")
if echo "$response" | grep -q '"success":true'; then
print_success "健康检查通过"
echo "响应: $response"
echo
return 0
else
print_error "健康检查失败"
echo "响应: $response"
echo
return 1
fi
}
# 主测试流程
main() {
echo "==========================================="
echo " Coze AI客服接口测试脚本"
echo "==========================================="
echo
# 检查服务状态
if ! check_services; then
print_error "服务检查失败,请确保后端服务正在运行"
exit 1
fi
# 执行测试
local test_count=0
local success_count=0
# 测试健康检查
((test_count++))
if test_health_check; then
((success_count++))
fi
# 测试创建会话
((test_count++))
if test_create_session; then
((success_count++))
# 测试发送消息(依赖会话创建成功,包含等待完成逻辑)
((test_count++))
if test_send_message; then
((success_count++))
# 发送消息成功后,测试获取最终聊天结果
if [ ! -z "$CHAT_ID" ]; then
((test_count++))
if test_get_chat_result; then
((success_count++))
fi
fi
fi
# 测试获取会话信息(依赖会话创建成功)
((test_count++))
if test_get_session; then
((success_count++))
# 如果会话状态是completed,获取会话聊天记录
if [ "$SESSION_STATUS" = "completed" ] || [ "$SESSION_STATUS" = "active" ]; then
((test_count++))
if test_get_session_chats; then
((success_count++))
fi
fi
fi
fi
# 输出测试结果
echo "==========================================="
echo " 测试结果汇总"
echo "==========================================="
print_info "总测试数: ${test_count}"
print_success "成功: ${success_count}"
if [ $success_count -eq $test_count ]; then
print_success "所有测试通过!🎉"
exit 0
else
local failed_count=$((test_count - success_count))
print_error "失败: ${failed_count}"
print_warning "部分测试失败,请检查服务状态和配置"
exit 1
fi
}
# 如果直接运行此脚本,执行主函数
if [ "${BASH_SOURCE[0]}" == "${0}" ]; then
main "$@"
fi