使用 WTelegramClient c# 将传入媒体发送到其他聊天时出现异常 MEDIA_EMPTY

问题描述 投票:0回答:1

我修改了示例监听更新here以将传入消息发送给其他用户或聊天,这是我的代码:

public MessageMedia MediaMSG=null;
....
Manager = client.WithUpdateManager(Client_OnUpdate/*, "Updates.state"*/);
var dialogs = .client.Messages_GetAllDialogs(); // dialogs = groups/channels/users
dialogs.Wait();
dialogs.Result.CollectUsersChats(Manager.Users, Manager.Chats);
/***/
private async Task Client_OnUpdate(Update update)        {
           switch (update)
           {                case UpdateNewMessage unm:
                                          await HandleMessage(unm.message);
                                       break;
           }        
}
/***/ 
private Task HandleMessage(MessageBase messageBase, bool edit = false)
{
   switch (messageBase)
   {
       case TL.Message m:
          
           InputPeer peer = null;
           //set peer a value for example user or chat
           //peer =.....
           Task<TL.Message> PostResult = null;
           CancellationTokenSource cancellationSource = new CancellationTokenSource();
           CancellationToken cancellation = cancellationSource.Token;
             MediaMSG = m.media;
 MessageMediaPhoto d = null;
 if (MediaMSG.GetType() == typeof(MessageMediaPhoto))
 {
     d=new MessageMediaPhoto();
     d.flags = ((MessageMediaPhoto)MediaMSG).flags;
     d.photo = ((MessageMediaPhoto)MediaMSG).photo;
     d.ttl_seconds= ((MessageMediaPhoto)MediaMSG).ttl_seconds;
     MessageBox.Show(d.flags.ToString() + ":" + d.photo.ID + " :" + d.ttl_seconds+":"+ m.flags.ToString());
     File.WriteAllText("a.txt", d.flags.ToString() + ":" + d.photo.ID + " :" + d.ttl_seconds + ":" + m.flags.ToString());
 
 }
 
 PostResult = client.SendMessageAsync(peer, m.message, d?.ToInputMedia());

 PostResult.Wait(cancellation);
           break;
       case MessageService ms: /*Console.WriteLine($"{Peer(ms.from_id)} in {Peer(ms.peer_id)} [{ms.action.GetType().Name[13..]}]");*/ break;
   }
   return Task.CompletedTask;
}

当消息是文本时,它已成功发送,但当它具有媒体(例如文本和照片)时,我会收到异常 MEDIA_EMPTY, 这不是一条特定的消息,而是任何带有媒体的消息 对等点初始化成功,因为当传入消息是文本消息时,它发送成功,但当传入消息有媒体时,它会引发异常 MEDIA_EMPTY, media 不为 null,即使为 null 也不能引发异常,因为 media 是一个可选参数,默认为 null,client.SendMessageAsync 通过以下方式发送媒体:

client.Messages_SendMedia(peer, m.media.ToInputMedia(), m.message,Helpers.RandomLong());

我直接尝试一下:

client.Messages_SendMedia(peer, m.media.ToInputMedia(), m.message,Helpers.RandomLong());

但是遇到 MEDIA_EMPTY 的情况,我打印了媒体信息,原始媒体是 png 照片,媒体信息如下:

d.flags : has_photo
d.photo.ID : 5949672085112603217 
d.ttl_seconds : 0
m.flags : has_from_id, has_media, has_replies

我尝试将媒体照片保存到磁盘:

var filename = $"{d.photo.ID}.jpg";

 var fileStream = File.Create(filename);
var type =  client.client.DownloadFileAsync((Photo)d.photo, fileStream);
type.Wait();
fileStream.Close(); 

但它引发异常 FILE_REFERENCE_EXPIRED 我在公共和私人聊天中测试了它,但仍然是相同的异常

400 
MEDIA_EMPTY 
The provided media object is invalid

请帮我解决这个问题吗?

c# telegram telegram-api wtelegramclient
1个回答
0
投票

你的代码很糟糕。在使用像 WTelegramClient 这样的高级库之前,您需要提高 C# 水平。 自述文件指出:

⚠️ 该库需要了解高级 C# 技术,例如异步编程或子类模式匹配... 如果您是 C# 初学者,基于此库启动一个项目可能不是一个好主意。

显然你重新创建了一个不完整的

MessageMediaPhoto
,而不是仅仅铸造原始的
MessageMedia
,这是行不通的。

请参阅此官方示例了解如何正确下载

MessageMediaPhoto
MessageMediaDocument
https://github.com/wiz0u/WTelegramClient/blob/master/Examples/Program_DownloadSavedMedia.cs

© www.soinside.com 2019 - 2024. All rights reserved.