簡體   English   中英

Telegram API(不是 Telegram Bot API?) - 如何獲取整個聊天/頻道中的所有消息?

[英]Telegram API (NOT Telegram Bot API!) - how to get all messages in entire chat/channel?

  1. 我需要在聊天中獲取所有消息。 我使用 C# 和 TLSharp 庫。

  2. 我授權,成功獲得令牌等。

  3. 但是當我試圖在一個循環中獲取消息時,我將進入一個無限循環。

  4. 所以帶有結果的文本永遠不會出現在文本框中。 我想知道我做錯了什么以及如何解決它。 謝謝。

     using TeleSharp.TL; using TeleSharp.TL.Messages; using TLSharp.Core; //using other standard... //code for authorization etc. is skipped int VKFID = 1175259547; //ID of the chat int offset = 0; int n = 1; StringBuilder sb = new StringBuilder(); TelegramClient client = new TelegramClient(<key>, <hash>); TLUser user; private DateTime ConvertFromUnixTimestamp(double timestamp) { DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0); return origin.AddSeconds(timestamp); } private async void button3_Click(object sender, EventArgs e) { sb.Append("#\tDate\tTime\tMID\tTUID\tText" + Environment.NewLine); TLDialogsSlice dialogs = (TLDialogsSlice)await client.GetUserDialogsAsync(); TLChannel chat = dialogs.Chats.Where(c => c.GetType() == typeof(TLChannel)).Cast<TLChannel>().FirstOrDefault(c => c.Id == VKFID); TLInputPeerChannel inputPeer = new TLInputPeerChannel() { ChannelId = chat.Id, AccessHash = (long)chat.AccessHash }; while (true) { try { TLChannelMessages res = await client.SendRequestAsync<TLChannelMessages> (new TLRequestGetHistory() { Peer = inputPeer, Limit = 1000, AddOffset = offset, OffsetId = 0 }); var msgs = res.Messages; if (res.Count > offset) { offset += msgs.Count; foreach (TLAbsMessage msg in msgs) { if (msg is TLMessage) { TLMessage message = msg as TLMessage; sb.Append(n.ToString() + "\t" + ConvertFromUnixTimestamp(message.Date).ToLocalTime().ToString("dd'.'MM'.'yyyy") + "\t" + ConvertFromUnixTimestamp(message.Date).ToLocalTime().ToString("HH':'mm':'ss") + "\t" + message.Id + "\t" + message.FromId + "\t" + message.Message + Environment.NewLine); } if (msg is TLMessageService) continue; n++; } Thread.Sleep(22000); //to avoid TelegramFloodException } else break; } catch (Exception ex) { MessageBox.Show(ex.Message); break; } finally { await Task.Delay(22000); //to avoid TelegramFloodException } } textBox2.Text = sb.ToString(); MessageBox.Show("Done"); }

您可以嘗試在 Thead.Sleep(22000) 之前刷新您的文本框嗎?

    textBox2.Text += sb.ToString();
    Application.DoEvents();
    Thread.Sleep(22000);

執行此操作的其他方式可以是使用 BackgroundWorker,其方式與用於管理 ProgressBar 的方式相同。

現在有了 WTelegramClient庫,使用最新的 Telegram Client API 協議(以用戶身份連接,而不是機器人)。

該庫非常完整,但使用起來也非常簡單。 按照GitHub 上的 README進行簡單介紹。

連接、查找您的聊天和檢索所有消息可以這樣完成:

using TL;
using System.Linq;

const int TargetChatId = 1175259547;

using var client = new WTelegram.Client(); // or Client(Environment.GetEnvironmentVariable)
await client.LoginUserIfNeeded();
var chats = await client.Messages_GetAllChats(null);
InputPeer peer = chats.chats.First(chat => chat.ID == TargetChatId);
for (int offset = 0; ;)
{
    var messagesBase = await client.Messages_GetHistory(peer, 0, default, offset, 1000, 0, 0, 0);
    if (messagesBase is not Messages_ChannelMessages channelMessages) break;
    foreach (var msgBase in channelMessages.messages)
        if (msgBase is Message msg)
        {
            // process the message
        }
    offset += channelMessages.messages.Length;
    if (offset >= channelMessages.count) break;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM