我修改了示例监听更新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
请帮我解决这个问题吗?
你的代码很糟糕。在使用像 WTelegramClient 这样的高级库之前,您需要提高 C# 水平。 自述文件指出:
⚠️ 该库需要了解高级 C# 技术,例如异步编程或子类模式匹配... 如果您是 C# 初学者,基于此库启动一个项目可能不是一个好主意。
显然你重新创建了一个不完整的
MessageMediaPhoto
,而不是仅仅铸造原始的MessageMedia
,这是行不通的。
请参阅此官方示例了解如何正确下载
MessageMediaPhoto
或MessageMediaDocument
:
https://github.com/wiz0u/WTelegramClient/blob/master/Examples/Program_DownloadSavedMedia.cs