跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

从零搭建支持 ChatGPT 等多平台的 GEO 监控系统

综述由AI生成介绍如何使用 Python 构建通用的 GEO(生成式引擎优化)多平台监控系统。系统架构包含任务调度、平台查询及结果分析模块,支持 ChatGPT、豆包、Kimi、文心一言等多个大模型平台。通过定义基类实现平台解耦,集成定时任务自动执行检查,并生成结构化报告与 JSON 数据留存。该方法解决了单一平台服务变动导致的监控失效问题,提升了品牌在 AI 搜索结果中的可见性监测效率。

FrontendX发布于 2026/4/6更新于 2026/5/2228 浏览
从零搭建支持 ChatGPT 等多平台的 GEO 监控系统

从零搭建支持 ChatGPT 等多平台的 GEO 监控系统

背景

近期部分 AI 服务调整,导致原有监控脚本失效。痛定思痛,决定写一套通用的 GEO 多平台监控方案。

本文分享完整代码,支持:ChatGPT、豆包、Kimi、文心一言、通义千问。


系统架构

┌─────────────────────────────────────────────────────────┐
│                   GEO 多平台监控系统                     │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  ┌───────────┐  ┌───────────┐  ┌───────────┐           │
│  │ 任务调度  │→ │ 平台查询  │→ │ 结果分析  │           │
│  └───────────┘  └───────────┘  └───────────┘           │
│      ↑    ↓    ↓                                         │
│      └──── 告警通知 ←────── 报告生成 ←──────             │
│                                                         │
│  支持平台:                                              │
│  ✅ ChatGPT  ✅ 豆包  ✅ Kimi                           │
│  ✅ 文心一言  ✅ 通义千问                               │
└─────────────────────────────────────────────────────────┘

核心代码实现

1. 平台基类
from abc import ABC, abstractmethod
from dataclasses import dataclass
from typing import List, Optional, Dict
from datetime import datetime
import time
import random

@dataclass
class GEOResult:
    """GEO 查询结果"""
    platform: str
    query: str
    brand: str
    mentioned: bool
    position: int
    context: str
    timestamp: str
    response_time_ms: float
    error: Optional[str] = 

 ():
    
     ():
        .name = name
        .api_key = api_key
        .base_delay =   


     () -> :
        
        


     () -> :
        
        

     () -> GEOResult:
        
        start_time = time.time()
        :
            
            response = .query(search_query)
            
            brand_info = .extract_brand_info(response, brand)
            response_time = (time.time() - start_time) * 
             GEOResult(
                platform=.name,
                query=search_query,
                brand=brand,
                mentioned=brand_info[],
                position=brand_info[],
                context=brand_info[],
                timestamp=datetime.now().isoformat(),
                response_time_ms=response_time
            )
         Exception  e:
            response_time = (time.time() - start_time) * 
             GEOResult(
                platform=.name,
                query=search_query,
                brand=brand,
                mentioned=,
                position=,
                context=,
                timestamp=datetime.now().isoformat(),
                response_time_ms=response_time,
                error=(e)
            )
None
class
BasePlatform
ABC
"""AI 平台基类"""
def
__init__
self, name: str, api_key: str = None
self
self
self
1.0
# 基础延迟 (秒)
@abstractmethod
def
query
self, search_query: str
str
"""执行查询,返回 AI 响应文本"""
pass
@abstractmethod
def
extract_brand_info
self, response: str, brand: str
Dict
"""从响应中提取品牌相关信息"""
pass
def
check_brand
self, search_query: str, brand: str
"""检查品牌在 AI 响应中的出现情况"""
try
# 执行查询
self
# 提取品牌信息
self
1000
return
self
"mentioned"
"position"
"context"
except
as
1000
return
self
False
0
""
str
2. 具体平台实现
ChatGPT 平台
import os
import requests

class ChatGPTPlatform(BasePlatform):
    """ChatGPT 平台"""
    def __init__(self, api_key: str = None):
        super().__init__("ChatGPT", api_key or os.getenv("OPENAI_API_KEY"))
        self.api_base = "https://api.openai.com/v1"
        self.model = "gpt-4"

    def query(self, search_query: str) -> str:
        """查询 ChatGPT"""
        url = f"{self.api_base}/chat/completions"
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        payload = {
            "model": self.model,
            "messages": [{"role": "user", "content": f"作为一个专业的 AI 助手,请回答:{search_query}"}],
            "temperature": 0.7,
            "max_tokens": 500
        }
        response = requests.post(url, headers=headers, json=payload, timeout=30)
        response.raise_for_status()
        result = response.json()
        return result["choices"][0]["message"]["content"]

    def extract_brand_info(self, response: str, brand: str) -> Dict:
        """提取品牌信息"""
        mentioned = brand in response
        if not mentioned:
            return {"mentioned": False, "position": 0, "context": ""}
        # 查找品牌在响应中的位置
        position = response.index(brand)
        # 提取上下文 (前后各 50 字符)
        start = max(0, position - 50)
        end = min(len(response), position + len(brand) + 50)
        context = response[start:end]
        return {"mentioned": True, "position": 1, "context": f"...{context}..."}
