// @ts-nocheck import React, { useState, useEffect, useCallback } from 'react'; import { imUserAPI } from '@/api'; const WechatBot: React.FC = () => { const [loading, setLoading] = useState(false); const [status, setStatus] = useState({ connected: false, configured: false }); const [qrcode, setQrcode] = useState(null); const [polling, setPolling] = useState(false); const [reconnecting, setReconnecting] = useState(false); const [toast, setToast] = useState<{ msg: string; type: 'success' | 'error' } | null>(null); const showToast = (msg: string, type: 'success' | 'error' = 'success') => { setToast({ msg, type }); setTimeout(() => setToast(null), 3000); }; // 加载当前用户的连接状态 const loadStatus = useCallback(async () => { try { const res = await imUserAPI.getStatus(); if ((res as any)?.success) setStatus(res.data || { connected: false, configured: false }); } catch (e) { // 静默失败 } }, []); useEffect(() => { loadStatus(); }, [loadStatus]); // 获取扫码二维码(iLink 协议免 AppID) const handleQrcode = async () => { setLoading(true); try { const res = await imUserAPI.qrcode(); if ((res as any)?.success && (res as any).data) { setQrcode((res as any).data); setPolling(true); showToast('二维码已生成,请用手机微信扫码'); } else { showToast((res as any).error || '获取二维码失败', 'error'); } } catch (e) { showToast('获取二维码失败', 'error'); } finally { setLoading(false); } }; // 轮询扫码状态 const handlePoll = useCallback(async () => { if (!qrcode?.qrcode) return; try { const res = await imUserAPI.qrcodeStatus(qrcode.qrcode); if ((res as any)?.success && (res as any).data) { const d = (res as any).data; if (d.status === 'confirmed' || d.connected) { setPolling(false); setReconnecting(false); setStatus({ ...status, connected: true, configured: true }); showToast('个人微信已连接!'); loadStatus(); } else if (d.status === 'expired') { setPolling(false); showToast('二维码已过期,请重新获取', 'error'); } } } catch (e) { // 忽略轮询错误 } }, [qrcode, status, loadStatus]); useEffect(() => { if (polling && qrcode?.qrcode) { const t = setInterval(() => handlePoll(), 3000); return () => clearInterval(t); } }, [polling, qrcode, handlePoll]); // 断开连接 const handleDisconnect = async () => { try { await imUserAPI.disconnect(); setPolling(false); setQrcode(null); setReconnecting(false); setStatus({ connected: false, configured: false }); showToast('已断开个人微信连接'); loadStatus(); } catch (e) { showToast('断开失败', 'error'); } }; const formatTime = (t: string) => (t ? new Date(t).toLocaleString('zh-CN') : '-'); return (
{/* Header */}

我的微信Bot

绑定你自己的个人微信,由七虎AI 大脑自动应答。基于腾讯官方 iLink 协议,扫码授权即可,无需任何开放平台凭证。

{/* Toast */} {toast && (
{toast.msg}
)} {/* 状态条 */}

个人微信(iLink 协议)

直接对接腾讯官方 iLink Bot HTTP API,扫码授权后由七虎AI 自动回复。

{status.connected ? '● 已连接' : status.status === 'expired' ? '⚠ 会话已过期' : status.configured ? '○ 已配置' : '○ 未绑定'}
{/* 扫码绑定 */}
{status.status === 'expired' && (
⚠ 微信会话已失效:检测到与微信的连接已过期(通常是服务更新/重启后导致),消息无法再送达。请点击下方「获取扫码二维码」重新扫码授权即可恢复,历史对话记录仍保留。
)}

扫码授权绑定

{status.connected && !reconnecting ? (
已绑定,你的个人微信正在自动收发消息并由七虎AI 应答。
若发现消息收不到,可点此重新扫码以重建与微信的会话。
) : !qrcode ? (
点击「获取扫码二维码」,使用手机微信扫描二维码并确认授权,即可将你的个人微信接入七虎AI。整个过程无需申请任何开放平台凭证。
) : (
{qrcode.qrcode_img ? ( 微信扫码 ) : (
二维码图片生成失败,请点击此处在新标签页打开。
)}
{polling ? '等待扫码中…(每 3 秒自动检测一次)' : '已停止轮询'}
{polling && ( )}
)}
{/* 已连接信息 */} {status.connected && (

连接信息

)} {/* 说明 */}

接入说明

  • 每个账号独立绑定自己的个人微信,数据严格按账号隔离,互不影响
  • 个人微信通过腾讯官方 iLink Bot HTTP API(微信 ClawBot 插件)接入,消息经七虎AI 大脑生成回复
  • 采用官方合法协议,无需 Hook / 逆向,封号风险远低于历史方案,但仍请遵守微信平台规范
  • 消息收发基于长轮询(getupdates)+ 官方 sendmessage,回复自动关联对话窗口(context_token)
); }; const DetailItem: React.FC<{ label: string; value: any }> = ({ label, value }) => (
{label}
{value || '-'}
); const primaryBtnStyle: React.CSSProperties = { padding: '8px 20px', background: '#5B5FED', border: 'none', borderRadius: '6px', color: '#fff', fontSize: '14px', fontWeight: 500, cursor: 'pointer', }; const secondaryBtnStyle: React.CSSProperties = { padding: '8px 20px', background: '#F0F2F8', border: '1px solid #F0F2F8', borderRadius: '6px', color: '#1A1F36', fontSize: '14px', fontWeight: 500, cursor: 'pointer', }; export default WechatBot;