我怎么知道电报信息被对话者看过?



我使用WTelgramClient来提醒病人即将到来的医生预约。

我正在发送一条消息,我需要确保它被读取。

using var client = new WTelegram.Client(Config);
var user = await client.LoginUserIfNeeded();
var contact = await client.Contacts_ImportContacts(new[] { new InputPhoneContact { phone = phoneNumber } });
object p = await client.SendMessageAsync(contact.users[contact.users.Keys.First()], patientMessage);

这似乎可以通过flaghas_views来实现。我试了下面的代码,但是我不能调用dialogs.messages[0].flag.has_views

var dialogs = await client.Messages_GetAllDialogs();
Console.WriteLine(dialogs.messages[0]);

首先,您应该像这样存储用户信息和发送的消息信息:

var targetUser = contact.users.Values.First();
var msg = await client.SendMessageAsync(targetUser, text);

之后,您可以检查匹配的Dialog.read_outbox_max_id是否表示您的消息已被读取,如下所示:

var dialogs = await client.Messages_GetAllDialogs();
foreach (Dialog dialog in dialogs.dialogs)
if (dialog.peer.ID == targetUser.id)
if (dialog.read_outbox_max_id >= msg.id)
Console.WriteLine("Sent message was read");

或者,如果您的程序在后台运行,它可以实时监视更新,等待与targetUser匹配的UpdateReadHistoryOutbox。Id和max_id>= msg.id

也许你应该为客户端可用的OnUpdate事件添加一个侦听器:

client.OnUpdate += Client_OnUpdate
private static async Task Client_OnUpdate(IObject arg)
{
if (arg is not UpdatesBase updates) return;
updates.CollectUsersChats(Users, Chats);
foreach (var update in updates.UpdateList)
switch (update)
{
case UpdateReadMessagesContents urmc: //get id of read messages: urmc.messages 
default: Console.WriteLine(update.GetType().Name); break; // there are much more update types than the above example cases
}
}

并检查是否存在类型为UpdateReadMessagesContents的事件您可以从中获取已读消息的id。

我希望这对你有帮助

最新更新