豆包平台
class DoubaoPlatform(BasePlatform):
    """豆包平台 (字节跳动)"""
    def __init__(self, api_key: str = None):
        super().__init__("豆包", api_key or os.getenv("DOUBAO_API_KEY"))
        self.api_base = "https://ark.cn-beijing.volces.com/api/v3"
        self.model = "doubao-seed-250615"

    def query(self, search_query: str) -> str:
        """查询豆包"""
        url = f"{self.api_base}/chat/completions"
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        payload = {
            "model": self.model,
            "messages": [{"role": "user", "content": search_query}]
        }
        response = requests.post(url, headers=headers, json=payload, timeout=30)
        response.raise_for_status()
        result = response.json()
        return result["choices"][0]["message"]["content"]

    def extract_brand_info(self, response: str, brand: str) -> Dict:
        """提取品牌信息"""
        mentioned = brand in response
        if not mentioned:
            return {"mentioned": False, "position": 0, "context": ""}
        position = response.index(brand)
        start = max(0, position - 50)
        end = min(len(response), position + len(brand) + 50)
        return {"mentioned": True, "position": 1, "context": f"...{response[start:end]}..."}
Kimi 平台
class KimiPlatform(BasePlatform):
    """Kimi 平台 (月之暗面)"""
    def __init__(self, api_key: str = None):
        super().__init__("Kimi", api_key or os.getenv("KIMI_API_KEY"))
        self.api_base = "https://api.moonshot.cn/v1"
        self.model = "kimi-flash"

    def query(self, search_query: str) -> str:
        """查询 Kimi"""
        url = f"{self.api_base}/chat/completions"
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        payload = {
            "model": self.model,
            "messages": [{"role": "user", "content": search_query}]
        }
        response = requests.post(url, headers=headers, json=payload, timeout=30)
        response.raise_for_status()
        result = response.json()
        return result["choices"][0]["message"]["content"]

    def extract_brand_info(self, response: str, brand: str) -> Dict:
        """提取品牌信息"""
        mentioned = brand in response
        if not mentioned:
            return {"mentioned": False, "position": 0, "context": ""}
        return {"mentioned": True, "position": 1, "context": f"...{response[max(0, response.index(brand)-50):response.index(brand)+len(brand)+50]}..."}
3. 多平台监控器
from typing import List, Dict
import json

class GEOMultiPlatformMonitor:
    """GEO 多平台监控器"""
    def __init__(self, brand: str):
        self.brand = brand
        self.platforms: List[BasePlatform] = []
        self.results: List[GEOResult] = []

    def add_platform(self, platform: BasePlatform):
        """添加监控平台"""
        self.platforms.append(platform)

    def check_all_platforms(self, queries: List[str]) -> List[GEOResult]:
        """检查所有平台"""
        all_results = []
        for platform in self.platforms:
            for query in queries:
                print(f"正在检查 {platform.name} - {query}...")
                result = platform.check_brand(query, self.brand)
                all_results.append(result)
                # 添加延迟,避免请求过快
                time.sleep(random.uniform(1.0, 2.0))
        self.results = all_results
        return all_results

    def generate_report(self) -> str:
        """生成监控报告"""
        if not self.results:
            return "暂无监控数据"
        report = f"""# GEO 多平台监控报告
生成时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
监控品牌:{self.brand}
---
## 📊 总体概览
"""
        total = len(self.results)
        mentioned = sum(1 for r in self.results if r.mentioned)
        success = sum(1 for r in self.results if not r.error)
        report += f"- 总查询次数:{total}\n"
        report += f"- 品牌出现次数:{mentioned}\n"
        report += f"- **整体可见性:{mentioned/total*100:.1f}%**\n"
        report += f"- 查询成功率:{success/total*100:.1f}%\n\n"

        # 分平台统计
        report += "## 🏠 分平台数据\n\n"
        for platform_name in set(r.platform for r in self.results):
            platform_results = [r for r in self.results if r.platform == platform_name]
            p_mentioned = sum(1 for r in platform_results if r.mentioned)
            p_total = len(platform_results)
            p_success = sum(1 for r in platform_results if not r.error)
            emoji = "✅" if p_mentioned > 0 else "❌"
            report += f"### {emoji}{platform_name}\n"
            report += f"- 查询次数:{p_total}\n"
            report += f"- 品牌出现:{p_mentioned}次\n"
            report += f"- 可见性:{p_mentioned/p_total*100:.1f}%\n"
            report += f"- 成功率:{p_success/p_total*100:.1f}%\n\n"

        # 错误统计
        errors = [r for r in self.results if r.error]
        if errors:
            report += "## ⚠️ 错误统计\n\n"
            for r in errors:
                report += f"- {r.platform} - {r.query}: {r.error}\n"
        return report

    def save_to_json(self, filename: str = None):
        """保存结果到 JSON"""
        if not filename:
            filename = f"geo_report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json"
        data = [
            {
                "platform": r.platform,
                "query": r.query,
                "brand_mentioned": r.mentioned,
                "position": r.position,
                "context": r.context,
                "timestamp": r.timestamp,
                "response_time_ms": r.response_time_ms,
                "error": r.error
            }
            for r in self.results
        ]
        with open(filename, "w", encoding="utf-8") as f:
            json.dump(data, f, ensure_ascii=False, indent=2)
        print(f"报告已保存:{filename}")
