Skip to main content
Glama

QQ Channel Data Collector

by elleys
channel.py6.81 kB
""" 频道数据模型 """ from dataclasses import dataclass, field from datetime import datetime from typing import List, Optional, Dict, Any import json @dataclass class QQChannel: """QQ频道数据模型""" # 基础信息 channel_id: str # 频道ID channel_name: str # 频道名称 channel_url: str # 频道链接 description: str = "" # 频道描述 # 统计信息 member_count: int = 0 # 成员数量 post_count: int = 0 # 帖子数量 online_count: int = 0 # 在线人数 # 分类信息 category: str = "" # 频道分类 tags: List[str] = field(default_factory=list) # 频道标签 # 管理信息 owner_name: str = "" # 频道主名称 admins: List[str] = field(default_factory=list) # 管理员列表 # 时间信息 created_time: Optional[datetime] = None # 创建时间 last_active_time: Optional[datetime] = None # 最后活跃时间 discovered_time: datetime = field(default_factory=datetime.now) # 发现时间 # 元数据 metadata: Dict[str, Any] = field(default_factory=dict) def to_dict(self) -> Dict[str, Any]: """转换为字典格式""" return { 'channel_id': self.channel_id, 'channel_name': self.channel_name, 'channel_url': self.channel_url, 'description': self.description, 'member_count': self.member_count, 'post_count': self.post_count, 'online_count': self.online_count, 'category': self.category, 'tags': self.tags, 'owner_name': self.owner_name, 'admins': self.admins, 'created_time': self.created_time.isoformat() if self.created_time else None, 'last_active_time': self.last_active_time.isoformat() if self.last_active_time else None, 'discovered_time': self.discovered_time.isoformat(), 'metadata': self.metadata } @classmethod def from_dict(cls, data: Dict[str, Any]) -> "QQChannel": """从字典创建实例""" # 处理时间字段 time_fields = ['created_time', 'last_active_time', 'discovered_time'] for field_name in time_fields: if data.get(field_name) and isinstance(data[field_name], str): from dateutil.parser import parse data[field_name] = parse(data[field_name]) # 处理列表字段 data['tags'] = data.get('tags', []) data['admins'] = data.get('admins', []) data['metadata'] = data.get('metadata', {}) return cls(**data) def to_json(self) -> str: """转换为JSON字符串""" return json.dumps(self.to_dict(), ensure_ascii=False, indent=2) @classmethod def from_json(cls, json_str: str) -> "QQChannel": """从JSON字符串创建实例""" data = json.loads(json_str) return cls.from_dict(data) def add_tag(self, tag: str) -> None: """添加标签""" if tag and tag not in self.tags: self.tags.append(tag) def add_admin(self, admin_name: str) -> None: """添加管理员""" if admin_name and admin_name not in self.admins: self.admins.append(admin_name) def update_metadata(self, key: str, value: Any) -> None: """更新元数据""" self.metadata[key] = value def is_active(self, hours: int = 24) -> bool: """判断频道是否活跃""" if not self.last_active_time: return False time_diff = datetime.now() - self.last_active_time return time_diff.total_seconds() < hours * 3600 def get_activity_level(self) -> str: """获取活跃度级别""" if self.is_active(24): return "高" elif self.is_active(24 * 7): # 一周 return "中" elif self.is_active(24 * 30): # 一月 return "低" else: return "不活跃" def __str__(self) -> str: """字符串表示""" return f"QQChannel(name={self.channel_name}, members={self.member_count})" def __repr__(self) -> str: """详细字符串表示""" return (f"QQChannel(channel_id='{self.channel_id}', " f"channel_name='{self.channel_name}', " f"member_count={self.member_count}, " f"post_count={self.post_count})") @dataclass class ChannelStats: """频道统计信息""" channel_id: str channel_name: str # 基础统计 total_posts: int = 0 total_members: int = 0 active_members: int = 0 # 内容统计 text_posts: int = 0 image_posts: int = 0 video_posts: int = 0 # 互动统计 total_likes: int = 0 total_comments: int = 0 total_shares: int = 0 # 时间统计 stats_time: datetime = field(default_factory=datetime.now) last_post_time: Optional[datetime] = None # 热门内容 top_posts: List[str] = field(default_factory=list) # 热门帖子ID列表 active_authors: List[str] = field(default_factory=list) # 活跃作者列表 def get_engagement_rate(self) -> float: """计算互动率""" if self.total_posts == 0: return 0.0 total_interactions = self.total_likes + self.total_comments + self.total_shares return total_interactions / self.total_posts def get_avg_likes_per_post(self) -> float: """计算平均点赞数""" if self.total_posts == 0: return 0.0 return self.total_likes / self.total_posts def to_dict(self) -> Dict[str, Any]: """转换为字典""" return { 'channel_id': self.channel_id, 'channel_name': self.channel_name, 'total_posts': self.total_posts, 'total_members': self.total_members, 'active_members': self.active_members, 'text_posts': self.text_posts, 'image_posts': self.image_posts, 'video_posts': self.video_posts, 'total_likes': self.total_likes, 'total_comments': self.total_comments, 'total_shares': self.total_shares, 'engagement_rate': self.get_engagement_rate(), 'avg_likes_per_post': self.get_avg_likes_per_post(), 'stats_time': self.stats_time.isoformat(), 'last_post_time': self.last_post_time.isoformat() if self.last_post_time else None, 'top_posts': self.top_posts, 'active_authors': self.active_authors }

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/elleys/MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server