Skill: ylbwjf/tender-analysis-system (version 1.0.0)

# 标书分析助手 - Tender Analysis Assistant ## 系统概述 自动化抓取金融、政府、运营商、交通、大型央企等领域的招标信息，智能分析标书内容，按维度生成结构化分析报告。 ## 核心功能模块 ### 1. 数据采集层 #### 监控的招标网站类型 | 类型 | 代表网站 | 更新频率 | |------|----------|----------| | **政府采购** | 中国政府采购网、各省市政府采购网 | 每小时 | | **金融招标** | 中国招标投标公共服务平台、各大银行采购平台 | 每小时 | | **运营商** | 中国移动/联通/电信采购与招标网 | 每小时 | | **交通基建** | 中国招标投标公共服务平台、各省交通厅 | 每小时 | | **央企采购** | 央企阳光采购平台、各央企电子招标平台 | 每小时 | | **综合平台** | 千里马、剑鱼标讯、比地招标网 | 每小时 | #### 数据抓取策略 - 使用 RSS/API 优先，网页抓取兜底 - 关键词过滤：IT、信息化、数字化、系统集成、软件开发、硬件采购、服务外包 - 金额阈值：根据类型设定（如政府>100万，金融>500万等） - 去重机制：基于项目编号+标题哈希 ### 2. 智能分析层 #### 分析维度 **A. 合同维度** - 合同类型（固定总价/单价/成本加酬金） - 合同期限与续约条款 - 违约责任与赔偿机制 - 知识产权归属 - 保密条款强度 **B. 技术参数维度** - 核心技术要求提取 - 性能指标量化分析 - 兼容性/扩展性要求 - 安全合规要求（等保、密评等） - 与行业标准的符合度 **C. 付款方式维度** - 付款节奏（预付款/进度款/验收款/质保金比例） - 付款条件与里程碑 - 质保金比例与释放条件 - 逾期付款条款 - 资金占用成本估算 **D. 评标办法维度** - 评标方法（综合评分法/最低评标价法） - 分值分布（技术/商务/价格权重） - 资格门槛要求 - 加分项与扣分项 - 废标条款风险点 **E. 其他关键维度** - 交付周期合理性 - 售后服务要求 - 培训与文档要求 - 投标人资质门槛 - 历史中标价格参考 ### 3. 报告生成层 #### 报告模板 ```markdown # 标书分析报告 - [项目名称] ## 📋 基本信息 - 项目编号： - 招标单位： - 预算金额： - 投标截止： - 信息来源： ## 💰 付款方式分析 | 阶段 | 比例 | 条件 | 风险评估 | |------|------|------|----------| | 预付款 | | | | | 进度款 | | | | | 验收款 | | | | | 质保金 | | | | **资金占用成本估算**： **付款风险评级**：⭐⭐⭐⭐⭐ ## 📊 评标办法分析 - 评标方法： - 技术分权重： - 商务分权重： - 价格分权重： - 关键加分项： - 废标风险点： ## ⚙️ 技术参数要点 - 核心技术要求： - 性能指标： - 合规要求： - 技术难度评估： ## 📄 合同条款风险 - 高风险条款： - 建议关注点： ## 🎯 投标建议 - 机会评估： - 风险提示： - 策略建议： ``` ### 4. 定时汇报机制 #### 汇报频率 - **实时推送**：高价值项目（金额>1000万）立即推送 - **每小时汇总**：一般项目每小时生成简报 - **重点汇报**：每1-2小时向用户汇报进展 #### 汇报内容 1. **新增标书数量**（按类型统计） 2. **高价值项目TOP5**（金额、行业、截止日期） 3. **紧急项目提醒**（24-48小时内截止） 4. **重点分析摘要**（已完成的深度分析报告） ## 技术架构 ``` ┌─────────────────────────────────────────────────────────┐ │ 标书分析助手系统 │ ├─────────────────────────────────────────────────────────┤ │ 数据采集层 │ 智能分析层 │ 报告生成层 │ 推送层 │ ├─────────────┼─────────────┼─────────────┼───────────┤ │ • RSS订阅 │ • LLM解析 │ • 模板渲染 │ • 飞书 │ │ • API调用 │ • 规则引擎 │ • 数据聚合 │ • 邮件 │ │ • 网页抓取 │ • 知识库 │ • 可视化 │ • 微信 │ │ • 去重存储 │ • 风险评分 │ • 导出PDF │ • 钉钉 │ └─────────────┴─────────────┴─────────────┴───────────┘ ``` ## 数据源配置 ### 推荐监控的网站列表 #### 政府采购类 1. 中国政府采购网 (ccgp.gov.cn) 2. 中国招标投标公共服务平台 (cebpubservice.com) 3. 各省级政府采购网 #### 金融类 1. 各大银行采购平台（工行、农行、中行、建行、招行等） 2. 保险公司采购平台 3. 证券公司采购公告 #### 运营商类 1. 中国移动采购与招标网 (b2b.10086.cn) 2. 中国联通采购与招标网 (chinaunicombidding.cn) 3. 中国电信阳光采购网 (chinatelecom.com.cn) #### 交通类 1. 中国招标投标公共服务平台 2. 各省交通运输厅招标公告 3. 铁路局采购平台 4. 机场集团采购平台 #### 央企类 1. 央企阳光采购平台 2. 国家电网电子商务平台 3. 南方电网采购平台 4. 中石油/中石化采购平台 #### 第三方平台（付费/免费） 1. 千里马招标网 2. 剑鱼标讯 3. 比地招标网 4. 乙方宝 ## 实施建议 ### 阶段一：基础搭建（1-2天） 1. 配置数据源RSS/API 2. 搭建基础抓取框架 3. 实现去重存储 ### 阶段二：分析能力（2-3天） 1. 接入LLM进行标书解析 2. 构建分析维度规则 3. 生成结构化报告 ### 阶段三：自动化（1-2天） 1. 配置定时任务 2. 搭建推送机制 3. 优化汇报模板 ### 阶段四：优化迭代（持续） 1. 根据反馈调整分析维度 2. 扩充数据源 3. 优化风险评分模型 ## 风险提示 1. **数据合规**：遵守各网站的robots协议和使用条款 2. **抓取频率**：避免过高频率导致IP被封 3. **数据准确性**：自动分析结果需人工复核 4. **时效性**：招标信息变化快，需及时更新 ## 预期产出 每小时自动产出： - 新增标书清单（按行业分类） - 高价值项目TOP榜 - 重点标书深度分析报告 - 紧急截止提醒

