Как получить дату загрузки видео на YouTube, используя метод оценочного скрипта GeckoFX 60? - PullRequest
1 голос
/ 30 января 2020

Браузер GeckoFX 60, который я использую в WPF, имеет метод сценария оценки, который принимает код javascript (в виде строки).

Что я сделал:

  1. Поискал видео на YouTube, чтобы проверить мой javascript код
  2. Размещение document.getElementById('date').innerText на консоли дало мне необходимую информацию
  3. Вернулся к моему Приложение WPF и поместил это:

(C#)

string videoDate = "";
using (Gecko.AutoJSContext js = new Gecko.AutoJSContext(YouTubeBrowser.Window))
{
    js.EvaluateScript("document.getElementById('date').innerText", out videoDate);
}
NewProject.VideoDate = DateTime.Parse(videoDate);

Проблема:

Это ловило ошибку, поэтому я поместил разрыв перед синтаксическим анализом строки и обнаружил, что строка videoDate имеет значение null

Что я ожидал:

Я ожидал, что он вернет •Jan 30, 2008, показанный консолью когда я ввел код js в браузере.

Пока эти строки кода работают для меня (как на консоли, так и в GeckoBrowser моего wpf-приложения) при получении другой информации из видео YouTube:

js.EvaluateScript("document.title", out videoTitle); = получает заголовок видео

js.EvaluateScript("document.URL", out videoId); = получает URL-адрес видео (который я затем отфильтрую, чтобы получить только идентификатор видео в c#)

Еще несколько вещей, которые я пробовал, не работали:

A. Использование GeckoElement и получение документа браузера и его textContent

GeckoElement elem = YouTubeBrowser.Document.GetElementById("date");
videoDate = elem.textContent;

B. Использование GeckoElement и получение DomDocument браузера и его textContent

GeckoElement elem = YouTubeBrowser.DOMDocument.GetElementById("date");
videoDate = elem.textContent;

C. Изменил innerText на textContent (основываясь на другом SO-ответе, который, как я видел, сказал, что firefox не понимает innerText (что странно, так как он работал на консоли, но я думаю, что они добавили поддержку для этого позже), а использует textContent для получения значение)

string videoDate = "";
using (Gecko.AutoJSContext js = new Gecko.AutoJSContext(YouTubeBrowser.Window))
{
    js.EvaluateScript("document.getElementById('date').textContent", out videoDate);
}
NewProject.VideoDate = DateTime.Parse(videoDate);

1 Ответ

1 голос
/ 12 февраля 2020

Я думаю, что это связано с динамической c DOM на YouTube.
Хотя я не смог получить значение по идентификатору элемента, я нашел ту же информацию в другом теге по имени класса:

_gfxBrowser.Document.GetElementsByClassName("watch-time-text")[0].TextContent

Возвращает: "Published on Jan 25, 2019"

...