#!/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