path: README.md
content: # 标书分析助手

自动化抓取金融、政府、运营商、交通、大型央企等领域的招标信息，智能分析标书内容，按维度生成结构化分析报告。

## 功能特性

### 📊 监控范围
- **政府采购** - 中国政府采购网、各省市政府采购网
- **金融招标** - 各大银行、保险、证券采购平台
- **运营商** - 移动、联通、电信采购与招标网
- **交通基建** - 交通运输厅、铁路局、机场集团
- **大型央企** - 国家电网、中石油、中石化等

### 🔍 分析维度
1. **合同维度** - 合同类型、期限、违约责任、知识产权、保密条款
2. **付款方式** - 付款节奏、预付款比例、质保金、资金占用成本
3. **技术参数** - 核心要求、性能指标、合规要求（等保/密评）
4. **评标办法** - 评标方法、分值权重、资格门槛、废标风险
5. **其他** - 交付周期、售后服务、培训要求、资质门槛

### ⏰ 汇报机制
- **每小时** - 自动抓取更新
- **每2小时** - 重点汇报（高价值项目、紧急截止提醒）
- **实时推送** - 金额>1000万项目立即推送

## 快速开始

### 1. 安装依赖
```bash
cd tender-analysis-system
pip install pyyaml requests
```

### 2. 配置数据源
编辑 `config.yaml`，配置需要监控的网站和推送方式（飞书/邮件）。

### 3. 运行测试
```bash
./run.sh
```

### 4. 设置定时任务
```bash
./cron_setup.sh
```

## 项目结构

```
tender-analysis-system/
├── config.yaml          # 配置文件
├── tender_analyzer.py   # 主程序
├── run.sh              # 运行脚本
├── cron_setup.sh       # 定时任务设置
├── data/               # 数据存储
│   └── tenders.db      # SQLite数据库
├── reports/            # 生成的报告
└── logs/               # 运行日志
```

## 配置说明

### 数据源配置
```yaml
data_sources:
  - name: "中国政府采购网"
    url: "http://www.ccgp.gov.cn/"
    type: "rss"  # rss/api/web
    category: "政府"
    keywords: ["信息化", "数字化", "系统集成"]
    min_amount: 1000000  # 最低金额（元）
    enabled: true
```

### 推送配置
```yaml
notifications:
  feishu:
    enabled: true
    webhook: "https://open.feishu.cn/..."

  email:
    enabled: true
    smtp_server: "smtp.126.com"
    username: "[REDACTED_SECRET]"
    to: "[REDACTED_SECRET]"
```

