Как получить количество лайков и зрителей прямого эфира на ютубе?
Пишу на Java, хочу использовать JSoup для парсинга страницы со стримом. Не хочу использовать YT api, чтобы не упираться в квоту. Проблема в том, что я не знаю, как из полученного со стрима html кода вырвать эту информацию? Уже не могу разобраться самостоятельно, подскажите пожалуйста
Ответы (1 шт):
Автор решения: komla3
→ Ссылка
Вот код поиска нужного нам элемента для его парсинга
Document liveDocument = Jsoup.connect(href).get(); //получаем страницу со стримом
Elements elements1 = liveDocument.body().select("script[nonce]"); //получаем элементы по тегу script[nonce], потому что информация о зрителях и лайках находится именно здесь
for (Element element : elements1) { //перебираем полученные скрипты (элементы)
if (element.dataNodes().toString().contains("Сейчас смотрят")) { //если у итерируемого элемента содержатся слова "Сейчас смотрят" (когда идет стрим, под ним написано "Сейчас смотрят: кол-во), то это нужный элемент
String html = element.dataNodes().toString().replace("var ytInitialData = ", "");
//делаем с полученным кодом что нам нужно...
}
}
А вот код для полного решения моей задачи (получение зрителей и лайков)
private void test(String html) {
JsonObject mainInfo = new JsonParser().parse(html).getAsJsonArray()
.get(0).getAsJsonObject()
.getAsJsonObject("contents")
.getAsJsonObject("twoColumnWatchNextResults")
.getAsJsonObject("results")
.getAsJsonObject("results")
.getAsJsonArray("contents")
.get(0).getAsJsonObject()
.getAsJsonObject("videoPrimaryInfoRenderer");
JsonObject likesInfo = mainInfo.getAsJsonObject("videoActions")
.getAsJsonObject("menuRenderer")
.getAsJsonArray("topLevelButtons")
.get(0).getAsJsonObject()
.getAsJsonObject("toggleButtonRenderer")
.getAsJsonObject("defaultText");
int viewers = Integer.parseInt(mainInfo.getAsJsonObject("viewCount")
.getAsJsonObject("videoViewCountRenderer")
.getAsJsonObject("viewCount")
.getAsJsonArray("runs")
.get(1).getAsJsonObject()
.get("text")
.getAsString().replaceAll("[^0-9]", "")
);
int likes = Integer.parseInt(likesInfo
.getAsJsonObject("accessibility")
.getAsJsonObject("accessibilityData")
.get("label").getAsString().replaceAll("[^0-9]", "")
);
String simpleLikes = likesInfo.get("simpleText").getAsString();
System.out.println("Зрителей: " + viewers);
System.out.println("Упрощенное кол-во лайков: " + simpleLikes);
System.out.println("Полное кол-во лайков: " + likes);
}