Pyrogram传URL调用InputMediaPhoto发媒体组报MEDIA_INVALID错误
问题触发原因
调用send_media_group传入HTTP图片链接触发MEDIA_INVALID错误,核心原因分为三类:
- 链接不符合Telegram服务端拉取规则:Telegram从自有服务器发起请求拉取传入的链接资源,不会携带鉴权Cookie、自定义请求头,也不会绕过访问限制。如果链接存在Referer防盗链、UA校验、登录访问要求、IP白名单限制、使用非80/443的自定义端口,Telegram拉取资源失败就会返回媒体无效错误。
- 资源本身不符合要求:链接指向的文件实际格式不是JPG/PNG等Telegram支持的静态图片格式(比如后缀篡改为jpg实际是webp、动图、其他格式文件)、单张体积超过10M上限、资源损坏、响应头
Content-Type不是标准图片MIME类型,都会被判定为无效媒体。 - 客户端版本兼容问题:部分旧版本Pyrogram存在参数处理bug,未正确将URL类型的媒体标识传递给Telegram接口,会直接触发参数校验错误。
注意:接口文档标注的支持传入URL,优先适配已经存在于Telegram CDN上的资源链接(即此前已经在Telegram内成功发送过的媒体链接),外站公网链接存在大量隐式限制,并非任意公网可访问的链接都能直接传入使用。
低开销直连发送方案
无需将图片下载到本地磁盘增加读写耗时,按以下步骤处理即可:
- 链接有效性前置校验
- 将图片链接放到无痕浏览器中直接打开,确认无任何验证步骤即可正常加载图片
- 核查图片格式为静态JPG/PNG、单张体积不超过10M、链接未使用自定义端口
- 自有存储的图片资源,放开带Telegram标识的爬虫UA、Telegram官方IP段的访问权限,关闭对应链接的防盗链校验
- 修复版本兼容问题
执行以下命令升级Pyrogram到最新稳定版,修复旧版本参数传递bug:pip install -U pyrogram - 内存流发送方案(零磁盘IO,速度接近直传URL)
完成上述校验后如果仍无法直接传入URL发送,可通过异步HTTP客户端将图片拉取到内存字节流中直接传递,全程不写入本地磁盘,无磁盘IO开销,传输速度远高于下载到本地再发送的方案,参考实现代码:from io import BytesIO import aiohttp from pyrogram.types import InputMediaPhoto async def send_remote_image_group(chat_id, image_url_list): media_list = [] async with aiohttp.ClientSession() as session: for img_url in image_url_list: async with session.get(img_url) as resp: if resp.status != 200 or not resp.content_type.startswith("image/"): raise RuntimeError(f"图片拉取失败: {img_url}") img_data = await resp.read() media_list.append(InputMediaPhoto(BytesIO(img_data))) await app.send_media_group(chat_id, media_list) # 调用示例 url = "https://example.com/photo.jpg" await send_remote_image_group(msg.chat.id, [url])
内容的提问来源于stack exchange,提问作者Qustin Malone
相关产品推荐
相关产品推荐

