302请求跳转带上刚种下的cookie

最近在写爬虫的时候,发现一些网站喜欢使用302重定向,并且在重定向的过程中种下cookie,如果重定向后不带上cookie , 很容易出现安全认证。于是封装了一个重定向携带cookie 函数。

const fetch = require('node-fetch');
const { CookieJar } = require('tough-cookie');
const { URL } = require('url');

const cookieJar = new CookieJar();

async function fetchWithRedirect(url, options = {}, prevDomain = '') {
  const mergedOptions = {
    ...options,
    redirect: 'manual', // 禁止自动跟随重定向
    headers: {
      ...options.headers,
      Cookie: await cookieJar.getCookieString(url), // 获取当前 URL 对应的 Cookie 字符串
    },
  };

  const response = await fetch(url, mergedOptions);

  if (response.status >= 300 && response.status < 400 && response.headers.get('location')) {
    let redirectUrl = response.headers.get('location');

    // 处理相对路径的重定向
    if (!redirectUrl.startsWith('http')) {
      const parsedUrl = new URL(url);
      const prevOrigin = parsedUrl.origin || `${parsedUrl.protocol}//${parsedUrl.host}`;
      redirectUrl = prevOrigin + redirectUrl;
    }

    // 更新 Cookie 管理器的状态,从响应中获取并设置 Cookie
    const cookieHeaders = response.headers.raw()['set-cookie'] || [];
    await Promise.all(cookieHeaders.map((cookie) => cookieJar.setCookie(cookie, redirectUrl)));

    const redirectedResponse = await fetchWithRedirect(redirectUrl, options, new URL(redirectUrl).origin);

    return redirectedResponse;
  }

  return response;
}

https://blog.csdn.net/ssdpangdada/article/details/130282204

Leave a Comment

邮箱地址不会被公开。 必填项已用*标注