微信公众号会员信息导出[Wechat_offical_account_VIP_info_export]

导出微信公众号的所有会员卡信息,保存为csv格式

目前為 2022-08-29 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         微信公众号会员信息导出[Wechat_offical_account_VIP_info_export]
// @namespace    https://github.com/xiaoxx970/wechat_vip_info_export
// @version      1.1
// @description  导出微信公众号的所有会员卡信息,保存为csv格式
// @author       Xiaoxx
// @match        https://mp.weixin.qq.com/merchant/membercardmgr?*
// @grant        none
// @license      by-nc-sa
// ==/UserScript==

(function () {
    'use strict';
    function getCookie(c_name) {
        if (document.cookie.length > 0) {
            var c_start = document.cookie.indexOf(c_name + "=")
            if (c_start != -1) {
                c_start = c_start + c_name.length + 1
                var c_end = document.cookie.indexOf(";", c_start)
                if (c_end == -1) c_end = document.cookie.length
                return unescape(document.cookie.substring(c_start, c_end))
            }
        }
        return ""
    }

    function setCookie(c_name, value) {
        var expiredays = 365
        var exdate = new Date()
        exdate.setDate(exdate.getDate() + expiredays)
        document.cookie = c_name + "=" + escape(value) +
            ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString())
    }

    function read_info() {
        var info = document.getElementsByClassName("msg_pre_view")[0].innerText
        var info_array = info.split("\n") // 转换信息为数组
        //会员详情页面没有性别项,填入默认值:男
        let find_sex_index = info_array.findIndex(item => item == "性别");
        if (find_sex_index == -1) {
            info_array.splice(8, 0, '性别', '无');
        }
        //会员详情没有生日项,填入默认值:1900-01-01
        let find_birth_index = info_array.findIndex(item => item == "生日");
        if (find_birth_index == -1) {
            info_array.splice(10, 0, '生日', '1900-01-01');
        }

        info_array[1] = info_array[1].replace(" ", "") // 删掉会员名后面小笔的图标
        info_array[info_array.length - 3] = info_array[info_array.length - 3].replace("发消息", "") // 删除按钮标签里的文字

        var info_head = [];  //标题项数组
        var info_es = [];  //数据项数组

        var info_no = info_array["length"] / 2
        for (var i = 0; i < info_no; i++) {
            info_head[i] = info_array.splice(0, 1)[0]; // 偶数行为标题
            info_es[i] = info_array.splice(0, 1)[0]; // 奇数行为数值
        }

        var card_no = document.getElementsByClassName("msg_pre_view")[1].getElementsByTagName("span")[1].innerText
        var card_point = parseInt(document.getElementsByClassName("msg_pre_view")[1].getElementsByTagName("span")[2].innerText)

        info_head.push("会员号", "积分")
        info_es.push(card_no, card_point)

        var csv = info_es.join(",") //把数组转换逗号分隔的字符
        // console.log("info_es:",info_es)
        return csv
    }

    function getDownloadUrl(csvData) {
        var _utf = "\uFEFF"; // 为了使Excel以utf-8的编码模式,同时也是解决中文乱码的问题
        if (window.Blob && window.URL && window.URL.createObjectURL) {
            csvData = new Blob([_utf + csvData], {
                type: 'text/csv'
            });
            return URL.createObjectURL(csvData);
        }
    }

    function SaveAs(fileName, csvData) { // 保存scv文件用
        var Sys = {};
        var ua = navigator.userAgent.toLowerCase();
        var s;
        (s = ua.match(/chrome\/([\d.]+)/)) ? Sys.chrome = s[1] : 0; // 这里直接指定了chrome
        var bw = Sys;
        var alink = document.createElement("a");
        alink.id = "linkDwnldLink";
        alink.href = getDownloadUrl(csvData);
        document.body.appendChild(alink);
        var linkDom = document.getElementById('linkDwnldLink');
        linkDom.setAttribute('download', fileName);
        linkDom.click();
        document.body.removeChild(linkDom);
    }

    window.addEventListener('load', function () {
        var step = parseInt(getCookie("step"))
        var page = parseInt(getCookie("page"))//页数计算器
        var file = parseInt(getCookie("file"))//文件计数器
        var csv = '';

        if (getCookie("page") == "") {
            page = 1;
            setCookie("page", page);
        }

        if (getCookie("file") == "") {
            file = 1;
            setCookie("file", file);
        }

        if (window.location.search.has("action=user_list")) { // 分支1:在会员列表页
            if (getCookie("step") == "") {
                step = 1;
                setCookie("step", step);
            }

            if (step > 10) { // 去往下一页
                step = 1;
                page++;
                const N = 10;          //每个10页保存一次文件,可以根据会员总数进行调整
                if ((page - 1) / file == N) {
                    let file_start_no = file * N * 10 - (N * 10 - 1);
                    let file_end_no = file * N * 10;
                    csv = localStorage.getItem("csv")
                    csv = "会员,地区,姓名,手机,性别,生日,状态,是否关注,标签,会员号,积分\n" + csv
                    SaveAs("vip" + file_start_no + "-" + file_end_no + ".csv", csv)
                    localStorage.removeItem("csv")
                    file++;
                    setCookie("file", file);
                }

                setCookie("step", step);
                setCookie("page", page);

                try {
                    document.getElementById("js_next_page").click()
                }
                catch (err) {
                    alert("导出完成,下载csv文件")
                    csv = localStorage.getItem("csv")
                    csv = "会员,地区,姓名,手机,性别,生日,状态,是否关注,标签,会员号,积分\n" + csv
                    SaveAs("viplast.csv", csv)
                }
                console.log("next page", page, file);
                return // 这个return必须要否则下一页的点击速度赶不上去详情页的速度
            }
            console.log("第" + page + "页,第" + step + "行")
            setCookie("back_url", window.location.href)
            try {
                window.location.href = document.getElementsByClassName("tbody")[0].getElementsByTagName("tr")[step - 1].getElementsByClassName("td_panel")[4].getElementsByTagName("a")[0].href //去往详情页
            }
            catch (err) {
                alert("导出完成,下载csv文件")
                csv = localStorage.getItem("csv")
                csv = "会员,地区,姓名,手机,性别,生日,状态,是否关注,标签,会员号,积分\n" + csv
                SaveAs("viplast.csv", csv)
            }
            return
        }
        if (window.location.search.has("action=user_detail")) { // 分支2:在会员详情页
            step++;
            setCookie("step", step)

            /*在这里做事情*/
            csv = localStorage.getItem("csv")
            if (csv == null) {
                csv = ""
                localStorage.setItem("csv", csv)
            }
            csv = csv + "\n" + read_info()
            localStorage.setItem("csv", csv) // 用localstorage存储csv
            console.log("back", page + '页')
            window.location.href = getCookie("back_url")
            //window.history.back();//后退
            //return
        }
    }, false);
}
)();