HTMl 敏捷包,tlk.io

HTMl Agility pack, tlk.io

我尝试阅读聊天网站 https://tlk.io/ 上的消息,您可以在其中选择一个随机频道并进入对话。 现在我想通过 C# 中的 HTML Agility 提取书面消息。 因此消息的 xpath 例如:/html/body/div/section/dl[19]/dd[3]。 所以我尝试在 div 中搜索所有消息 这是我的频道 123 的代码:

    var url = "https://tlk.io/123";

    var httpClient = new HttpClient();
    var html = await httpClient.GetStringAsync(url);

    var HtmlDocument = new HtmlDocument();
    HtmlDocument.LoadHtml(html);

    var Messages = HtmlDocument.DocumentNode.Descendants("div")
        .Where(node => node.GetAttributeValue("class", "")
        .Equals("chat")).ToList();

现在的问题是我无法在给定的 xpath 中找到消息。

消息不在检索到的 html 中,因为它们是在初始 html 加载后动态加载的。

我对 tlk.io 一无所知,但在幕后似乎有一些 API 被查询 returns 包含 JSON 的消息聊天消息(对于它们的价值......)。因此,您可以利用它来获取信息。例如;

using (WebClient webClient = new WebClient())
{
    var html = webClient.DownloadString("https://tlk.io/123");
    Match chatIdFinder = new Regex(@"Talkio\.Variables\.chat_id = '(?<chatid>\d+)'").Match(html);
    if (!chatIdFinder.Success) throw new ArgumentException("Could not find chat id");
    var chatId = chatIdFinder.Groups["chatid"].Value;
    var json = webClient.DownloadString($"https://tlk.io/api/chats/{chatId}/messages");

    JArray messages = JArray.Parse(json);
    var epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc);
    foreach (dynamic message in messages)
    {
        JToken chatMessage = message.body;
        JToken nickname = message.nickname;
        JToken timestamp = message.timestamp;
        var messageTime = epoch.AddSeconds(timestamp.Value<int>()).ToLocalTime();
        Console.WriteLine($"{messageTime}: {nickname.Value<string>()}: {chatMessage.Value<string>()}");
    }
}