Чекер проксей на NodeJS работает меньше секунды. Где ошибка?

Рейтинг: 0Ответов: 1Опубликовано: 19.04.2023

Запускаю чекинг фрии проксей на ноде 18. Вот какие npm пакеты стоят : image

После запуска кубика NodeJS . Нода работает меньше секунды и в переменой [[SAVED_CONTENT_GOOD_PROXYS]] по итогу unefined. Ну не может же прокси чекер на 300 проксей отработать меньше секунды, значит он и не начинает проверять прокси) .

Хоть прокся чекеру скармливаю через список [[SAVED_CONTENT]] , хоть в виде списка прям в коде - эффект один , кубик работает меньше секунды! Даже ошибки ни какие в логе не выдаёт.

Проксей для примера здесь мало в коде отобразил, в по факту их более 300 шт. Где ошибка?

Код чекера на NodeJS 18:

    const http = require('http');
    const HttpProxyAgent = require('http-proxy-agent');
    const axios = require('axios');
    //   const SAVED_CONTENT = [[SAVED_CONTENT]];
    const SAVED_CONTENT = ['170.155.2.119:80','164.132.170.100:80','172.245.159.177:80','165.154.236.214:80','209.97.150.167:8080','107.173.80.140:9000'];
    
    const testUrl = 'http://www.google.com';
    const timeout = 1000;
    const goodProxys = [];
    
    async function checkProxies(proxies) {
      const promises = proxies.map(proxy => {
        return new Promise(async resolve => {
          try {
            const response = await axios.get(testUrl, {
              proxy: {
                host: proxy.split(':')[0],
                port: parseInt(proxy.split(':')[1], 10)
              },
              timeout: timeout
            });
    
            if (response.status === 200) {
              goodProxys.push(proxy);
            }
          } catch (error) {
                //   console.log(`Error with proxy ${proxy}:`, error.message);
                [[ERROR_MESSAGE]] = error.message;
                           }
    
          resolve();
        });
      });
    
      await Promise.all(promises);
      return goodProxys;
    }
    
    (async () => {
      const result = await checkProxies(SAVED_CONTENT);
    //   console.log('Good proxies:', result);
      [[SAVED_CONTENT_GOOD_PROXYS]] = result;
    })();

Ответы

▲ 0Принят

Для node v19.8.1,

checkProxyList проверка списка проксей, одновременная и не оптимальная, как у вас

checkProxy проверка конкретного прокси

и я установил таймаут 10секунд, мне кажется так лучше

import axios from 'axios';

try {
  const result = await checkProxyList([
    '170.155.2.119:80',
    '164.132.170.100:80',
    '172.245.159.177:80',
    '165.154.236.214:80',
    '209.97.150.167:8080',
    '107.173.80.140:9000'
  ]);
  console.log(result);
} catch (err) {
  console.error(err);
}

/**
 * @param {Readonly<string[]>} inputProxyList
 * @param {Readonly<string>} [urlForChecking]
 * @param {Readonly<import('axios').AxiosRequestConfig>} [axiosRequestConfig]
 * @returns {Promise<string[]>}
 */
async function checkProxyList(
  inputProxyList,
  urlForChecking,
  axiosRequestConfig
) {
  const checkingResult = await Promise.allSettled(
    inputProxyList.map(
      (x) => checkProxy(x, urlForChecking, axiosRequestConfig)
    )
  );

  const result = checkingResult.reduce(
    (/** @type {string[]} */ acc, x, idx) => {
      if (x.status === 'fulfilled' && x.value === true) {
        acc.push(inputProxyList[idx]);
      }
      if (x.status === 'rejected') {
        console.error(x.reason);
      }
      return acc;
    },
    []
  );

  return result;
}

/**
 * @param {Readonly<string>} inputProxy
 * @param {Readonly<string>} [urlForChecking]
 * @param {Readonly<import('axios').AxiosRequestConfig>} [axiosRequestConfig]
 */
async function checkProxy(
  inputProxy,
  urlForChecking = 'http://www.google.com',
  axiosRequestConfig = { timeout: 10000 }
) {
  if (inputProxy) {
    const [proxyHost, proxyPost = 80] = inputProxy.split(':');
    try {
      const response = await axios.get(urlForChecking, {
        proxy: { host: proxyHost, port: +proxyPost },
        ...axiosRequestConfig,
      });
      return [200, 201].includes(response.status);
    } catch (err) {
      console.warn(`[FAIL] ${inputProxy}: ${err.message}`);
    }
  }
  return false;
}

export {};

Вывод в консоль:

$ node fetch-proxies.js 
[FAIL] 172.245.159.177:80: Request failed with status code 429
[FAIL] 209.97.150.167:8080: Request failed with status code 503
[FAIL] 164.132.170.100:80: timeout of 10000ms exceeded
[FAIL] 107.173.80.140:9000: timeout of 10000ms exceeded
[ '170.155.2.119:80', '165.154.236.214:80' ]

Совет: когда у вас справочник проксей будет большим, вам станет не удобно делать одновременно проверку всех хостов. тогда можно будет организовать очередь выполнения проверок. для таких задач я обычно пользуюсь библиотекой p-queue.