## 开发计划

### 阶段一：基础功能 ✅
- [x] 项目框架搭建
- [x] 数据存储设计
- [x] 基础分析维度定义

### 阶段二：数据采集 🔄
- [ ] RSS源接入
- [ ] API接口对接
- [ ] 网页抓取实现
- [ ] 去重机制

### 阶段三：智能分析 🔄
- [ ] LLM接入（GPT/Claude）
- [ ] 合同条款解析
- [ ] 付款方式提取
- [ ] 评标办法分析
- [ ] 风险评分模型

### 阶段四：自动化 🔄
- [ ] 定时任务配置
- [ ] 飞书推送
- [ ] 邮件推送
- [ ] 报告模板优化

## 注意事项

1. **合规性** - 遵守各网站的robots协议和使用条款
2. **频率控制** - 避免过高频率导致IP被封
3. **数据验证** - 自动分析结果需人工复核
4. **时效性** - 招标信息变化快，及时关注更新

## 贡献

欢迎提交Issue和PR，共同完善这个标书分析助手！

## License

MIT


path: config.yaml
content: # 标书分析助手配置文件

# 监控的网站配置
data_sources:
  # 政府采购类
  - name: "中国政府采购网"
    url: "http://www.ccgp.gov.cn/"
    type: "rss"
    category: "政府"
    keywords: ["信息化", "数字化", "系统集成", "软件开发", "硬件", "服务"]
    min_amount: 1000000  # 100万
    enabled: true

  - name: "中国招标投标公共服务平台"
    url: "https://www.cebpubservice.com/"
    type: "api"
    category: "综合"
    keywords: ["金融", "运营商", "交通", "央企", "信息化"]
    min_amount: 5000000  # 500万
    enabled: true

  # 运营商类
  - name: "中国移动采购与招标"
    url: "https://b2b.10086.cn/"
    type: "web"
    category: "运营商"
    keywords: ["IT", "系统", "设备", "服务"]
    min_amount: 10000000  # 1000万
    enabled: true

  - name: "中国联通采购"
    url: "https://www.chinaunicombidding.cn/"
    type: "web"
    category: "运营商"
    keywords: ["IT", "系统", "设备", "服务"]
    min_amount: 10000000
    enabled: true

  - name: "中国电信阳光采购"
    url: "https://caigou.chinatelecom.com.cn/"
    type: "web"
    category: "运营商"
    keywords: ["IT", "系统", "设备", "服务"]
    min_amount: 10000000
    enabled: true

  # 金融类
  - name: "银行采购平台"
    type: "aggregate"
    category: "金融"
    keywords: ["金融科技", "IT", "系统", "软件", "硬件"]
    min_amount: 5000000
    enabled: true

  # 央企类
  - name: "国家电网"
    url: "https://ecp.sgcc.com.cn/"
    type: "web"
    category: "央企"
    keywords: ["信息化", "数字化", "系统", "设备"]
    min_amount: 10000000
    enabled: true

# 分析维度配置
analysis_dimensions:
  contract:
    enabled: true
    fields:
      - "合同类型"
      - "合同期限"
      - "违约责任"
      - "知识产权"
      - "保密条款"

  payment:
    enabled: true
    fields:
      - "付款节奏"
      - "预付款比例"
      - "进度款条件"
      - "质保金比例"
      - "逾期条款"

  technical:
    enabled: true
    fields:
      - "核心技术要求"
      - "性能指标"
      - "兼容性要求"
      - "安全合规"
      - "技术标准"

  evaluation:
    enabled: true
    fields:
      - "评标方法"
      - "分值权重"
      - "资格门槛"
      - "加分项"
      - "废标条款"

  other:
    enabled: true
    fields:
      - "交付周期"
      - "售后服务"
      - "培训要求"
      - "资质要求"

# 推送配置
notifications:
  feishu:
    enabled: true
    webhook: ""  # 需要配置飞书机器人webhook

  email:
    enabled: true
    smtp_server: "smtp.126.com"
    smtp_port: 465
    username: "[REDACTED_SECRET]"
    password: ""  # 需要配置邮箱密码
    to: "[REDACTED_SECRET]"

# 定时任务配置
schedule:
  # 每小时抓取一次
  crawl_interval: 3600  # 秒

  # 重点汇报间隔
  report_interval: 7200  # 2小时

  # 高价值项目立即推送阈值（万元）
  high_value_threshold: 1000

