女朋友专属!微信公众号消息推送

➡️➡️➡️本教程参考自:B站 UP主 LuckyRay123 提供的 给女朋友做一个定时推送天气预报的公众号,略有修改!

微信公众号消息推送】系列教程(项目链接:https://github.com/leoatliang/wechat-push

效果图(可自定义),Windows 端显示如下:

1. 准备工作

[Tool 1]: 代码编写(Visual Studio Code) + 运行环境(Node.js)

上述软件/环境的安装配置请自行查阅相关资料,完成后,还需在项目根目录下安装依赖包(axiosmoment):

npm install axios moment

会自动生成 node_modules 文件夹 和 package-lock.jsonpackage.json 文件,即依赖包的版本或其他信息。

[Tool 2]: 微信公众号(测试账号)

有资质的注册服务号,没有的登录测试号(微信公众号注册(订阅号/服务号)微信测试号):

2. 代码编写

项目结构如下:

在这里插入图片描述

说明:

  • config:配置文件,本人信息 + 被推送用户信息 + 消息模板
  • getTokensendMessage:获取 token 和推送消息
  • utils:工具类,例如获取日期、天气预报、恋爱天数、土味情话等
  • node_modulspackage-lock.jsonpackage.json:项目环境,安装完依赖包会自动生成
  • index.js:主程序

2.1 配置 config 参数

[Step 1]: 获取参数 appIDappsecret被推送用户微信号模板ID

1、扫码登录测试号后,会看到如下测试号信息:

2、往下滑,可以看到如下测试号二维码,让被推送用户手动关注,会自动生成微信号(测试的时候一般自己关注):

3、再往下滑,可以看到模板消息接口,点击 新增测试模板,然后会得到 模板ID

今日:{{today.DATA}} 

地区:{{city.DATA}}  天气:{{wea.DATA}}  气温:{{low.DATA}}  ~  {{high.DATA}} 

今天是我们在一起的第 {{days.DATA}} 天啦!

土味情话:{{txt.DATA}}

[Step 2]:config 目录下新建 index.js 文件,依次填入下列4个参数

const params = {
    appid: 'xxxxxxxxxxxxxxxxxx', // 登录测试号就会出现
    secret: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',// 同上
    touser: 'xx-xxxxxxxxxxxxxxxxxx-xxxxxx', // 被推送用户,微信扫码生成
    template_id: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_xxxxxxxxxxx' // 新建 模板消息,生成
};

2.2 获取 token

获取 Access token:access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。

getToken 目录下新建 index.jstoken.json 文件,js 文件代码如下:

const getToken = (params) => {
    return new Promise((resolve, reject) => {
        const tokenFile = path.join(__dirname, 'token.json');
        fs.readFile(tokenFile, 'utf-8', function (err, data) {
            if (err) {
                reject(err);
            } else {
                if (data) {
                    const token = JSON.parse(data);
                    if (token.expires_in > moment().unix()) {
                        resolve(token.access_token);
                        return;
                    }
                }
            }

            const appid = params.appid;
            const secret = params.secret;

            axios.get(`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${secret}`)
                .then(res => {
                    if (res.data && res.data.errcode) {
                        reject(data);
                        return;
                    }
                    resolve(res.data.access_token);
                    const t = res.data;
                    t.expires_in = t.expires_in + moment().unix() - 1200;
                    fs.writeFile(tokenFile, JSON.stringify(t), function (err) {
                        if (err) {
                            reject(err);
                        }
                    })
                })
        })
    })
};

后续项目执行后,获取到的 token 会被保存至 token.json 中,类似于:

{
    "access_token": "xxxxxx",
    "expires_in": 1708519938
}

2.3 模板消息

在获取 模板ID 前,已经创建好了模板消息,那么该如何传递或者这些信息从哪来的呢?具体需求如下:

今日:2024年2月21日 星期三

地区:马鞍山  天气:雪  气温:0  ~  1

今天是我们在一起的第 374 天啦!

土味情话:这是车票,这是发票,你是我最最最可爱的女...

2.3.1 日期

utils 目录下新建 index.js 文件,获取日期的代码编写如下:

const formatWeek = (week) => {
    switch (week) {
        case 1:
            return '星期一'; break;
        case 2:
            return '星期二'; break;
        case 3:
            return '星期三'; break;
        case 4:
            return '星期四'; break;
        case 5:
            return '星期五'; break;
        case 6:
            return '星期六'; break;
        case 0:
            return '星期日'; break;
        default:
            break;
    }
}

const getDate = () => {
    const year = new Date().getFullYear();
    const month = new Date().getMonth() + 1;
    const day = new Date().getDate();

    const week = new Date().getDay();
    return `${year}${month}${day}${formatWeek(week)}`;
}

2.3.2 天气预报

[Step 1]: 点击 天气 API 右上角的 用户中心,注册并登录账号,进入控制台,可以看到 appidappsecret

[Step 2]: 进入 免费实况天气接口 查看如何调用 API

在这里插入图片描述

[Step 3]: 点击 城市ID列表 给出城市编码表及素材下载链接,下载并解压打开,用记事本或 VSCode 打开 city_cn.sql

[Step 4]: 使用 Ctrl + F 搜索你想获取的某个城市的天气状况,记录下 CN 后的9位数字,也就是 cityid

[Step 5]: 同样的,在 index.js 文件中,获取天气预报的代码编写如下

const getWeather = () => {
    return new Promise((resolve, reject) => {

        const appId = 'xxxxxxxx';
        const appSecret = 'xxxxxxxx';
        const cityID = '101220501'; // 马鞍山

        axios.get(`http://v1.yiketianqi.com/free/day?appid=${appId}&appsecret=${appSecret}&unescape=1&cityid=${cityID}`)
            .then(res => {
                const { data } = res;
                resolve({
                    wea: data.wea,
                    low: data.tem_night,
                    high: data.tem_day
                })
            })
            .catch(err => {
                reject(err);
            })
    })
}

注意:appIdappSecretcityID 记得要替换!!!

2.3.3 恋爱天数

同样的,在 index.js 文件中,获取恋爱天数的代码编写如下(别傻乎乎的开始日期不改):

const getLoveDays = () => {
    const startDate = new Date('2023-02-12');
    const currentUTCTime = new Date().toISOString();
    const beijingTime = new Date(new Date(currentUTCTime).getTime() + (8 * 60 * 60 * 1000));

    const oneDayMilliseconds = 24 * 60 * 60 * 1000;
    const daysDiff = Math.floor((beijingTime - startDate) / oneDayMilliseconds);
    return daysDiff.toString();
}

2.3.4 土味情话

[Step 1]: 点击 天聚数行 右上角的 立即注册,注册并登录账号,进入控制台,往下滑点击 我的密钥,可以看到 APIKEY

[Step 2]: 进入 土味情话,先去申请接口,然后再去查看如何调用 API

[Step 3]: 同样的,在 index.js 文件中,获取土味情话的代码编写如下

const getLoveWords = () => {
    return new Promise((resolve, reject) => {

        const apiKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

        axios.get(`https://apis.tianapi.com/saylove/index?key=${apiKey}`)
            .then(res => {
                const { data: { result } } = res;
                resolve(result.content)
            })
            .catch(err => {
                reject(err);
            })
    })
}

注意:apiKey 记得要替换!!!

2.4 发送信息

sendMessage 目录下新建 index.js 文件,代码编写如下:

const sendMessage = (params) => {
    const { access_token, touser, template_id, data = {} } = params;

    return axios.post(`https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=${access_token}`,
        {
            touser,
            template_id,
            data
        })
};

module.exports = {
    sendMessage
}

2.5 主程序

在根目录下新建主程序 index.js,代码编写如下:

const start = async () => {
    let access_token = await getToken(params);
    let { wea, low, high } = await getWeather();
    let loveDays = getLoveDays();
    let loveWords = await getLoveWords();

    const data = {
        today: { value: getDate() },
        city: { value: '马鞍山' },
        wea: { value: wea },
        low: { value: low },
        high: { value: high },
        days: { value: loveDays },
        words: { value: loveWords },
    }

    sendMessage({
        access_token,
        ...params,
        data
    })
        .then(res => {
            if (res.data && res.data.errcode) {
                console.log('发送失败', res.data);
                return;
            }
            console.log('发送成功 - 请在微信上查看对应消息')
        })
        .catch(err => {
            console.log('发送失败', err);
        })
}

start();

3. 项目执行

在根目录运行如下命令:

node ./index.js

iOS / Windows 端效果图如下:


注意事项:

  • Visual Studio Code 必须以管理员身份运行,否则执行 node ./index.js 可能会报错;
  • 模板信息不可以修改,只能删除重新创建,但要及时修改 config/index.js 中的 template_id
  • 两款 API(天气预报 + 土味情话)返回的内容或者请求地址可能会被官方修改,留意一下!

缺点:

  • 测试号 ID 太长、太丑(没办法,没有营业执照且订阅号不支持该功能);
  • 消息颜色不支持自定义(据说从2023年某时候开始,就不再支持修改颜色了);
  • 目前只支持本地电脑手动推送,定时推送后续会更新!

微信公众号注册(订阅号/服务号):https://mp.weixin.qq.com/cgi-bin/registermidpage?action=index&lang=zh_CN

微信测试号:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

获取 Access token:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html

天气 API:http://tianqiapi.com

免费实况天气接口:http://tianqiapi.com/index/doc?version=day

天聚数行:https://www.tianapi.com

土味情话:https://www.tianapi.com/apiview/80


➡️ ➡️ ➡️ 获取源码,微信公众号【程序员LIANG】后台,回复关键字:微信公众号消息推送

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_leoatliang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值