4. 定时任务配置
import schedule

def daily_geo_check():
    """每日 GEO 检查任务"""
    monitor = GEOMultiPlatformMonitor("你的品牌")
    # 添加平台
    monitor.add_platform(ChatGPTPlatform())
    monitor.add_platform(DoubaoPlatform())
    monitor.add_platform(KimiPlatform())
    # 设置查询词
    queries = ["推荐一个 XX 工具", "XX 服务商哪家好", "怎么选择 XX 供应商", "XX 工具排行榜"]
    # 执行检查
    results = monitor.check_all_platforms(queries)
    # 生成报告
    report = monitor.generate_report()
    print(report)
    # 保存结果
    monitor.save_to_json()
    # 配置定时任务
    schedule.every().day.at("09:00").do(daily_geo_check)
    print("GEO 多平台监控系统已启动,每天 9:00 自动检查")
    # 运行
    while True:
        schedule.run_pending()
        time.sleep(60)

使用方法

1. 安装依赖
pip install requests schedule
2. 配置 API Key
export OPENAI_API_KEY="your-openai-key"
export DOUBAO_API_KEY="your-doubao-key"
export KIMI_API_KEY="your-kimi-key"
3. 修改品牌名和查询词
# 修改监控的品牌
monitor = GEOMultiPlatformMonitor("你的品牌")
# 修改查询词
queries = ["推荐一个 XX 工具", "XX 服务商哪家好"]
4. 运行
python geo_monitor.py

效果

用这套系统监控 GEO:

指标之前之后
监控平台1 个4 个 +
手动操作30 分钟0 分钟
数据留存无JSON 永久保存
告警机制无可配置

总结

从单平台监控,变成多平台监控。

核心改进:

  • 平台解耦,易于扩展
  • 数据结构化,便于分析
  • 定时任务,自动运行
  • 报告生成,直观展示

完整代码可以直接使用,只需要配置 API Key 即可。

目录

  1. 从零搭建支持 ChatGPT 等多平台的 GEO 监控系统
  2. 背景
  3. 系统架构
  4. 核心代码实现
  5. 1. 平台基类
  6. 2. 具体平台实现
  7. ChatGPT 平台
  8. 豆包平台
  9. Kimi 平台
  10. 3. 多平台监控器
  11. 📊 总体概览
  12. 4. 定时任务配置
  13. 使用方法
  14. 1. 安装依赖
  15. 2. 配置 API Key
  16. 3. 修改品牌名和查询词
  17. 修改监控的品牌
  18. 修改查询词
  19. 4. 运行
  20. 效果
  21. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 基于 SpringBoot 的在线学堂考试系统设计与实现
  • Spring Web MVC 核心概念与实战指南
  • ESP32 小智 AI 机器人开发:语音唤醒与云端大模型对接
  • C++与Linux 文件操作:系统接口 open write read 详解
  • Python 爬虫入门学习路径与核心技术详解
  • Java CountDownLatch 核心原理、API 详解与实战应用
  • Java Map 常用方法与核心实现类深度解析
  • ToDesk、顺网云与海马云部署 DeepSeek 大模型实测对比
  • AIGC-Fooocus部署实践:从本地手动配置到云端一键启用的深度剖析
  • Git Worktree 原理与实战:解析 Cursor 2.0 多 Agent 并行模式
  • Android JNI 中 C++ 高效打印 Logcat 日志的配置与优化
  • OpenClaw QQ 机器人接入指南
  • AI 智能编码工具深度测评:从 GitHub Copilot 到国产新秀
  • 前端 CI/CD 流程与自动化部署实践
  • 本地 CPU 环境部署 ChatGLM-6B 大模型与量化技术实践
  • 机器人灵巧操作新突破:学习系鞋带与挂衣服
  • Xilinx Vivado 付费 IP 核 License 状态解读与获取
  • Ubuntu 20.04 云服务器手动安装 Oracle JDK 17 指南
  • AI Agent Skills 资源合集:支持 Cursor、Claude Code 与 Copilot
  • Python、PyTorch、CUDA 与显卡版本对应关系速查表

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online