# 存储配置
storage:
  type: "sqlite"  # sqlite/mysql/postgresql
  path: "./data/tenders.db"

# LLM配置
llm:
  provider: "openai"  # openai/anthropic/azure
  model: "gpt-4o"
  api_key: ""  # 需要配置API密钥
  temperature: 0.3
  max_tokens: 4000


path: cron_setup.sh
content: #!/bin/bash
# 设置定时任务 - 每小时运行一次

cd "$(dirname "$0")"
SCRIPT_PATH="$(pwd)/run.sh"

# 添加到crontab
echo "设置定时任务..."

# 每小时运行
(crontab -l 2>/dev/null | grep -v "tender_analyzer"; echo "0 * * * * $SCRIPT_PATH >> $(pwd)/logs/cron.log 2>&1") | crontab -

# 每2小时重点汇报
(crontab -l 2>/dev/null; echo "0 */2 * * * $SCRIPT_PATH --report >> $(pwd)/logs/report.log 2>&1") | crontab -

echo "✅ 定时任务已设置"
echo ""
echo "任务列表:"
crontab -l | grep tender


path: run.sh
content: #!/bin/bash
# 标书分析助手运行脚本

cd "$(dirname "$0")"

# 检查Python环境
if ! command -v python3 &> /dev/null; then
    echo "❌ 需要安装Python3"
    exit 1
fi

# 安装依赖
echo "📦 检查依赖..."
pip3 install -q pyyaml requests 2>/dev/null || pip install -q pyyaml requests 2>/dev/null

# 运行分析
echo "🔍 开始标书分析..."
python3 tender_analyzer.py

echo "✅ 完成"


path: tender_analyzer.py
content: #!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
标书分析助手主程序
功能：定时抓取招标信息，智能分析，生成报告
"""

import os
import sys
import json
import time
import hashlib
import sqlite3
import requests
from datetime import datetime, timedelta
from typing import List, Dict, Optional
import yaml

# 配置路径
CONFIG_PATH = os.path.join(os.path.dirname(__file__), "config.yaml")
DATA_DIR = os.path.join(os.path.dirname(__file__), "data")

class TenderDatabase:
    """标书数据存储"""

    def __init__(self, db_path: str):
        self.db_path = db_path
        os.makedirs(os.path.dirname(db_path), exist_ok=True)
        self.init_db()

    def init_db(self):
        """初始化数据库"""
        conn = sqlite3.connect(self.db_path)
        cursor = conn.cursor()

        cursor.execute('''
            CREATE TABLE IF NOT EXISTS tenders (
                id TEXT PRIMARY KEY,
                title TEXT NOT NULL,
                project_no TEXT,
                agency TEXT,
                budget TEXT,
                deadline TEXT,
                category TEXT,
                source TEXT,
                url TEXT,
                content TEXT,
                analysis TEXT,
                status TEXT DEFAULT 'new',
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            )
        ''')

        cursor.execute('''
            CREATE TABLE IF NOT EXISTS analysis_reports (
                id TEXT PRIMARY KEY,
                tender_id TEXT,
                dimension TEXT,
                content TEXT,
                risk_score INTEGER,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                FOREIGN KEY (tender_id) REFERENCES tenders(id)
            )
        ''')

        conn.commit()
        conn.close()

    def save_tender(self, tender: Dict) -> bool:
        """保存标书信息"""
        conn = sqlite3.connect(self.db_path)
        cursor = conn.cursor()

        tender_id = hashlib.md5(
            f"{tender.get('project_no', '')}-{tender.get('title', '')}".encode()
        ).hexdigest()

        try:
            cursor.execute('''
                INSERT OR REPLACE INTO tenders
                (id, title, project_no, agency, budget, deadline, category, source, url, content, status)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
            ''', (
                tender_id, tender.get('title', ''), tender.get('project_no', ''),
                tender.get('agency', ''), tender.get('budget', ''), tender.get('deadline', ''),
                tender.get('category', ''), tender.get('source', ''), tender.get('url', ''),
                tender.get('content', ''), 'new'
            ))
            conn.commit()
            return True
        except Exception as e:
            print(f"保存失败: {e}")
            return False
        finally:
            conn.close()

    def get_recent_tenders(self, hours: int = 2) -> List[Dict]:
        """获取最近N小时的标书"""
        conn = sqlite3.connect(self.db_path)
        cursor = conn.cursor()
        since = (datetime.now() - timedelta(hours=hours)).isoformat()

        cursor.execute('SELECT * FROM tenders WHERE created_at > ? ORDER BY created_at DESC', (since,))
        columns = [description[0] for description in cursor.description]
        tenders = [dict(zip(columns, row)) for row in cursor.fetchall()]
        conn.close()
        return tenders


class TenderAnalyzer:
    """标书分析器"""

    def __init__(self, config: Dict):
        self.config = config

    def generate_report(self, tender: Dict) -> str:
        """生成分析报告"""
        return f"""# 标书分析报告 - {tender.get('title', '未知项目')}

