// ==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; } }); })();