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

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

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

FrontendX发布于 2026/4/6更新于 2026/8/2263 浏览
从零搭建支持 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. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 若依框架前端字典功能原理剖析
  • Intel GPU 加速 llama.cpp:SYCL 后端配置与性能调优指南
  • 数据结构:快速排序分区逻辑与冒泡排序效率对比
  • 全球 10 大顶尖大模型团队人才分析:167 位华人入选
  • java -jar 启动原理
  • 算法刷题:找到字符串中所有字母异位词(滑动窗口解法)
  • Coze 智能体入门与构建指南
  • C++ 二叉搜索树详解:增删查改与 Key/Value 场景实现
  • ES6 核心语法全解析:避坑指南与实战代码
  • Windows 部署 OpenClaw 接入飞书机器人
  • eBay 商品数据采集实战:基于网页抓取 API 的 Python 接入方案
  • Ubuntu 20.04 云服务器安装 JDK 17 完整教程
  • Double DQN 算法详解:原理、流程与 PyTorch 实现
  • C++26 契约编程概览与工程实践
  • LLaMaFactory 基于魔搭社区免费 GPU 微调大模型实战
  • Sim2Real Gap 解析:机器人智能落地的关键挑战与方案
  • LLM Agent 规划工作流深度解析与实现
  • 法奥机器人 ROS2 环境搭建
  • 国产AI大模型名单详解:文心一言、通义千问等主流模型介绍
  • Java ResourceBundle 与 .NET RESX 国际化方案对比

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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