Nodejs 模拟登录问题请教

Nodejs 模拟登录问题请教

想用node写一个模拟登录人人之类的程序碰到的几个问题:

  1. 当返回状态码是302时要怎么弄,要新开一个链接吗?
  2. 人人貌似使用cookie来检测账号,怎么把cookie存到本地
6 回复

当然可以。在使用 Node.js 进行模拟登录时,遇到的状态码为 302 的情况通常表示服务器需要重定向到另一个 URL。为了处理这种情况,我们需要追踪重定向并确保我们能够获取到最终页面的数据。另外,对于像人人网这样的网站,它们通常通过 Cookie 来管理会话,因此我们需要正确地存储和传递这些 Cookie。

1. 处理 302 状态码

我们可以使用 axiosrequest 这样的库来处理 HTTP 请求,并且通过设置 followRedirect 参数来自动跟随重定向。以下是使用 axios 的示例:

const axios = require('axios');

async function login() {
    try {
        const response = await axios({
            method: 'POST',
            url: 'https://example.com/login', // 替换为实际的登录URL
            data: {
                username: 'your_username',
                password: 'your_password'
            },
            maxRedirects: 5, // 设置最大重定向次数
            validateStatus: function (status) {
                return status >= 200 && status < 400; // 只接受2xx状态码
            }
        });

        console.log(response.data); // 输出登录后的页面数据
    } catch (error) {
        console.error(error);
    }
}

login();

在这个示例中,axios 会自动处理重定向,并且只会接收 2xx 系列的状态码。如果状态码不在 200-399 范围内,validateStatus 函数将抛出错误。

2. 存储和传递 Cookie

为了存储和传递 Cookie,我们可以使用 axios 的拦截器功能。以下是如何配置拦截器以保存 Cookie 并在后续请求中使用它们:

const axios = require('axios');
const qs = require('qs'); // 用于序列化POST数据

// 创建一个axios实例
const instance = axios.create({
    baseURL: 'https://example.com', // 基础URL
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
    }
});

// 添加请求拦截器
instance.interceptors.request.use(config => {
    if (config.headers.cookie) {
        config.headers.Cookie = config.headers.cookie;
    }
    return config;
});

// 添加响应拦截器
instance.interceptors.response.use(response => {
    if (response.headers['set-cookie']) {
        response.config.headers.cookie = response.headers['set-cookie'].join('; ');
    }
    return response;
});

async function login() {
    try {
        const response = await instance.post('/login', qs.stringify({
            username: 'your_username',
            password: 'your_password'
        }));

        console.log(response.data); // 输出登录后的页面数据
    } catch (error) {
        console.error(error);
    }
}

login();

在这个示例中,我们创建了一个 axios 实例,并添加了请求和响应拦截器。请求拦截器会在发送请求前检查是否有 Cookie,并将其添加到请求头中。响应拦截器会在接收到响应后检查是否有新的 Cookie,并将其保存到请求头中以便后续请求使用。

这样,我们就能够处理重定向并正确管理 Cookie,从而实现模拟登录的功能。


  • 302转向:
res.statusCode = 302;
res.setHeader('location', '要跳转到的网址');
res.end();

浏览器在收到这个响应之后,会自动调整到location响应头中指定的网址 使用express示例:res.redirect('要调整到的网址', 302);

  • 设置Cookie:
res.setHeader('cookie', 'cookie内容');

浏览器在收到响应之后,会将该Cookie保存到本地 使用express示例:res.cookie('名称', '值', {maxAge: 3600000});

  • 不明白你所说的模拟登录是指要实现一个类似人人网那样的登录功能,还是你要通过你的程序登录到人人网。

谢谢。 是想让程序登录到人人网, 以前用python的urllib2模块时,可以自动跳转,用node的request不会自动跳转

res.setHeader('cookie', 'cookie内容');

我这边通不过啊!提示has no method

请问是怎么回事啊?

我这边也有相近的问题,明明登录成功了,跳转到 redirecturl 就一直是登录超时的页面。想办法把cookie带上,也是各种问题。

对于这个问题,你可以使用axios或者request这样的库来处理HTTP请求,并且使用follow-redirects来处理重定向。另外,为了处理cookie,你可以使用cookie-jar或者tough-cookie

以下是一个简单的示例代码:

const axios = require('axios');
const followRedirects = require('follow-redirects');

async function login() {
    const cookieJar = new followRedirects.jar();
    
    try {
        const response = await axios({
            method: 'post',
            url: 'https://www.renren.com/PLogin.do',
            data: 'email=yourEmail&password=yourPassword',
            withCredentials: true,
            jar: cookieJar,
            maxRedirects: 10
        });

        console.log(response.status); // 打印响应状态码
        console.log(cookieJar._jar.store.idx); // 打印存储的cookies
        
    } catch (error) {
        console.error(error);
    }
}

login();

这段代码首先创建了一个新的cookie罐。然后它尝试向目标网站发送POST请求。在请求中,我们设置了withCredentials: true,这使得axios在发送请求时会带上cookie信息。同时,我们也设置了jar属性为之前创建的cookie罐,这样axios就会将从服务器收到的cookie保存在这个cookie罐里。如果服务器返回了302状态码(表示重定向),那么axios会自动处理这个重定向并发送新的请求。如果发送请求的过程中出现了错误,那么它会被捕获并在控制台中打印出来。

关于如何将cookie存到本地,你可以选择将cookie字符串序列化后保存到文件或数据库。但是这里并没有直接展示这部分代码。

回到顶部