## 📋 基本信息
- **项目编号**: {tender.get('project_no', 'N/A')}
- **招标单位**: {tender.get('agency', 'N/A')}
- **预算金额**: {tender.get('budget', 'N/A')}
- **投标截止**: {tender.get('deadline', 'N/A')}
- **信息来源**: {tender.get('source', 'N/A')}
- **行业分类**: {tender.get('category', 'N/A')}

## 💰 付款方式分析
待LLM深度分析...

## 📊 评标办法分析
待LLM深度分析...

## ⚙️ 技术参数要点
待LLM深度分析...

## 📄 合同条款风险
待LLM深度分析...

## 🎯 投标建议
- **机会评估**: 待评估
- **风险提示**: 待分析
- **策略建议**: 待生成

---
*分析时间: {datetime.now().strftime('%Y-%m-%d %H:%M')}*
"""


class TenderReporter:
    """标书汇报器"""

    def __init__(self, config: Dict):
        self.config = config

    def generate_summary(self, tenders: List[Dict]) -> str:
        """生成汇报摘要"""
        if not tenders:
            return "📭 过去2小时内未发现新的招标信息"

        # 按行业分类统计
        by_category = {}
        for t in tenders:
            cat = t.get('category', '其他')
            by_category[cat] = by_category.get(cat, 0) + 1

        # 高价值项目
        high_value = [t for t in tenders if '千万' in str(t.get('budget', '')) or '亿' in str(t.get('budget', ''))]

        report = f"""# 📊 标书监控汇报 ({datetime.now().strftime('%m-%d %H:%M')})

## 📈 新增标书统计
**总计**: {len(tenders)} 条

| 行业分类 | 数量 |
|---------|------|
"""
        for cat, count in sorted(by_category.items(), key=lambda x: -x[1]):
            report += f"| {cat} | {count} |\n"

        if high_value:
            report += f"\n## 💎 高价值项目TOP5\n"
            for i, t in enumerate(high_value[:5], 1):
                report += f"{i}. **{t.get('title', 'N/A')[:30]}...**\n"
                report += f"   - 金额: {t.get('budget', 'N/A')} | 截止: {t.get('deadline', 'N/A')}\n"

        # 紧急项目
        urgent = [t for t in tenders if self._is_urgent(t.get('deadline', ''))]
        if urgent:
            report += f"\n## ⏰ 紧急项目提醒（48小时内截止）\n"
            for t in urgent[:5]:
                report += f"- **{t.get('title', 'N/A')[:25]}...** | 截止: {t.get('deadline', 'N/A')}\n"

        report += f"\n---\n*下次汇报: 2小时后 | 数据来源: 政府采购/运营商/金融/央企*"
        return report

    def _is_urgent(self, deadline: str) -> bool:
        """判断是否紧急（48小时内）"""
        try:
            # 简化判断，实际应解析日期
            return False
        except:
            return False


def load_config() -> Dict:
    """加载配置"""
    if os.path.exists(CONFIG_PATH):
        with open(CONFIG_PATH, 'r', encoding='utf-8') as f:
            return yaml.safe_load(f)
    return {}


def main():
    """主函数"""
    print("🚀 标书分析助手启动...")

    config = load_config()
    db_path = config.get('storage', {}).get('path', './data/tenders.db')

    db = TenderDatabase(db_path)
    analyzer = TenderAnalyzer(config)
    reporter = TenderReporter(config)

    # 获取最近2小时的标书
    recent_tenders = db.get_recent_tenders(hours=2)

    # 生成汇报
    summary = reporter.generate_summary(recent_tenders)

    print("\n" + "="*60)
    print(summary)
    print("="*60)

    # 保存汇报到文件
    report_file = os.path.join(DATA_DIR, f"report_{datetime.now().strftime('%Y%m%d_%H%M')}.md")
    os.makedirs(DATA_DIR, exist_ok=True)
    with open(report_file, 'w', encoding='utf-8') as f:
        f.write(summary)

    print(f"\n✅ 汇报已保存: {report_file}")


if __name__ == '__main__':
    main()


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)