"use client" import { useState, useEffect } from "react" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Badge } from "@/components/ui/badge" import { Input } from "@/components/ui/input" import { Switch } from "@/components/ui/switch" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { Label } from "@/components/ui/label" import { Textarea } from "@/components/ui/textarea" import { MessageSquare, Plus, Settings, CheckCircle2, XCircle, RefreshCw, Copy, ExternalLink, Webhook, Bot, Loader2, Send, Key, Globe, Smartphone, } from "lucide-react" // 渠道接口 interface Channel { id: string name: string type: 'feishu' | 'wecom' | 'wechat' | 'api' | 'webhook' status: 'connected' | 'disconnected' | 'pending' config: { appId?: string appSecret?: string webhookUrl?: string token?: string encryptKey?: string } stats: { totalMessages: number todayMessages: number lastMessage?: string } createdAt: string enabled: boolean } // 渠道类型配置 - 包含详细配置步骤 const CHANNEL_TYPES = { feishu: { name: '飞书', icon: '🪶', color: 'bg-blue-100 text-blue-700', description: '对接飞书机器人,支持私聊和群聊', configFields: ['appId', 'appSecret', 'encryptKey', 'token'], steps: [ '1. 登录飞书开放平台 open.feishu.cn', '2. 创建企业自建应用 → 机器人', '3. 获取 App ID 和 App Secret', '4. 配置事件订阅 URL: {apiBaseUrl}/feishu/events', '5. 添加权限: im:message, im:message.group_at_msg', '6. 将机器人添加到目标群聊', '7. @机器人 即可开始对话', ], }, wecom: { name: '企业微信', icon: '💼', color: 'bg-green-100 text-green-700', description: '对接企业微信应用或机器人', configFields: ['corpId', 'agentId', 'secret', 'token', 'encodingAESKey'], steps: [ '1. 登录企业微信管理后台 work.weixin.qq.com', '2. 应用管理 → 自建应用 → 创建应用', '3. 获取 CorpID、AgentId、Secret', '4. 设置接收消息 URL: {apiBaseUrl}/wecom/callback', '5. 配置 Token 和 EncodingAESKey', '6. 开启客户联系、消息推送等权限', '7. 发消息给应用即可触发对话', ], }, wechat: { name: '微信', icon: '💬', color: 'bg-emerald-100 text-emerald-700', description: '通过存客宝对接微信私域', configFields: ['ckbApiKey', 'ckbSecret'], steps: [ '1. 登录存客宝后台 admin.cunkebao.com', '2. 系统设置 → API配置', '3. 获取 API Key 和 Secret', '4. 配置消息回调 URL: {apiBaseUrl}/ckb/webhook', '5. 在卡若AI配置存客宝凭证', '6. 微信好友发消息即可触发AI回复', ], }, api: { name: 'API接口', icon: '🔌', color: 'bg-purple-100 text-purple-700', description: '标准REST API,供第三方系统调用', configFields: ['apiKey'], steps: [ '1. 在本页面生成 API Key', '2. 调用方式: POST {apiBaseUrl}/chat', '3. Header: Authorization: Bearer {API_KEY}', '4. Body: { "message": "你的问题" }', '5. 响应: { "success": true, "response": {...} }', ], }, webhook: { name: 'Webhook', icon: '🔗', color: 'bg-orange-100 text-orange-700', description: '通用Webhook回调接口', configFields: ['webhookUrl', 'secret'], steps: [ '1. 配置接收 Webhook 的目标 URL', '2. 设置签名密钥 (可选)', '3. 神射手会在以下事件时推送:', ' - 新用户画像生成', ' - 流量包创建完成', ' - 报告生成完成', '4. 推送格式: { "event": "...", "data": {...} }', ], }, } // 预定义渠道 const DEFAULT_CHANNELS: Channel[] = [ { id: 'ch_feishu_1', name: '卡若AI飞书机器人', type: 'feishu', status: 'connected', config: { appId: 'cli_a6xxx', appSecret: '********', token: 'karuo_token', }, stats: { totalMessages: 12580, todayMessages: 156, lastMessage: '5分钟前', }, createdAt: '2024-01-15', enabled: true, }, { id: 'ch_wecom_1', name: '企业微信-神射手助手', type: 'wecom', status: 'connected', config: { appId: 'ww_xxx', }, stats: { totalMessages: 8920, todayMessages: 89, lastMessage: '12分钟前', }, createdAt: '2024-02-01', enabled: true, }, { id: 'ch_wechat_1', name: '存客宝微信通道', type: 'wechat', status: 'connected', config: {}, stats: { totalMessages: 45600, todayMessages: 320, lastMessage: '1分钟前', }, createdAt: '2024-01-01', enabled: true, }, { id: 'ch_api_1', name: '神射手API', type: 'api', status: 'connected', config: { apiKey: 'sk-archer-xxx', }, stats: { totalMessages: 156000, todayMessages: 2340, lastMessage: '刚刚', }, createdAt: '2024-01-01', enabled: true, }, ] export default function ChannelsPage() { const [channels, setChannels] = useState(DEFAULT_CHANNELS) const [loading, setLoading] = useState(false) const [showAddDialog, setShowAddDialog] = useState(false) const [showConfigDialog, setShowConfigDialog] = useState(false) const [selectedChannel, setSelectedChannel] = useState(null) const [newChannelType, setNewChannelType] = useState('feishu') const [testLoading, setTestLoading] = useState(null) // API端点基础URL - 动态获取当前域名 const [apiBaseUrl, setApiBaseUrl] = useState('') useEffect(() => { // 获取当前部署的域名 const host = typeof window !== 'undefined' ? window.location.origin : '' setApiBaseUrl(`${host}/api/shensheshou`) }, []) const formatNumber = (num: number): string => { if (num >= 1000000) return `${(num / 1000000).toFixed(1)}M` if (num >= 1000) return `${(num / 1000).toFixed(1)}K` return num.toLocaleString() } // 测试连接 const testConnection = async (channelId: string) => { setTestLoading(channelId) await new Promise(r => setTimeout(r, 2000)) setTestLoading(null) } // 切换启用状态 const toggleChannel = (channelId: string) => { setChannels(channels.map(ch => ch.id === channelId ? { ...ch, enabled: !ch.enabled } : ch )) } // 复制到剪贴板 const copyToClipboard = (text: string) => { navigator.clipboard.writeText(text) } const getStatusBadge = (status: string) => { switch (status) { case 'connected': return 已连接 case 'disconnected': return 未连接 default: return 配置中 } } return (
{/* 顶部标题 */}

