HTMl Agility Pack, tlk.io - PullRequest
       7

HTMl Agility Pack, tlk.io

0 голосов
/ 30 ноября 2018

Я пытался прочитать сообщения с веб-сайта чата https://tlk.io/,, где вы можете выбрать произвольный канал и войти в разговор.И теперь я хочу извлечь письменные сообщения с помощью HTML Agility в C #.Таким образом, 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 голосов
/ 01 декабря 2018

Сообщения не находятся в извлеченном html, потому что они загружаются динамически после загрузки исходного html.

Я ничего не знаю о tlk.io, но за кулисами он, кажется, имеетнекоторый 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>()}");
    }
}
...