mysql 获取最新文章_Node微信公众号开发 - 定时获取最新文章同步到MySQL数据库

0、介绍

8fab7eb3913d35e5c01b0a1459d21ad6.png

​ ​ 最近有一个需求:把5个公众号的所有文章定时同步到小程序的数据库里,10分钟同步一次。实现这个需求当时我想了两种方案

方案一:使用Puppeteer就所以的历史文章爬下来,然后解析入库。

方案二:通过微信公众号平台提供的接口定时获取数据,然后插入到小程序数据库中。这两种方案中显然是方案二最方便的,本文主要讲解方案二实现过程。

​ 技术栈:Node + MySQL + 微信公众号接口

1、微信公众平台后台配置

859d59cb91fd80f8d2eaa3951dc1c7ca.png

​ 首先需要登录到你的微信公众平台,进行一些开发相关的配置。登录微信公众平台后,在左侧菜单中打开【开发】-【基本配置】

e7ede64753ce5f1bba00465a539ff608.png

打开的页面如下图所示,下图涉及到了一些敏感信息,所以我做了一些修改

d06f72e6e8dca29611f6d5b3d286e7d8.png

​ 在【基本配置】里,我们主要需要配置【开发者密码(AppSecret)】和IP白名单,因为我们在调用微信公众平台的接口之前需要获取access_token,在调用接口时access_token传递过去。

1.1 开发者密码(AppSecret)

fd11d2e888f8907c6e6cff6b81aef89e.png

dce466c456d8f1ef79f03d2a9208fa31.png

2b8c64135cce34be5437c5da97fd67e7.png

3f09df5464c59f1566c038933920390a.png

b9b7645c296822aa441b1ca06a7c2c01.png

1.2 IP白名单配置

​ IP白名单:限制微信公众平台接口调用的IP;你要想调用微信开发者平台的接口,你就必须把调用接口机器的公网IP配置到IP白名单里。

18f1ed6076f2686a0c14ae703a675cbb.png

上图我把47.50.55.11这台机器配置到IP白名单里,这样47.50.55.11这台机器就可以调用微信公众平台的相关接口了。 到目前为止,公众号开发的基本配置就配置好了。

2、获取access_token

​ access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。这是官网的详细介绍:https://mp.weixin.qq.com/wiki...

​ 公众号可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在“微信公众平台-开发-基本配置”页中获得(需要已经成为开发者,且帐号没有异常状态)。调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单中,点击查看设置方法,否则将无法调用成功。

​ 获取access_token每日调用上限是2000次,具体情况可以在【开发】-【接口权限】中查看,在这里可以查看到所有接口

10704bac6a7e152e1528a3bcbeadc29b.png

​ 开始撸码,新建一个文件夹,并通过npm初始化项目:

e3d50651e7d34c1107c9816a1d5ac01e.png

在MpWeixin.js文件中创建实现获取access_token功能,具体流程如下图所示:

c0517e418a8560b31fbe5aaad8802c48.png

MpWexin.js 实现代码如下:

const path = require('path');

const fe = require('fs-extra');

const axios = require('axios');