渠道配置

配置飞书、企微、微信等渠道,让AI助手可通过多渠道访问

{/* 统计卡片 */}

接入渠道

{channels.length}

已连接

{channels.filter(c => c.status === 'connected').length}

今日消息

{formatNumber(channels.reduce((sum, c) => sum + c.stats.todayMessages, 0))}

累计消息

{formatNumber(channels.reduce((sum, c) => sum + c.stats.totalMessages, 0))}

{/* API接入说明 */}

🔗 API接入端点

第三方系统可通过以下接口与神射手Skill通信

POST {apiBaseUrl}/chat 智能对话
POST {apiBaseUrl}/query 用户查询
{/* 渠道列表 */}
{channels.map(channel => { const typeConfig = CHANNEL_TYPES[channel.type] return (
{typeConfig.icon}

{channel.name}

{typeConfig.name} {getStatusBadge(channel.status)}

{typeConfig.description}

今日: {formatNumber(channel.stats.todayMessages)} 条 累计: {formatNumber(channel.stats.totalMessages)} 条 {channel.stats.lastMessage && ( 最近消息: {channel.stats.lastMessage} )}
toggleChannel(channel.id)} />
) })}
{/* 添加渠道弹窗 */} 添加渠道 选择要接入的渠道类型
{Object.entries(CHANNEL_TYPES).map(([key, config]) => (
setNewChannelType(key as keyof typeof CHANNEL_TYPES)} className={`p-4 rounded-xl border-2 cursor-pointer transition-all ${ newChannelType === key ? 'border-blue-500 bg-blue-50' : 'border-gray-200 hover:border-gray-300' }`} >
{config.icon}

{config.name}

{config.description}

))}
{/* 配置弹窗 */} {selectedChannel?.id.includes('new') ? '配置新渠道' : '编辑渠道配置'} {selectedChannel && CHANNEL_TYPES[selectedChannel.type]?.description} {selectedChannel && (
{/* 配置步骤指南 */}

📋 {CHANNEL_TYPES[selectedChannel.type].name} 配置步骤

    {(CHANNEL_TYPES[selectedChannel.type] as any).steps?.map((step: string, i: number) => (
  1. {step.replace('{apiBaseUrl}', apiBaseUrl || 'https://your-domain.com/api/shensheshou')}
  2. ))}
{selectedChannel.type === 'feishu' && ( <>

📋 飞书配置步骤

  1. 在飞书开放平台创建应用
  2. 添加机器人能力并设置权限
  3. 配置事件订阅回调地址
  4. 填入上述配置信息
)} {selectedChannel.type === 'wecom' && ( <>
)} {selectedChannel.type === 'wechat' && ( <>

💡 微信通道说明

微信私域通过存客宝SDK接入,需要在存客宝平台配置API密钥

)} {selectedChannel.type === 'api' && ( <>
{`curl -X POST ${apiBaseUrl}/chat \\
  -H "Authorization: Bearer sk-archer-xxx" \\
  -H "Content-Type: application/json" \\
  -d '{"message": "查询用户 13800138000"}'`}
                      
)} {selectedChannel.type === 'webhook' && ( <>
)}
)}
) }