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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 11:20:59