如何修复 Pyrogram Telegram 机器人无法发送视频的问题
本文详解 pyrogram 机器人下载并发送 youtube 视频时“卡在最后一步”的常见原因,包括异步阻塞、文件路径错误、权限问题及缺乏异常追踪,并提供可立即验证的调试方案与健壮实现。
你的代码逻辑看似完整:下载视频 → 等待文件生成 → 调用 send_video 发送。但实际中 await client.send_video(...) 未执行或静默失败,根本原因往往不是配置错误,而是未捕获底层异常 + 同步/异步混用导致阻塞 + 文件路径与权限隐患。下面逐层分析并给出生产级修复方案。
? 1. 关键问题定位:必须启用详细异常追踪
原代码中 except Exception as e: 仅打印字符串,而 Pyrogram 的网络异常(如 FilePartMissing, Timeout, PeerIdInvalid, ChatWriteForbidden)常被吞掉。务必引入 traceback 获取完整堆栈:
import traceback
# 替换原 send_video 的 except 块:
except Exception as e:
print(f"❌ Failed to send video:")
traceback.print_exc() # ← 关键!输出完整错误链
return
运行后你极可能看到类似:
Magician
Figma插件,AI生成图标、图片和UX文案
- pyrogram.errors.exceptions.bad_request_400.FilePartMissing: The uploaded file is broken
- pyrogram.errors.exceptions.flood_420.FloodWait: A wait of X seconds is required
- OSError: [Errno 2] No such file or directory: 'video.mp4'
这些信息是调试的唯一入口。
⚠️ 2. 核心陷阱:同步下载阻塞异步事件循环
ys.download(...) 是同步阻塞调用,会冻结整个 Pyrogram 异步事件循环,导致后续 await client.send_video() 无法调度,甚至引发超时或死锁。PyTube 不支持原生异步下载,必须用 loop.run_in_executor 脱离主线程:
import asyncio
from concurrent.futures import ThreadPoolExecutor
# 创建线程池(全局复用)
executor = ThreadPoolExecutor(max_workers=4)
@app.on_message()
async def send_video(client, message):
if not message.text or not message.text.startswith("https://"):
await message.reply("⚠️ 请发送有效的 YouTube 链接")
return
URL = message.text.strip()
yt = YouTube(URL)
# ✅ 异步安全下载:委托给线程池
try:
ys = yt.streams.get_highest_resolution()
video_path = "video.mp4"
# 在线程中执行下载(避免阻塞事件循环)
await asyncio.get_event_loop().run_in_executor(
executor,
lambda: ys.download(filename=video_path)
)
print("✅ Video downloaded successfully")
except Exception as e:
print(f"❌ Download failed: {e}")
await message.reply("下载失败,请检查链接或重试")
return
# ✅ 不再轮询等待:直接校验文件存在性
if not os.path.exists(video_path) or os.path.getsize(video_path) == 0:
await message.reply("⚠️ 下载完成但文件为空,请重试")
return
# ✅ 使用绝对路径避免路径歧义(尤其 Docker/服务器环境)
abs_path = os.path.abspath(video_path)
try:
# 发送前可选:添加进度回调(提升用户体验)
def progress(current, total):
percent = (current / total) * 100
if int(percent) % 20 == 0: # 每20%上报一次
asyncio.create_task(message.reply(f"? 上传中... {int(percent)}%"))
await client.send_video(
chat_id=message.chat.id,
video=abs_path,
duration=yt.length,
caption=f"? {yt.title[:50]}...",
progress=progress
)
print("✅ Video sent successfully")
await message.reply("✅ 视频已发送!")
except Exception as e:
print(f"❌ Send failed:")
traceback.print_exc()
await message.reply("发送失败,请稍后重试或联系管理员")
finally:
# ✅ 清理临时文件(防止磁盘占满)
if os.path.exists(abs_path):
os.remove(abs_path)
?️ 3. 必须检查的硬性前提
-
文件大小限制:Telegram Bot API 对普通用户聊天中视频限制为 50 MB;若视频超限,send_video 会直接抛出 FileTooBig 异常。建议提前校验:
# 在下载后加入 size_mb = os.path.getsize(abs_path) / (1024 * 1024) if size_mb > 45: # 预留缓冲 await message.reply(f"⚠️ 视频过大 ({size_mb:.1f} MB),Telegram 限制为 50 MB") return - Bot 权限:确保 Bot 在目标群组/频道中具有 can_send_videos 权限(私聊默认允许)。
-
API 限频:频繁调用可能触发 FloodWait。添加简单退避:
except FloodWait as e: print(f"⏳ Flood wait for {e.value} seconds") await asyncio.sleep(e.value + 1) # 重试逻辑(需封装为递归或循环)
✅ 最终验证步骤
- 用小视频测试(如答案中的 1.5MB 示例)确认基础流程通路;
- 启用 traceback.print_exc() 后复现问题,根据报错精准定位;
- 将 yt.streams.get_highest_resolution() 替换为 yt.streams.filter(progressive=True, file_extension='mp4').first() 提升兼容性;
- 生产环境务必使用 logging 替代 print,并添加消息去重(防重复触发)。
? 总结:Pyrogram 机器人“不发送”几乎从不是配置问题,而是同步阻塞、异常静默、路径/权限疏漏三者叠加的结果。用 ThreadPoolExecutor 解耦下载、用 traceback 揭示真相、用绝对路径和大小校验筑牢防线——这才是稳定交付的关键。
如非特殊说明,本站内容均来自于网友自主分享,如有任何问题均请联系我们进行处理!
猜您喜欢
《毁灭战士:黑暗时代 启示录》修复进度BUG与崩溃
2026-07-13《毁灭战士:黑暗时代启示录》一号热修复现已登陆Steam平台,Xbox、PlayStation 5、微软商店及战网版本将在完成平台审核后陆续上线。本次更新重点修复进度卡死、游戏崩溃以及一项按键绑定相关问题。 玩家需要注意,本次针对锁链长矛输入问题的修复,会将所有自定义按键绑定重置为默认设置。若你此前修改过按键配置,需重新进行设置。 补丁说明 BUG修复 -修复了按键解绑后,锁链长矛的输入提示显示为...
《机器人角斗场》第一章通关攻略
2026-07-13机器人角斗场第一章怎么通关?这款游戏是最近像素作品里面人气很高的一款,它最为一款刀剑格斗游戏,在各方面的表现都十分的不错,游戏的难度并不算低,很多玩家在刚一入坑就经常会被卡住,接下来方便大家开荒便为大家带来游戏第一章的流程攻略。 《机器人角斗场》第一章通关攻略 这游戏一开始进入之后咱们先需要选择一个自己的形象,然后大家需要选择一下难度,之后便会进入到游戏之中。游戏的玩法就如同它的名字一样,咱们需要...
《机器人角斗场》隐藏兵种一览
2026-07-13机器人角斗场隐藏兵种有哪些?机器人角斗场里也是有一些隐藏兵种的,不过并不是说隐藏的就一定厉害,而是比较有特点,不少人不知道具体机器人角斗场手机版隐藏兵种有哪些,这里就给大家展开说明一番。 《机器人角斗场》隐藏兵种一览 帝国护甲机器人,第五章被皇帝第二阶段召出来的,有4格能量、满级回复、可以格挡弓箭的激光,很难对付,用弓箭的话不好对付。礼物盒机器人,1格能量,可以踢,击败后还有随机的奖励。 Mark...
《机器人角斗场》召唤盟友攻略
2026-07-13机器人角斗场怎么召唤盟友?在《机器人角斗场》手机版中,单机作战往往面临敌众我寡的困境。当玩家被多个敌人围攻时,如何快速获得可靠支援成为通关关键。本期攻略将系统解析两种官方认可的盟友获取路径,助你摆脱孤军奋战局面,大幅提升战场生存率与清关效率。 《机器人角斗场》召唤盟友攻略 第一种方式为切换游戏模式——启用“盟友挑战”专属玩法。该模式在开局即自动配置固定援军,进入战斗后,场上将同步刷新若干带有阵营标...
Bungie确认仍会维护《命运2》服务器 并修复问题
2026-07-11尽管Bungie最近经历大裁员,且《命运2》在最终大型更新后不会再推出新内容,但游戏并未完全停止运营。官方表示未来仍将进行服务器维护,并会推出小规模修复补丁。 近日Bungie为《命运2》推送了一个小型补丁,主要内容为修复现有问题。由于后续不会再有新内容更新,不少玩家担心这是否为游戏最后一次补丁。 对此Bungie首席社区经理dmg04回应称,团队仍会关注一些高优先级问题,例如游戏崩溃等情况,并继...
《机器人角斗场》士兵攻略
2026-07-11机器人角斗场士兵怎么玩?在很多游戏里,都会给玩家可操控的角色,区分不同的职业,方便在挑战过程中根据实际需求做出选择,下面带来机器人角斗场手机版士兵攻略,游戏里并没有士兵兵种的概念,游戏主打机甲对战玩法,玩家操控的机器人可以被称为士兵,挑战过程中可以自由搭配不同的机器零部件,利用特定武器完成和对手之间的抗衡,并不是固定的兵种对抗,对于玩家来说,对战技巧是最重要的。 《机器人角斗场》士兵攻略 进入到机...
《机器人角斗场》士兵玩法攻略
2026-07-11机器人角斗场士兵怎么玩?在很多游戏里,都会给玩家可操控的角色,区分不同的职业,方便在挑战过程中根据实际需求做出选择,下面带来机器人角斗场手机版士兵攻略,游戏里并没有士兵兵种的概念,游戏主打机甲对战玩法,玩家操控的机器人可以被称为士兵,挑战过程中可以自由搭配不同的机器零部件,利用特定武器完成和对手之间的抗衡,并不是固定的兵种对抗,对于玩家来说,对战技巧是最重要的。 《机器人角斗场》士兵玩法攻略 进入...
《机器人角斗场》锤子位置一览
2026-07-09机器人角斗场锤子在哪里?机器人角斗场作为趣味的格斗游戏,玩家将会在第三人称的视角下操控机器人,开启格斗挑战,游戏里玩家会遇到大量的机器人对手,可以通过控制机器人,使用不同的武器参与挑战,机器人角斗场手机版锤子在哪是接下来要带来的内容,挑战过程中,玩家可以使用的武器非常多,锤子是很多成员比较喜欢的,关于具体的获取方式,下面会详细分享介绍。 《机器人角斗场》锤子位置一览 在游戏里,锤子并不是开始就可以...
《机器人角斗场》大剑挑战打法攻略
2026-07-09机器人角斗场大剑挑战怎么打?为了可以让玩家在机器人角斗场中,感受到更有趣的对战,游戏里会设定大量的章节关卡,每一关遇到的对手都会有所不同,方便玩家根据对手灵活调整武器,制定不同的战术打法,下面再来机器人角斗场手机版大剑挑战怎么打,作为挑战模式中的特定关卡,玩家必须要使用大剑武器完成和对手之间的抗衡,一般指的是游戏里的第10关,想完成高难度对战的玩家,可以通过下面的分享了解相关攻略。 《机器人角斗场...
《机器人角斗场》矛玩法介绍
2026-07-09机器人角斗场矛怎么玩?在常见的格斗游戏里,会采用赤手空拳的对战方式,机器人角斗场设置了独特的机甲元素,每个成员都可以去控制像素机器人,开启紧张刺激的动作对战,下面要介绍的是机器人角斗场手机版矛怎么玩,挑战过程中会有大量的武器供玩家使用,矛是其中的一种,关于长矛的具体操作技巧,每个玩家都可以来了解一下,让玩家在使用长矛对战的过程中更灵活。 《机器人角斗场》矛玩法介绍 矛在游戏里是比较独特的一种武器,...
