Node.js用GramJS调用Telegram API遇MEDIA_INVALID错误求助
错误原因分析
1. InputSingleMedia 参数结构错误
GramJS 里 messages.SendMultiMedia 的 multiMedia 数组中,InputSingleMedia 对象不能包含message字段,文本消息应该放在SendMultiMedia的顶层message参数里。你把message塞到InputSingleMedia里,会导致Telegram API解析媒体结构失败,直接触发MEDIA_INVALID错误。
2. Peer 参数未正确识别
直接传字符串"test"当peer不行——如果是用户名,必须加@前缀(比如@test);或者最好通过client.getEntity()获取正确的Peer实体对象,不然Telegram找不到目标对话,也会间接导致媒体发送失败。
3. 文件有效性或格式问题
虽然你检查了格式,但如果文件损坏、后缀和实际格式不匹配(比如后缀是jpg但实际是PNG或者其他格式),上传后Telegram无法识别,也会抛出这个错误。
4. 定时发送权限不足
如果是给频道发定时消息,得确保你的账号是频道管理员,拥有编辑权限,而且频道允许定时发送——部分公开频道可能禁用这个功能,权限不够的话,Telegram也可能用MEDIA_INVALID来包装错误。
解决方法
修正参数结构
把InputSingleMedia里的message字段移到SendMultiMedia顶层:
const request = new Api.messages.SendMultiMedia({ peer: "@test", // 用户名加@前缀 multiMedia: [new Api.InputSingleMedia({ media: media, // 删掉这里的message字段 })], message: 'test', // 文本消息放这里 scheduleDate: timeSchedule })
确保Peer参数正确
推荐用client.getEntity()获取合法的Peer对象,避免字符串解析出错:
// 先获取目标对话的实体 const peer = await client.getEntity("@test"); const request = new Api.messages.SendMultiMedia({ peer: peer, // 其他参数... })
验证文件有效性
- 用图片查看器打开
1700.jpg,确认文件没损坏 - 检查文件实际格式和后缀一致,比如用命令
file 1700.jpg查看真实格式 - 换一张已知正常的图片测试,排除文件本身的问题
检查定时发送权限
如果是频道:
- 确认账号是频道管理员,拥有「编辑消息」权限
- 检查频道设置,确认允许定时发送功能
完整修正代码示例
const {Api, TelegramClient} = require("telegram"); const {getSession} = require("../sessions/sessionManager"); const config = require("../config/config"); const {CustomFile} = require("telegram/client/uploads"); const {statSync} = require("fs"); const moment = require('moment'); const session = getSession(); const client = new TelegramClient(session, config.apiId, config.apiHash, { connectionRetries: 5, proxy: { ip: config.proxyHost, port: config.proxyPort, MTProxy: config.proxyMtproto, secret: config.proxySecret, socksType: 5, }, }); const test = async (req, res) => { await client.connect(); const filePath = "./1700.jpg"; // 先检查文件是否存在 try { statSync(filePath); } catch (e) { console.error("文件不存在或无法读取:", e); return res.status(400).send("文件错误"); } const toUpload = new CustomFile("photo.jpg", statSync(filePath).size, filePath); const file = await client.uploadFile({ file: toUpload, workers: 1, }); const media = new Api.InputMediaUploadedPhoto({ file: file, }); const timeSchedule = moment().add(1, 'hour').unix(); // 获取正确的Peer实体 const peer = await client.getEntity("@test"); const request = new Api.messages.SendMultiMedia({ peer: peer, multiMedia: [new Api.InputSingleMedia({ media: media, })], message: 'test', scheduleDate: timeSchedule }); try { const result = await client.invoke(request); console.log(result); res.status(200).send("定时消息已设置"); } catch (err) { console.error("发送错误:", err); res.status(500).send(err.message); } }; module.exports = { test: test };
内容的提问来源于stack exchange,提问作者Ali ZareShahi
相关产品推荐
相关产品推荐

