★★★Nodejs发送get请求太快,导致出现验证码.怎么加入间隔时间??★★★

★★★Nodejs发送get请求太快,导致出现验证码.怎么加入间隔时间??★★★

var arr=一些用户id for(var i in arr){ get('http://xxxx/id=’+arr[i]); if(i==arr.length){ callback(‘ok’); } }

get请求太快,怎么加入时间间隔?

4 回复

当然可以!如果你在使用 Node.js 发送 GET 请求时速度过快,导致服务器返回验证码,你可以通过添加时间间隔来解决这个问题。你可以使用 setTimeout 或者第三方库如 async 来实现这一点。

以下是使用原生 Node.js 和 setTimeout 的示例代码:

const https = require('https'); // 或者使用 http 模块

// 示例用户 ID 数组
const arr = [1, 2, 3, 4, 5];

function get(url) {
    return new Promise((resolve, reject) => {
        https.get(url, (res) => {
            let data = '';
            res.on('data', (chunk) => {
                data += chunk;
            });
            res.on('end', () => {
                resolve(data);
            });
        }).on("error", (err) => {
            reject(err);
        });
    });
}

async function processArray(arr) {
    for (let i = 0; i < arr.length; i++) {
        const url = `http://xxxx/id=${arr[i]}`;
        await get(url);
        
        // 添加时间间隔
        if (i < arr.length - 1) {
            await new Promise(resolve => setTimeout(resolve, 1000)); // 间隔1秒
        }
    }
    console.log('ok');
}

processArray(arr);

在这个示例中,我们定义了一个 get 函数来处理 HTTP GET 请求,并返回一个 Promise。然后我们定义了一个 processArray 异步函数来遍历数组中的每个元素,并在每次请求后添加一个 1 秒的时间间隔。这样可以确保每个请求之间有足够的间隔时间,避免触发验证码机制。

如果你希望更灵活地控制时间间隔,可以将间隔时间作为参数传递给 processArray 函数,或者在循环内部动态调整间隔时间。

如果你喜欢使用第三方库,比如 async,也可以实现类似的功能。以下是一个使用 async 库的示例:

const async = require('async');

const arr = [1, 2, 3, 4, 5];
const urlBase = 'http://xxxx/id=';

function get(url, callback) {
    https.get(url, (res) => {
        let data = '';
        res.on('data', (chunk) => {
            data += chunk;
        });
        res.on('end', () => {
            callback(null, data);
        });
    }).on("error", (err) => {
        callback(err);
    });
}

async.eachSeries(arr, (item, callback) => {
    const url = `${urlBase}${item}`;
    get(url, (err, result) => {
        if (err) {
            callback(err);
        } else {
            console.log(`Processed ${item}`);
            callback();
        }
    });

    // 添加时间间隔
    setTimeout(callback, 1000); // 间隔1秒
}, (err) => {
    if (err) {
        console.error('An error occurred:', err);
    } else {
        console.log('All items processed successfully.');
    }
});

在这个示例中,我们使用了 async.eachSeries 方法来逐个处理数组中的每个元素,并在每次处理后添加一个 1 秒的时间间隔。这样可以确保每个请求之间有足够的时间间隔,避免触发验证码机制。


<pre><code> function handle(arr, done) { $.get('http://xxxx/id=’+arr.pop(), function () { setTimeout(function () { arr.length && handle(arr, done) || done(); }, 1000/间隔1秒/); }) } var arr=[一些用户id]; handle(arr, function () { callback(‘ok’); }); </code><pre>

非常感谢

为了防止因频繁发送 GET 请求而触发验证码,可以在每次请求之间添加一个延迟。可以使用 setTimeout 或者 async/await 结合 setTimeout 来实现这一点。

以下是使用 async/awaitsetTimeout 的示例代码:

const axios = require('axios');

// 示例用户ID数组
let arr = [1, 2, 3, 4, 5];

async function fetchWithDelay(arr, delay) {
    for (let i = 0; i < arr.length; i++) {
        await axios.get(`http://xxxx/id=${arr[i]}`);
        // 添加延迟
        await new Promise(resolve => setTimeout(resolve, delay));
    }
    console.log('全部请求完成');
}

// 调用函数,并传入用户ID数组和延迟时间(毫秒)
fetchWithDelay(arr, 1000); // 每次请求之间等待1秒

解释

  • axios.get 用于发送 GET 请求。
  • await 关键字用于等待异步操作完成。
  • new Promise(resolve => setTimeout(resolve, delay)) 创建了一个延迟函数,用于在每次请求之后等待指定的时间。
  • fetchWithDelay 函数通过循环遍历 arr 数组,并对每个元素执行请求和延迟。

这样可以确保每次请求之间有一定的间隔时间,从而避免触发验证码。你可以根据实际情况调整 delay 参数的值。

回到顶部