HTMl敏捷包,tlk.io

时间:2018-11-30 16:10:27

标签: c# html html-agility-pack

我试图阅读聊天网站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中找不到消息。

1 个答案:

答案 0 :(得分:0)

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

我对tlk.io一无所知,但在幕后似乎要查询一些API,该API返回包含聊天消息的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>()}");
    }
}