// ==UserScript==
// @name 微信公众号粉丝查看工具
// @namespace https://mp.weixin.qq.com/cgi-bin/user_tag?action=get_all_data
// @version 0.1.2
// @description 微信公众号粉丝查看工具,可查看用户关注时间和可导出每页用户数据
// @author Wilson
// @match https://mp.weixin.qq.com/cgi-bin/user_tag?action=get_all_data*
// @icon https://img.icons8.com/fluent/48/000000/user-male-circle.png
// @require https://cdn.jsdelivr.net/npm/jquery@1.9.1/jquery.min.js
// @run-at document-start
// @grant GM_xmlhttpRequest
// @grant unsafeWindow
// @downloadURL none
// ==/UserScript==
(function() {
'use strict';
//用户数据,记录每次变更的数据
unsafeWindow.userData = [];
//添加关注信息
function addFllowInfo(userList) {
for (let i in userList) {
//添加关注时间
let user = userList[i];
user.user_openid = user.user_openid || user.id;
user.user_create_time = user.user_create_time || user.create_time;
let localDate = new Date(user.user_create_time * 1000).toLocaleString();
//console.log(user.user_create_time, user.user_openid);
let userName = document.querySelector(".user_info a[data-fakeid=" + user.user_openid + "]");
//console.log(userName, user.user_openid);
if (userName) userName.innerHTML += ' (' + localDate + ')';
}
//导出按钮
$(".tool_area .pagination").append('导出');
}
//监听分页用户(ajax)
//var lastUserUrl = "";
(function(open) {
XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
this.addEventListener("readystatechange", function() {
//console.log(this.readyState, this.status, this);
if (this.readyState==4 && this.status==200 && url.indexOf("ction=get_user_list") !== -1) {
let json = JSON.parse(this.response);
//console.log(this.readyState, this.status, json);
let userList = json.user_list.user_info_list || [];
setTimeout(function(){
addFllowInfo(userList);
}, 400);
unsafeWindow.userData = userList;
unsafeWindow.wx_user_export_page++;
}
/*
let userUrl = document.location.origin + url;
if (lastUserUrl != userUrl && url.indexOf("ction=get_user_list") !== -1) {
console.log(userUrl);
GM_xmlhttpRequest({
method: "get",
url: userUrl,
onload: function(res){
if(res.status === 200){
console.log('sucess')
let json = JSON.parse(res.response);
let userList = json.user_list.user_info_list || [];
addFllowInfo(userList);
unsafeWindow.userData = userList;
unsafeWindow.wx_user_export_page++;
}else{
console.log('error')
console.log(res)
}
},
onerror : function(err){
console.log('error')
console.log(err)
}
});
//$.getJSON(userUrl, function(data){
//console.log(data);
//$.each(data.items, function(i,item){
// });
//});
lastUserUrl = userUrl;
}
*/
}, false);
open.call(this, method, url, async, user, pass);
};
})(XMLHttpRequest.prototype.open);
//导出用户数据
unsafeWindow.wx_user_export_page = 1;
unsafeWindow.wx_user_export = function() {
let jsonData = unsafeWindow.userData;
//列标题,逗号隔开,每一个逗号就是隔开一个单元格
let str = `姓名,关注时间,openid,头像图片\n`;
for (let i in jsonData) {
let user = jsonData[i];
user.user_openid = user.user_openid || user.id;
if (!user.user_openid) continue;
user.user_create_time = user.user_create_time || user.create_time;
let localDate = new Date(user.user_create_time * 1000).toLocaleString();
user.user_name = user.user_name || user.nick_name;
console.log();
user.user_head_img = user.user_head_img || document.location.origin + document.querySelector(".user_info img[data-id=" + user.user_openid + "]").src;
str += `${user.user_name},${localDate},${user.user_openid},${user.user_head_img}\n`;
}
//encodeURIComponent解决中文乱码
let uri = 'data:text/csv;charset=utf-8,\ufeff' + encodeURIComponent(str);
//通过创建a标签实现
var link = document.createElement("a");
link.href = uri;
//对下载的文件命名
link.download = "微信公众号粉丝第" + unsafeWindow.wx_user_export_page + "页.csv";
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
//第一页用户数据(从js变量获取)
window.addEventListener("load", function() {
if (wx && wx.cgiData && wx.cgiData.user_list) {
let userList = wx.cgiData.user_list || [];
addFllowInfo(userList);
unsafeWindow.userData = userList;
}
});
})();