Node.js を使用する場合


私はあなたを愛しています. Этот бот имеет такую фичу: поздравляет с каким-нибудь праздником на этот день.私たちは、あなたが私たちのことを知っていることを知っています.今日は、あなたが私たちの人生を楽しんでいるということです.あなたは私たちのことをよく知っています.
Итак алгоритм этой работы будет таким:
  • 1 日 1 日 31 日 (29 日 29 日)
  • Сформировать список ссылок для первых COUNT_REQUEST 日
  • 日付
  • COUNT_REQUEST 日付
  • Запомнить праздники
  • Подождать DELAY_REQUEST секунд (ведь у меня цель не задосить сайт, а парсить)
  • Счётчик цикла увеличить на COUNT_REQUEST
  • JSON.

  • JS を使用してください.

    パーセンテージと詳細:



    const COUNT_REQUEST = 2;
    const DELAY_REQUEST = 20000;
    
    /**
     * Прибавить в дате countDays дней
     * @param {Date} date
     * @param {number} countDays
     * @returns {Date}
     */
    export function addDay(date, countDays = 1) {
      const newDate = new Date(date);
      return new Date(newDate.setDate(newDate.getDate() + countDays));
    }
    
    
    const startDate = new Date("2020-01-01");
    const endDate = new Date("2020-12-31");
    
    let loop = new Date(startDate);
    while (loop <= endDate) {
      loop = addDay(loop, COUNT_REQUEST);
      await delay(DELAY_REQUEST);
    }
    

    2. Сформировать список ссылок для первых COUNT_REQUEST 日



    /**
     * @typedef {Object} UrlData
     * @property {Date} date - Запрашиваемый день
     * @property {string} url - Ссылка
     */
    
    /**
     * Получить массив ссылок для countDays дней
     * @param {Date} startDate С какой даты начинать делать ссылки
     * @param {number} countDays Сколько ссылок спрашивать
     * @param {Date} endDate За какую дату не заходить
     * @returns {UrlData}
     */
    export function getUrls(startDate, countDays, endDate) {
      //--- Текст функции
      return urls;
    }
    

    3. 日付を指定して COUNT_REQUEST 日付を指定する



    node-fetchnode-html-parser .
    次のバージョンは、nodejs AbortController の 16 番目のバージョンです.また、setTimeout を使用することをお勧めします.

    import fetch from "node-fetch";
    import { parse } from "node-html-parser";
    
    /**
     * Запрос списка праздников
     * @param {string} url
     * @param {Date} date
     * @returns {String[]}
     */
    export async function getHolydays(url, date) {
      // Для отмены фетча
      const cancelFetch = new AbortController();
      // Промис запроса к сайту
      const promise = fetch(url, {
        timeout: REQUEST_TIMEOUT,
        signal: cancelFetch.signal,
      });
      // Время ожидания
      const timeout = setTimeout(() => {
        cancelFetch.abort();
      }, WAIT_REQUEST_TIMEOUT);
      try {
        const response = await promise;
        // Получить текст HTML
        const htmlContent = await response.text();
        // Получить структуру DOM
        const root = parse(htmlContent);
        // Массив праздников: DOM-элементы
        const source = root.querySelectorAll(".holydays >span");
        // Массив праздников: текст
        const holidays = source.map((element) => element.textContent);
        return { holidays, day: date.getDate(), month: 1 + date.getMonth() };
      } catch (e) {
        console.log("FetchError :>> ", date);
        return null;
      } finally {
        clearTimeout(timeout);
      }
    }
    
    // Получить список праздников из массива ссылок
        const promisesOfHolidays = await Promise.all(
          urlsData.map(async (ud) => await getHolydays(ud.url, ud.date))
        );
    


    4. Запомнить праздники



    Результат собирается в массив

    let holidayData = [];
    ///
    const promisesOfHolidays = await Promise.all(
        urlsData.map(async (ud) => await getHolydays(ud.url, ud.date))
        );
    holidayData = [
          ...holidayData,
          ...promisesOfHolidays.filter((r) => r !== null),
        ];
    


    5. DELAY_REQUEST を確認する



    Использую @stanislavkarol/delay

    7. JSON を使用することをお勧めします。




    import fs from "fs";
    import { fileURLToPath } from "url";
    
    const __filename = fileURLToPath(import.meta.url);
    const __dirname = dirname(__filename);
    
    if (!fs.existsSync(`${__dirname}/../json`)) {
      fs.mkdirSync(`${__dirname}/../json`);
    }
    
    fs.writeFile(
      `${__dirname}/../json/holidays.json`,
      JSON.stringify(holidayData),
      (err) => {
        if (err) throw err;
        console.log("Data written to file");
      }
    );
    


    Всё вместе, в рабочем виде, на гитхаб .