➡️➡️➡️本教程参考自:B站 UP主 LuckyRay123 提供的 给女朋友做一个定时推送天气预报的公众号,略有修改!
【微信公众号消息推送】系列教程(项目链接:https://github.com/leoatliang/wechat-push)
效果图(可自定义),Windows 端显示如下:
1. 准备工作
[Tool 1]: 代码编写(Visual Studio Code) + 运行环境(Node.js)
上述软件/环境的安装配置请自行查阅相关资料,完成后,还需在项目根目录下安装依赖包(axios
和 moment
):
npm install axios moment
会自动生成 node_modules
文件夹 和 package-lock.json
、package.json
文件,即依赖包的版本或其他信息。
[Tool 2]: 微信公众号(测试账号)
有资质的注册服务号,没有的登录测试号(微信公众号注册(订阅号/服务号)、微信测试号):
2. 代码编写
项目结构如下:
说明:
config
:配置文件,本人信息 + 被推送用户信息 + 消息模板getToken
和sendMessage
:获取 token 和推送消息utils
:工具类,例如获取日期、天气预报、恋爱天数、土味情话等node_moduls
、package-lock.json
和package.json
:项目环境,安装完依赖包会自动生成index.js
:主程序
2.1 配置 config 参数
[Step 1]: 获取参数 appID
、appsecret
、被推送用户微信号
和 模板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.js
和 token.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 右上角的 用户中心
,注册并登录账号,进入控制台,可以看到 appid
和 appsecret
[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);
})
})
}
注意:
appId
、appSecret
和cityID
记得要替换!!!
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/apiview/80
➡️ ➡️ ➡️ 获取源码,微信公众号【程序员LIANG】后台,回复关键字:微信公众号消息推送