• js版微信测试号推送消息、生日、纪念日、网易云热评、舔狗日记【JavaScript版】保姆级教程 青龙面板做微信测试号推送生日、纪念日



    微信测试号推送消息

    提示:这里可以添加本文要记录的大概内容:

    前段时间在小红书、抖音都有刷到这个微信推送,看了一下网上的版本,基本上都是Python写的,但是我不会Python,学来不及了。

    趁着自己会js,看了些php和python以及java的案例,无非就是请求传参,没啥区别。琢磨一下然后自己整出来


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、申请微信测试号

    测试号名字不能更改,

    快捷入口:微信测试号官网,直接用微信扫码注册登录
    在这里插入图片描述

    注册进去之后,你会获取你的appID,以及secret密钥
    在这里插入图片描述
    记住这两个待会要用

    二、下载nodeJs

    如果有开发经验的就跳过这一步,直接进第三个

    下载nodeJs主要是运行要用到它,待会是直接运行js文件的,基于nodeJs

    1.下载安装包

    nodeJs官网
    在这里插入图片描述
    下载左边的稳定版,安装过程无脑下一步就对了。

    2.检查是否安装成功

    按住win+R
    调出cmd,在cmd中输入 node -v
    显示版本号说明安装成功了
    在这里插入图片描述

    三、设置测试号发送信息的模板

    参考我的
    土味情话、舔狗日记、网易云都是调用的接口,生日倒计时和恋爱纪念日是我用js方法计算得出来的。

    如果有js基础的话看起来一定很简单,如果是it小白的话也不要慌,直接拿去用就好了

    今天是:{{date.DATA}} 
    土味情话:{{QingHua.DATA}} 
    距离生日还有:{{Birthday.DATA}} 天
    今天是我们在一起第:{{jiNianDay.DATA}} 天
    舔狗日记:{{tiangou.DATA}}
    【网易云时间】:{{wangyiyun.DATA}}
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述
    在测试号界面点击添加测试模板,然后复制那个粘贴进去,保存。

    在这里插入图片描述

    四、编写发送消息代码(必须装好nodeJs)

    基于nodeJs的脚本指令,所以必须装好node

    除了nodeJs要安装之外,你还需要一个代码编辑器,这里推荐VSCode或者HBuilder X

    作为在csdn游荡的程序员,这两个东西多多少少有吧。

    在这里插入图片描述
    在这里插入图片描述
    当然,IDEA也行,只是编写代码而已,运行脚本还是可以走cmd的。

    1、编写代码 通用模板-复制可用(白嫖党看这里)

    打开VSCode,创建一个文件夹用来编写代码。
    在这个文件夹里面创建一个js文件,名字叫sendMsg.js

    代码模板

    // 微信测试号发送消息
    const axios = require('axios');
    // 设置跨域请求头
    axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
    // 定义post请求方法
    const axiosPost = function (url, params) {
        return new Promise((resolve, reject) => {
            axios
                .post(url, params)
                .then(res => {
                    resolve(res);
                })
                .catch(err => {
                    reject(err);
                });
        });
    };
    // 定义get请求方法
    const axiosGet = function (url, params) {
        return new Promise((resolve, reject) => {
            axios
                .get(url, {
                    params,
                })
                .then(res => {
                    resolve(res);
                })
                .catch(err => {
                    reject(err);
                });
        });
    };
    //  定义获取token方法
    async function getToken() {
        const params = {
            grant_type: 'client_credential',
            appid: '', // 你的appid  1
            secret: '', // 你的secret 2
        };
        let res = await axiosGet('https://api.weixin.qq.com/cgi-bin/token', params);
        return res.data.access_token;
    }
    
    
    async function templateMessageSend() {
        const token = await getToken();// 获取token
        // 如果需要加其他的api,仿写这个获取token的就行
        const url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=' + token;
        const params = {
            touser: '', // 用户openid 3 就是扫码关注的那个微信号
            template_id: '', // 模板id 4 就是那个测试模板的ID
            // url: 'http://www.baidu.com', // 如果给了链接那么点击消息将会跳转进来,建议不加,不加点了无反应
            topcolor: '#FF0000',// 标题颜色
            data: {
                text1: {
                    "value": "内容1",
                    "color": "#FCA60B"  // 颜色
                },
                text2: {
                    "value": "内容2",
                    "color": "#FCA60B"  // 颜色
                },
                // 以此类推
            },
        };
        let res = await axiosPost(url, params);
        console.log('res: ', res.data);
    }
    //  执行发送订阅消息
    templateMessageSend();
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71

    这个是没有添加任何api接口的简洁模板,其他的都是基于这个添加的。
    如果你想自己编写,就复制这个拿去用,
    在这里插入图片描述
    发送内容的text1,text2就是之前模板里面这 双大括号里面的字段,DATA前面的那一段。看不懂的看下一节

    2、代码(成品)

    // 需要填写的地方已经标出
    // 一共4个地方 appID、appsecret、模板ID、微信用户的openid
    const axios = require('axios');
    const moment = require('moment');
    // 设置跨域请求头
    axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
    // 定义post请求方法
    const axiosPost = function (url, params) {
        return new Promise((resolve, reject) => {
            axios
                .post(url, params)
                .then(res => {
                    resolve(res);
                })
                .catch(err => {
                    reject(err);
                });
        });
    };
    
    // 定义get请求方法
    const axiosGet = function (url, params) {
        return new Promise((resolve, reject) => {
            axios
                .get(url, {
                    params,
                })
                .then(res => {
                    resolve(res);
                })
                .catch(err => {
                    reject(err);
                });
        });
    };
    
    //  定义获取token方法
    async function getToken() {
        const params = {
            grant_type: 'client_credential',
            appid: '', // 你的appid  1
            secret: '', // 你的secret 2
        };
        let res = await axiosGet('https://api.weixin.qq.com/cgi-bin/token', params);
        return res.data.access_token;
    }
    
    // 1、随机一句土味情话
    async function getQingHua() {
        let res = await axiosGet('https://api.uomg.com/api/rand.qinghua?format=json')
        return res.data.content;
    }
    
    // 2、舔狗日记
    async function getTianGou() {
        let res = await axiosGet('http://api.weijieyue.cn/api/tgrj/api.php')
        return res.data;
    }
    
    // 3、网易云热评
    async function getWangYiYun() {
        let res = await axiosGet('https://keai.icu/apiwyy/api')
        return res.data;
    }
    
    // 天气 暂时不可用
    // async function getWeather() {
    //     let res = await axiosGet('https://api.vvhan.com/api/weather?city=长沙');
    //     console.log(res,'4')
    //     return res.data.info;
    // }
    
    // 4、计算还有多少天过生日(公历)
    function getDaysToBirthday(month, day) {
        let now = new Date();
        let thisYear = now.getFullYear();
        //今年的生日
        let birthday = new Date(thisYear, month - 1, day);
        if (birthday < now) {
            birthday.setFullYear(now.getFullYear() + 1);
        }
        let timeDec = birthday - now;
        let days = timeDec / (24 * 60 * 60 * 1000);
        return Math.ceil(days);
    }
    // 5、纪念日
    function getJiNianDays(time) {
        let startTime = new Date(time).getTime()    // 开始时间
        let nowTime = new Date().getTime()          // 今天
        let duration = - moment(startTime).diff(nowTime) / (1000 * 3600 * 24)  // 时间戳转化为天数
        return Math.ceil(duration) // 取整数
    }
    // 6、当前时间
    function getDays() {
        let date = new Date()
        // 获取时间:时分秒
        const hour = date.getHours() < 10 ? "0" + date.getHours() : date.getHours()
        const minute = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes()
        const secound = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds()
        // this.datetime = hour + ':' + minute + ':' + secound
    
        // 获取日期:年月日
        const year = date.getFullYear()
        const month = date.getMonth() + 1
        const day = date.getDate()
        // this.nowDate = month + "月" + day + "日"
        // this.nowYear = year + "年"
    
        // 获取星期几
        const weeks = new Array("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六");
        // weeks[new Date().getDay()]; 
        return (year + "年" + month + "月" + day + "日 " + hour + ':' + minute + ':' + secound + " " + weeks[new Date().getDay()])
    }
    // end定义发送消息模板
    async function templateMessageSend() {
    	// 加await是因为是异步请求,async await是配套使用的
    	// es6语法,不会的没关系,function有async的时候使用时带上await就行
        const token = await getToken();
        const QingHua = await getQingHua();
        const tiangou = await getTianGou();
        const wangyyun = await getWangYiYun();
        const birthday = getDaysToBirthday(6, 8)   // 填入生日(公历)
        const nowTime = getDays()
        const jiNianDay = getJiNianDays('2018-11-25') // 按照格式填入 年-月-日
        // console.log('------------------------------------------')
        // console.log('打印消息: ',QingHua, '--', tiangou, '--', wangyyun, '--', birthday, '---', jiNianDay)
        // console.log('------------------------------------------')
        const url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=' + token;
        const params = {
            touser: '', // 用户openid 3
            template_id: '', // 模板id 4
            // url: 'http://www.baidu.com',
            topcolor: '#FF0000',
            data: {
                date: {
                    "value": nowTime,
                    "color": "#FCA60B"
                },
                QingHua: {
                    "value": QingHua,
                    "color": "#ff1a75"
                },
                Birthday: {
                    "value": birthday,
                    "color": "#1E90FF"
                },
                jiNianDay: {
                    "value": jiNianDay,
                    "color": "#3399cc"
                },
                qinghua: {
                    "value": QingHua,
                    "color": "#33FF33"
                },
                tiangou: {
                    "value": tiangou,
                    "color": "#007f80"
                },
                wangyiyun: {
                    "value": wangyyun.content + '-- by ' + wangyyun.user,
                    "color": "#2B9D4A"
                },
            },
        };
        let res = await axiosPost(url, params);
        console.log('res: ', res.data);
    }
    //  执行发送订阅消息
    templateMessageSend();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169

    这个是跟我一开始编写的模板对应的,可以直接拿来使用。
    api接口以及生日倒计时,纪念日计算,等等都是可以二次开发,期待网友开发出更好的成品,

    测试号发的消息会有文字限制,超出显示…

    五、开始运行

    nodeJs的运行语句是node ***.js
    我们还没装依赖,运行肯定会报错。因为没有node_modules这个文件

    我先运行一遍哈

    1、无依赖运行(会报错)

    在这里插入图片描述
    这里我们安装依赖

    npm install 依赖名
    
    • 1

    例如:npm install axios
    在这里插入图片描述

    2、装好依赖继续运行

    继续运行node ***.js文件
    如果还出现缺少依赖,我们一样的重复上一节,npm install 依赖名,这个就是依赖的安装语句
    在这里插入图片描述
    继续安装moment,这是一个时间计算的js插件,缺什么装什么

    在这里插入图片描述

    六、运行效果

    运行还报错的,出问题的。
    看一下,你们的参数填了没有,总共四个

    1. 你的appid
    2. 你的secret
    3. 用户openid
    4. 模板id
      在这里插入图片描述
      生日和纪念日在这里改,我这里已经填了我自己的

    确保参数都没问题就是运行成功,会弹出消息通知

    请添加图片描述


    可以看到有消息通知来了、点进来看看吧

    在这里插入图片描述
    因为舔狗日记太长了,导致网易云没显示完整,这是一个弊端,微信做了限制吧,所以就这样了。

    字数限制,没办法,后期不要舔狗日记也行,就推送纪念日,生日,天气啥的,天气我没找到稳定的接口,又不想出钱买,所以一直搁置着,干脆就没写了。

    在这里插入图片描述
    重新发了一条,就显示完整了。


    总结

    说难吧,也不难,我之前是在小红薯上看到作者【猪咪不是猪】写的,但是他写的是Python,想看源码,看不太明白,而且翻遍了全网没看到谁用js写,甚至关键字带上js都找不到这类型的文章,干脆自己搞一个js版,后面翻微信测试号的开发文档,自己在看了若干的axios请求的文章。做了个成品。
    这个是基于nodeJs,在本地运行,我看到很多人都是github上的action自动运行,那个懒得搞。

    我刚好有服务器,干脆丢服务器上做定时任务了,这不舒舒服服

    1、部署到青龙面板

    在这里插入图片描述
    在脚本管理这里,点击加号,新增一个脚本文件,名字叫 sendWX.js,一定要带上js后缀。
    然后把我的【成品】代码粘贴进去,注意不是模板。是成品
    在这里插入图片描述
    点击保存之后,来任务界面,新建一个定时任务

    命令:task sendWX.js
    时间:0 8 * * * 表示每天早上八点整运行
    在这里插入图片描述

    2、执行定时任务

    在这里插入图片描述
    因为是面板,所以也需要安装依赖
    报错了,是因为没有依赖,青龙面板装依赖不难,很简单的。

    在这里插入图片描述
    不会的看我教程,最新的
    青龙面板安装依赖教程

    3、青龙面板发送消息成功

    在这里插入图片描述
    可以看到已经发送成功了

    在这里插入图片描述

    为啥这个舔狗日记会变成这样,这个我也不太清楚,可能是在青龙面板上执行的时候出问题了。又可能是访问次数太多了。刚刚一直调试就这样了。实在不行可以就把舔狗日记删了。土味情话也没出问题

    【舔狗日记】字数多还不讨好。不如搞个保安日记哈哈。

    教程非常保姆级,不会的就在评论区问吧

  • 相关阅读:
    CentOS 系统如何在防火墙开启端口
    Windows搭建hexo教程
    docker部署多个node-red操作过程
    springboot+shiro+swagger+redis+vue+element完成权限系统
    数据结构 栈和队列上
    基于Pycharm运行李沐老师的深度学习课程代码
    大文件上传,前端vue 做分片上传
    20220803模拟
    Web前端小组考核总结
    华为审核被拒提示: 您的应用存在(最近任务列表隐藏风险活动)的行为,不符合华为应用市场审核标准
  • 原文地址:https://blog.csdn.net/qq_51055690/article/details/126849898