Проблема вывода данных с сайта путем парсинга

Пользователь

от h0912113 , в категории: JavaScript , 3 месяца назад

Прошу помощи, я совсем плох в JS, и я решил в качестве практики написать своего первого бота для Телеграма. В итоге бот работает без ошибок, до момента, пока я не начинаю вносить изменения. Так уж получилось, что моей задачей было выводить информацию с сайта в чат Телеграма, но я столкнулся с рядом проблем. Когда я хотел сделать отображение ника вместо ID, я решил написать соответствующий код, но вышло так, что у меня стало отображаться еще одно значение, т.е. значение рейтинга с сайта. Я удивленный, пытался понять, как это так. В итоге, когда я пытался все сделать так, как хотел, у меня выдавало ошибку (не совсем ошибку, бот просто не искал информацию с сайта). Я решил оставить ${nickname}, так как мне нужно, чтобы у меня отображалось пиковое значение рейтинга. Однако я столкнулся с большой проблемой - как мне вывести никнейм и заменить его вместо ID на ник. И вторая проблема - это то, что я не могу вывести нынешнее значение рейтинга (я пытался, но у меня бот не ищет информацию).

Код

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
const TelegramBot = require('node-telegram-bot-api');
const axios = require('axios');
const jsdom = require('jsdom');
const { JSDOM } = jsdom;

const token = 'TOKEN';
const bot = new TelegramBot(token, {polling: true});

bot.onText(/\/stats (.+)/, async (msg, match) => {
 const chatId = msg.chat.id;
 const playerId = match[1];
 try {
    const response = await axios.get(`https://corehalla.com/stats/player/${playerId}`);
  const html = response.data;
  const dom = new JSDOM(html);
  const document = dom.window.document;
  const stats = [];
  const element = document.querySelector('h1');
  element.classList.add('text-5xl', 'font-bold');
  const elements = document.querySelectorAll('.font-semibold.text-lg.mt-2, .font-semibold.text-lg.mt-2, .text-4xl.ml-3.text-textVar1');
  for (let elem of elements) {
   const text = elem.textContent;
   stats.push(text);
  }
  const labels = document.querySelectorAll('.text-gray-500.text-sm, .text-gray-500.text-sm, .text-4xl.ml-3.text-textVar1');
  for (let elem of labels) {
   const text = elem.textContent;
   stats.push(text);
  }
  const nickname = document.querySelector('.text-4xl.ml-3.text-textVar1').textContent;
  const reply = `Statistics for player ${playerId}:
Peak ELO: ${nickname}
Level: ${stats[0]}
Experience: ${stats[1]}
Playtime: ${stats[2]}
Wins: ${stats[3]}
Losses: ${stats[4]}
Number of ranked 1v1 matches: ${stats[5]}
Winrate: ${stats[6]}
Playtime: ${stats[7]}
Glory for rating: ${stats[8]}
Glory for wins: ${stats[9]}
Clan experience: ${stats[11]}
Clan experience percentage: ${stats[12]}
Clan: ${stats[13]}
...`;
  bot.sendMessage(chatId, reply);
 } catch (error) {
  console.error(error);
  bot.sendMessage(chatId, 'An error occurred while retrieving statistics');
 }
});


Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от jaren , 3 месяца назад

@h0912113 Не уверен если я точно понял Вашу проблему, но попробуйте данный код:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
const TelegramBot = require("node-telegram-bot-api");
const axios = require("axios");
const jsdom = require("jsdom");
const { JSDOM } = jsdom;

const token = "TOKEN";
const bot = new TelegramBot(token, { polling: true });

bot.onText(/\/stats (.+)/, async (msg, match) => {
  const chatId = msg.chat.id;
  const playerId = match[1];
  try {
    const response = await axios.get(
      `https://corehalla.com/stats/player/${playerId}`
    );
    const html = response.data;
    const dom = new JSDOM(html);
    const document = dom.window.document;
    const stats = [];
    const element = document.querySelector("h1");
    element.classList.add("text-5xl", "font-bold");
    const elements = document.querySelectorAll(
      ".font-semibold.text-lg.mt-2, .font-semibold.text-lg.mt-2, .text-4xl.ml-3.text-textVar1"
    );
    for (const elem of elements) {
      const text = elem.textContent;
      stats.push(text);
    }
    const labels = document.querySelectorAll(
      ".text-gray-500.text-sm, .text-gray-500.text-sm, .text-4xl.ml-3.text-textVar1"
    );
    for (const elem of labels) {
      const text = elem.textContent;
      stats.push(text);
    }
    const playerName = document.querySelector("h1").textContent;
    const nickname = document.querySelector(".text-4xl.ml-3.text-textVar1")
      .textContent;
    const reply = `Statistics for player ${playerName}:
Peak ELO: ${nickname}
Level: ${stats[0]}
Experience: ${stats[1]}
Playtime: ${stats[2]}
Wins: ${stats[3]}
Losses: ${stats[4]}
Number of ranked 1v1 matches: ${stats[5]}
Winrate: ${stats[6]}
Playtime: ${stats[7]}
Glory for rating: ${stats[8]}
Glory for wins: ${stats[9]}
Clan experience: ${stats[11]}
Clan experience percentage: ${stats[12]}
Clan: ${stats[13]}
...`;
    bot.sendMessage(chatId, reply);
  } catch (error) {
    console.error(error);
    bot.sendMessage(chatId, "An error occurred while retrieving statistics");
  }
});