You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pyrogram发送视频时进度回调触发Flood异常无法处理如何解决

问题根本原因

你触发Flood异常的核心原因是进度回调的调用频率过高:大文件上传时send_video的进度回调每秒会触发数十次,你当前的实现每次回调都会调用edit_message_text编辑消息,远超过Telegram API对消息编辑的频率限制(单聊每分钟最多允许编辑30次左右,群聊限制更严格)。即使添加了通用try-except,如果没有针对性处理FloodWait异常的等待逻辑,持续高频请求仍然会反复触发限制,甚至导致账号临时功能受限。

可行解决思路
  • 增加编辑节流逻辑:设置最小编辑间隔(推荐1~2秒),只有距离上次编辑消息的时间超过间隔阈值才发起新的编辑请求,大幅降低API请求频率
  • 增加进度变化校验:只有当前进度和上一次展示的进度差值超过0.5%~1%时才编辑消息,避免相同/接近的内容重复发起请求
  • 针对性处理Flood异常:捕获Pyrogram内置的FloodWait异常后,主动等待异常返回的要求等待时长,再重试操作,不要直接忽略异常继续发起请求
  • 优化终态处理逻辑:不要在进度回调中处理100%进度的消息编辑,等send_video方法执行完成后再统一编辑最终状态,减少冗余请求
修改后代码示例

首先导入依赖并定义全局进度状态存储,用于实现节流逻辑:

import asyncio
from pyrogram.errors import FloodWait

# 按消息ID存储每个上传任务的进度状态,支持多任务并行上传
upload_task_status = {}

修改后的进度回调函数:

async def send_media_progress(current, total, *args):
    client, chat_id, message_id = args[0], args[1], args[2]
    current_percent = round(current * 100 / total, 1)

    # 初始化当前上传任务的状态
    if message_id not in upload_task_status:
        upload_task_status[message_id] = {
            "last_edit_ts": 0,
            "last_shown_percent": 0
        }
    task_status = upload_task_status[message_id]

    # 节流判断:间隔不足1秒/进度变化小于0.5% 直接跳过编辑
    if (asyncio.get_event_loop().time() - task_status["last_edit_ts"] < 1) \
        or abs(current_percent - task_status["last_shown_percent"]) < 0.5:
        return

    # 100%进度直接移除状态,后续由上传完成后的逻辑统一处理
    if current_percent >= 100:
        upload_task_status.pop(message_id, None)
        return

    try:
        await client.edit_message_text(
            chat_id=chat_id,
            message_id=message_id,
            text=f"upload: {current_percent}%"
        )
        # 更新状态记录
        task_status["last_edit_ts"] = asyncio.get_event_loop().time()
        task_status["last_shown_percent"] = current_percent
    except FloodWait as e:
        # 按API要求等待对应时长后再继续
        await asyncio.sleep(e.value)
    except Exception:
        # 其他编辑错误直接忽略,不阻断主上传流程
        pass

发送视频的代码调整,上传完成后统一编辑终态:

await app.send_video(
   chat_id=message.chat.id,
   video=file_location,
   progress=send_media_progress,
   progress_args=[client, message.chat.id, loader_message.message_id] 
)
# 上传执行完成后统一编辑最终状态
await client.edit_message_text(
    chat_id=message.chat.id,
    message_id=loader_message.message_id,
    text="sending..."
)

内容的提问来源于stack exchange,提问作者Mohsn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:06:03