Nodejs 请教关于微信公众号的模拟登录

Nodejs 请教关于微信公众号的模拟登录

我遇到的情况是,登录成功了,但是页面转向到别的页面就成了登录超时的页面,发送的时候,headers传了Cookie,结果是

{ [Error: socket hang up] code: 'ECONNRESET' }

。代码如下:

  1. 出现登录超时的代码:
https.get({
		hostname:"mp.weixin.qq.com",
		path: "/advanced/advanced?action=dev&t=advanced/dev&lang=zh_CN&token="+token
	},function(res){
		res.on('data', function(d) {
			process.stdout.write(d);
		});
	});
  1. 出现error的代码:
var headers = {
			"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0", 
			"Host": "mp.weixin.qq.com",
			"Connection": "	keep-alive",
			"Cache-Control":"	max-age=0",
			"Accept-Language": "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3",
			"Accept-Encoding": "gzip, deflate", 
			"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 
			"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"};
var options = { 
		hostname:"mp.weixin.qq.com", 
		path: "/advanced/advanced?action=dev&t=advanced/dev&lang=zh_CN&token="+token,
		method: "GET",
		headers: headers
	};
	options.headers["Referer"] = 'https://mp.weixin.qq.com/cgi-bin/home?t=home/index&lang=zh_CN&token='+token;
	options.headers["Cookie"] = exports.cookie;
	var html = '';
	var req=https.request(options, function (res) {
		res.on('data', function (d) {
			process.stdout.write(d);
			if(res.statusCode == 200){
				//exports.beDev(token);
			}
		})
	}).on('error', function (e) { console.error(e); }); 
	req.end();
  1. 出现乱码的代码:
	https.get({
		hostname:"mp.weixin.qq.com",
		path: "/advanced/advanced?action=dev&t=advanced/dev&lang=zh_CN&token="+token,
		headers: {
			"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0", 
			"Host": "mp.weixin.qq.com",
			"Connection": "	keep-alive",
			"Cache-Control":"	max-age=0",
			"Accept-Language": "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3",
			"Accept-Encoding": "gzip, deflate", 
			"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 
			"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
			'Referer': 'https://mp.weixin.qq.com/cgi-bin/home?t=home/index&lang=zh_CN&token='+token,
			'Cookie': exports.cookie
		}
	},function(res){
		res.on('data', function(d) {
			process.stdout.write(d);
		});
	});

期待大神解答!!


3 回复

针对你提到的问题,主要是关于微信公众号模拟登录过程中遇到的一些常见问题,如登录超时、错误处理以及编码问题。下面是基于这些问题的一些解决方案和建议。

登录超时问题

登录超时通常是因为服务器端的会话管理机制导致的。如果你的请求在一段时间内没有活动,服务器可能会认为你的会话已经过期。解决这个问题的一个方法是确保每次请求后都保持活跃连接或重新认证。

错误处理

错误[Error: socket hang up] code: 'ECONNRESET'通常表示网络连接被重置。这可能是由于网络不稳定或者服务器端主动关闭了连接。为了更好地处理这类错误,可以增加一些重试逻辑。

乱码问题

乱码通常是由于字符编码不匹配引起的。确保你在处理响应数据时使用正确的编码方式。

示例代码

以下是一个改进后的示例代码,它包含了错误处理和重试机制:

const https = require('https');
const fs = require('fs');

let token = 'your_token_here';
let cookie = 'your_cookie_here';

function makeRequest(retries = 3) {
    const options = {
        hostname: 'mp.weixin.qq.com',
        path: `/cgi-bin/loginpage?lang=zh_CN&token=${token}`,
        method: 'GET',
        headers: {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0',
            'Host': 'mp.weixin.qq.com',
            'Connection': 'keep-alive',
            'Cache-Control': 'max-age=0',
            'Accept-Language': 'zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3',
            'Accept-Encoding': 'gzip, deflate',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
            'Referer': `https://mp.weixin.qq.com/cgi-bin/home?t=home/index&lang=zh_CN&token=${token}`,
            'Cookie': cookie
        }
    };

    return new Promise((resolve, reject) => {
        const req = https.request(options, res => {
            let data = '';
            res.on('data', chunk => {
                data += chunk;
            });
            res.on('end', () => {
                resolve(data);
            });
        });

        req.on('error', err => {
            if (retries > 0) {
                console.log(`Retrying... (${retries} attempts left)`);
                makeRequest(retries - 1).then(resolve, reject);
            } else {
                reject(err);
            }
        });

        req.end();
    });
}

makeRequest()
    .then(html => {
        console.log(html);
    })
    .catch(err => {
        console.error('Error:', err);
    });

解释

  1. 错误处理:通过递归调用makeRequest函数来实现重试机制。
  2. 编码处理:确保响应数据正确处理并打印出来。
  3. 请求参数:包括了必要的请求头信息,以模拟浏览器行为。

希望这些示例代码和解释能帮助你解决问题。如果还有其他问题或需要进一步的帮助,请随时告诉我。


你的主机是不是国外的?以前国外的主机我也遇到过这种情况。之后换成阿里云的就可以了

对于模拟微信公众号的登录,主要问题在于如何正确处理Cookie、Headers等信息,并且确保整个会话保持一致性和稳定性。根据你的描述,你遇到了登录超时、请求错误(ECONNRESET)以及乱码的问题。

解决方案概述

  1. 确保所有请求都在同一个会话中进行:这意味着所有的请求都需要使用相同的Cookie。
  2. 正确处理HTTPS请求:使用https模块时需要处理好重定向和错误。
  3. 编码问题:确保接收的数据能够正确解码。

示例代码

以下是一个简单的示例,展示如何使用axios库来处理这些情况:

const axios = require('axios');
const qs = require('querystring');

const loginUrl = 'https://mp.weixin.qq.com/cgi-bin/login';
const homeUrl = 'https://mp.weixin.qq.com/cgi-bin/home';

const formData = qs.stringify({
    username: 'your_username',
    password: 'your_password'
});

axios.post(loginUrl, formData, {
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Referer': 'https://mp.weixin.qq.com/'
    },
    withCredentials: true // 确保cookie被携带
}).then(response => {
    if (response.status === 200) {
        return axios.get(homeUrl, {
            headers: {
                'Cookie': response.config.headers['Cookie'],
                'Referer': 'https://mp.weixin.qq.com/'
            },
            responseType: 'document' // 确保可以解析HTML
        });
    }
}).then(response => {
    console.log(response.data); // 打印主页内容
}).catch(error => {
    console.error('Error:', error.message);
});

解释

  1. axios.post:使用axios.post方法模拟登录请求。
  2. withCredentials:确保axios请求能携带Cookie。
  3. axios.get:获取登录后的首页内容,同时带上之前获取的Cookie。
  4. responseType: ‘document’:确保返回的内容能够被正确解析为文档对象。

注意事项

  • 安全性:请不要在公共代码库中暴露你的用户名和密码。
  • 稳定性:实际操作中可能需要处理更多细节,比如验证码、Token验证等。

希望以上示例能够帮助你解决当前的问题。

回到顶部