当域名被微信封禁时,访问的链接会先经过微信服务器检测,如果正常就放行,否则会重定向跳转到下面这个链接(修改这个链接的参数,有趣的现象会发生)https://weixin110.qq.com/cgi-bin/mmspamsupport-bin/newredirectconfirmcgi?main_type=2&evil_type=20&source=2&url=htt也就是这个万恶的页面
想到两个解决方案
通过流量监测,但对于流量不太大或波动很大的网站,很容易误报,而且有很大的时间滞后性
通过模拟器来尝试用微信APP来访问源网站,如果发现异常(重定向或截图异常或抓包出现weixin110相关等),则直接报警,但这部分的实现成本应该比较高(自己没有亲自尝试)
原理
回到刚才提到重定向方式,即访问的域名会首先经过微信服务器的检测,前提是只有打开的过程中才会检测,这正是这件事儿的难点。换个思路想下,如果我们能够让微信自己的域名经过微信的检测,那么这件事就成了。翻遍了微信官方各种api,功夫不负有心人,找到了【长链接转成短链接】,可以把我们的链接转成微信自己的链接,这样判断短链接的重定向链接即可得知是否被封禁。
实现方案
长链转短链需要三个参数
access_token是从微信获取来的,获取access_token需要在微信后台配置白名单,并且每天限额是1000000次。
附上代码
获取access_token
/**
* 根据appid和app appsecret来获取acess_token
* return @param {String}
*/
async getAccessToken() {
let query = {
appid: this.appid,
secret: this.appsecret,
grant_type: 'client_credential'
};
let url = `https://api.weixin.qq.com/cgi-bin/token?${querystring.stringify(query)}`;
return await this.request(url);
}
长链转短链
/**
* 通过微信api生成短链
* @param {String} req_url 待检测url
*/
async createShortUrl(req_url) {
var requestData = {
"access_token": this.access_token,
"action": "long2short",
"long_url": req_url
}
const url = `https://api.weixin.qq.com/cgi-bin/shorturl?access_token=${this.access_token}`;
let body = await this.request(url, {
method: "POST",
json: true,
headers: {
"content-type": "application/json",
},
body: requestData
});
return body && body.short_url;
}
检测重定向链接来判断是否被微信封禁
/**
* 根据重定向之后的host是否为weixin110.qq.com来检测url是否被微信封禁
* @param {String} url 待检测短链接url
*/
checkDomainBanned(url) {
return new Promise(function (resolve, reject) {
return request(url, function(err, res, body) {
if (!err) {
if (res && res.request && res.request.uri && res.request.uri.host === 'weixin110.qq.com') {
resolve({ code: -1, msg: 'banned' });
} else {
resolve({ code: 0, msg: 'ok' });
}
} else {
reject(err);
}
})
})
}
搞定!