class MpWeixin {

/**

* @param appID 开发者ID(AppID)

* @param appSecret 开发者密码(AppSecret)

*/

constructor(appID,appSecret) {

this.appID = appID;

this.appSecret = appSecret;

}

/**

*读取本地磁盘上access_token

*/

getAccessTokenForLocalDisk(){

let accessTokenFile = null;

try {

//读取当前目录下config/token文件中的token文件

accessTokenFile = fe.readJsonSync(path.resolve('config','token',`${this.appID}.json`));

} catch(e) {

//如果文件不存在则创建一个空的access_token对象

accessTokenFile = {

access_token : '',

expires_time : 0

}

}

return accessTokenFile;

}

/**

* 获取access_token

* access_token是公众号的全局唯一接口调用凭据,access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

* 实现思路:每次获取access_token之前检查本地文件是否存在access_token并且没有过期,如果本地没有access_token或者已过期则重新获取access_token并保存到本地文件中

*/

async getAccessToken() {

const href = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${this.appID}&secret=${this.appSecret}`;

//获取本地存储的access_token

const accessTokenFile = this.getAccessTokenForLocalDisk();

const currentTime = Date.now();

//如果本地文件中的access_token为空 或者 access_token的有效时间小于当前时间 表示access_token已过期

if(accessTokenFile.access_token === '' || accessTokenFile.expires_time < currentTime) {

try {

//访问微信公众平台接口获取acccess_token

const {status,data} = await axios.get(href);

console.log('getAccessToken status : ',status);

console.log('getAccessToken data : ',data);

if(data.access_token && data.expires_in) {

//将access_token保存到本地文件中

accessTokenFile.access_token = data.access_token;

accessTokenFile.expires_time = Date.now() + (parseInt(data.expires_in) - 180) * 1000; //access_token 有效期1小时57分钟

//将access_token写到本地文件中

const file = path.resolve('config','token',`${this.appID}.json`);

fe.ensureFileSync(file);

fe.outputJsonSync(file,accessTokenFile);

return data.access_token;

} else {

throw new Error(JSON.stringify(data));

}

} catch (e) {

console.error('请求获取access_token出错:',e);

}

}

//access_token 没有过期,则直接返回本地存储的token

else {

return accessTokenFile.access_token;

}

}

}

module.exports = MpWeixin;

然后新建一个App.js文件,在这个文件中测试一下获取access_token这个方法,具体代码如下:

const MpWeixin = require('./src/MpWeixin');

new MpWeixin('替换成你订阅号的appID','替换成你订阅号的appSecret').getAccessToken().then(access_token => {

console.log('access_token:',access_token);

});

714e1dc0e704e8f8e732932648f2aa6e.png

注意:以上代码必须要放在IP白名单中配置的机器上执行才能成功获取access_token

3、获取永久素材管理(公众号文章)接口

永久素材管理接口必须需要通过微信认证,微信认证必须要是要是企业订阅号才可以进行微信认证,个人订阅号无法进行微信认证,也就是说个人订阅号是没有调用这个接口权限的。接口官方说明:https://mp.weixin.qq.com/wiki... ;

​ 在MpWeixin.js 添加【获取素材列表】代码:

/**

* https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738729

* 获取素材列表

* @param type 素材的类型,图片(image)、视频(video)、语音 (voice)、图文(news)

* @param offset 从全部素材的该偏移位置开始返回,0表示从第一个素材 返回

* @param count 返回素材的数量,取值在1到20之间

* @returns {Promise}

*/

async getBatchGetMaterial(type,offset,count) {

try {

const access_token = await this.getAccessToken();

const href = `https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=${access_token}`;

const {status,data} = await axios.post(href,{type,offset,count});

console.log('status => ',status);

return data;

} catch(e) {

console.error('获取素材列表getBatchGetMaterial出错:',e);

}

}

fbb606945157e363d8b37fcb61d0d7f5.png

6f91b0c24765f69a48d769c322f1becd.png

a66d0e0dcb6649b11b9dac50791e7b06.png

​ 修改App.js文件,测试获取素材列表接口:

const MpWeixin = require('./src/MpWeixin');

const mp_weixin = new MpWeixin('替换成你订阅号的appID','替换成你订阅号的appSecret').;

//获取图文素材前20片文章

mp_weixin.getBatchGetMaterial('news',0,20).then(data => {

console.log('获取图文素材:',data);

}).catch(e => {

console.error('获取图片素材出错:',e);

});

在白名单中配置的机器上的运行结果如下:

ea95a14da092ec046c1d40bfc0cba37b.png

4、创建存储文件表

获取到的文章相关数据,需要将它存储到MySQL数据库中,所以首先需要创建一张文章表,创建SQL如下:

CREATE TABLE `article` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`title` varchar(255) NOT NULL COMMENT '标题',

`thumb_url` varchar(255) NOT NULL COMMENT '文章封面',

`thumb_media_id` varchar(255) DEFAULT NULL COMMENT '图文消息的封面图片素材id(必须是永久mediaID)',

`show_cover_pic` tinyint(10) DEFAULT NULL COMMENT '是否显示封面,0为false,即不显示,1为true,即显示',

`author` varchar(100) DEFAULT NULL COMMENT '作者',

`digest` varchar(255) DEFAULT NULL COMMENT '图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空。如果本字段为没有填写,则默认抓取正文前64个字。',

`content` text COMMENT '图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS,涉及图片url必须来源 "上传图文消息内的图片获取URL"接口获取。外部图片url将被过滤。',

`url` varchar(255) DEFAULT NULL COMMENT '图文页的URL',

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值