如何使用Telethon获取电报频道所有媒体数据的总MB大小
使用Telethon统计电报频道所有媒体总大小的解决方案
问题核心在于Telegram不同类型媒体的大小字段存储位置不同:照片的大小在photo.sizes的最大尺寸项中,而视频、文档、音频等的大小直接在document.size里。只读取data.media.document.size会漏掉照片类媒体,同时SearchRequest有数量限制,无法覆盖频道全部消息。
解决步骤
- 遍历频道全部消息:使用
client.iter_messages而非SearchRequest,它能分页获取频道所有消息(limit=None表示获取全部)。 - 区分媒体类型提取大小:
- 照片(
MessageMediaPhoto):取photo.sizes中分辨率最大的条目对应的size(这是原照片的实际大小)。 - 文档/视频/音频/GIF(
MessageMediaDocument):直接读取document.size。
- 照片(
- 累加并转换单位:将所有字节数累加后转换为MB(或其他单位)。
完整代码示例
from telethon import TelegramClient from telethon.tl.types import MessageMediaPhoto, MessageMediaDocument async def calculate_total_media_size(client, channel_identifier): total_bytes = 0 # 遍历频道所有消息,自动处理分页 async for message in client.iter_messages(channel_identifier, limit=None): if not message.media: continue # 处理照片媒体 if isinstance(message.media, MessageMediaPhoto): photo = message.media.photo if photo.sizes: # 按分辨率排序,取最大尺寸的照片大小 largest_photo = max(photo.sizes, key=lambda s: s.width * s.height) total_bytes += largest_photo.size # 处理文档/视频/音频等媒体 elif isinstance(message.media, MessageMediaDocument): doc = message.media.document total_bytes += doc.size # 转换为MB(1MB = 1024^2 字节) total_mb = total_bytes / (1024 ** 2) print(f"频道所有媒体总大小: {total_mb:.2f} MB") return total_mb # 替换为你的API信息和目标频道 API_ID = 你的API_ID API_HASH = '你的API_HASH' CHANNEL = '频道用户名或ID' with TelegramClient('media_size_session', API_ID, API_HASH) as client: client.loop.run_until_complete(calculate_total_media_size(client, CHANNEL))
注意事项
- 权限验证:确保你的账号已加入目标频道(私有频道需手动加入后才能访问)。
- 速率限制:Telegram API有调用频率限制,
iter_messages会自动处理延迟,但大频道可能需要较长时间完成遍历。 - 扩展媒体类型:如果需要统计贴纸(
MessageMediaSticker)等其他媒体,可添加对应的类型判断,贴纸的大小同样存储在document.size中。 - 单位转换:若需统计GB,将计算式改为
total_gb = total_bytes / (1024 ** 3)即可。
内容的提问来源于stack exchange,提问作者theprogrammer451
相关产品推荐
相关产品推荐

