[博客小程序]公众号文章同步至云数据库实现

最近打算把我的博客小程序大改造一下,原因在于基于ghost的博客后台限制很多,另外我的那台服务器可能另做其他用途,可能不再维持我的博客网站了。

一些想法

首先想到的是博客小程序可以完全脱离服务端「不需要后端,域名,服务器,备案等」。可以基于小程序提供的云开发功能来实现整个博客小程序的所有功能。

这样减少了很多后端依赖,也方便很多读者搭建属于自己的小程序,毕竟目前我现有的小程序还完全依赖ghost的开源博客。

但文章的数据源从哪里获取呢?毕竟博客小程序最终的还是文章内容。目前考虑的是github和微信公众号,可以将这两个地方作为自己文章的数据源,然后通过功能来实现同步相应的文章。

由于自己本身有个公众号,平时文章也会发布到公众号上,所以目前打算将公众号的文章作为我的文章数据源,来实现我的新版博客小程序。

确认可操作性

既然决定公众号的文章作为数据源,那么就开始验证下可操作性「毕竟公众号还是有很多限制的,尤其是个人号」。

首先确认是否有相应的接口权限,这里主要用到获取素材相关的接口,可以看到对应接口文档,个人号还是有对应权限的「还好,如果这个都没有,这个方案就可以直接pass了」

文档截图1

其次是调用前权限配置问题,在查看文档后,公众号获取token需要添加IP白名单

文档截图2

这个就有点坑爹了,所有后端功能完全基于小程序云开发,而小程序的云函数所对应的IP显然是不固定的,这叫我如何配置。

在google了N久之后发现,还是有很多小伙伴遇到此类问题的,一种是采用代理的方式「还是需要依赖后端服务器」。另一种是穷举,有小伙伴实践过,基本上云函数对应的IP就如下几个,全部配置到白名单中即可。

172.81.207.12
172.81.212.74
172.81.235.12
172.81.236.99
172.81.245.51
212.64.65.131
212.64.84.22
212.64.85.139
212.64.85.35
212.64.87.134
212.64.57.239
212.64.68.233
212.64.84.102
212.64.84.30
212.64.84.54
212.64.85.82
212.64.89.109
212.64.89.115
212.64.89.17
212.64.89.18

解决了这两个问题之后,利用云函数同步公众号文章至云数据库应该是可以实现的。

具体实现

实现的逻辑还是比较简单的,具体分三个步骤:

  1. 获取公众号的access_token(不是小程序的)
  2. 遍历调用公众号永久素材列表接口获取数据
  3. 将文章相关数据保存至云数据库中

首先获取access_token就不多说了,在写评论推送功能实现的文章中已经提过。直接上代码:

/**
 * 获取公众号token
 * @param {}  
 */
async function getAccessWechatToken() {
  const result = await rp({
    url: `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appId=${APPID}&secret=${APPSCREAT}`,
    method: 'GET'
  });

  //TODO:需要验证IP白名单失效问题(ip改变导致无法获取到token)
  console.info(result)
  let rbody = (typeof result === 'object') ? result : JSON.parse(result);
  return rbody;
}

然后调用素材列表接口,获取相应的文章信息,这里主要获取公众号的图文信息(type为news)

/**
 * 获取公众号文章信息
 * @param {*} accessToken
 */
async function getWechatPosts(accessToken, offset, count) {
  let url = `https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=${accessToken}`
  var options = {
    method: 'POST',
    json: true,
    uri: url,
    body: {
      "type": "news",
      "offset": offset,
      "count": count
    }
  }
  const result = await rp(options)
  let rbody = (typeof result === 'object') ? result : JSON.parse(result);
  return rbody;
}

最后将获取到的图文信息保存到云数据库中,逻辑比较简单,就不多说了,直接上代码。

/**
 * 同步公众号文章至云数据库
 */
async function syncWechatPosts(isUpdate) {
  let collection = "mini_posts"
  let accessToken = await getCacheAccessToken(1)
  var offset = 0
  var count = 10
  var isContinue = true
  while (isContinue) {
    var posts = await getWechatPosts(accessToken, offset, count)
    if (posts.item.length == 0) {
      isContinue = false
      break;
    }

    for (var index in posts.item) {
      //判断是否存在
      let existPost = await db.collection(collection).where(
        {
          uniqueId: posts.item[index].media_id,
          sourceFrom: "wechat"
        }).get();

      if (existPost.code) {
        continue;
      }
      if (!existPost.data.length) {

        var data = {
          uniqueId: posts.item[index].media_id,
          sourceFrom: "wechat",
          content: posts.item[index].content.news_item[0].content,
          author: posts.item[index].content.news_item[0].author,
          title: posts.item[index].content.news_item[0].title,
          defaultImageUrl: posts.item[index].content.news_item[0].thumb_url,
          createTime: posts.item[index].update_time,
          totalComments: 0,//总的点评数
          totalVisits: 100,//总的访问数
          totalZans: 50,//总的点赞数
          label: [],//标签
          classify: 0,//分类
          contentTyep:"html"
        }

        await db.collection(collection).add({
          data: data
        });
      }
      else {
        //不需要更新直接继续
        if (!isUpdate) {
          continue
        }

        let id = existPost.data[0]._id;
        await db.collection(collection).doc(id).set({
          data: {
            content: posts.item[index].content.news_item[0].content,
            author: posts.item[index].content.news_item[0].author,
            title: posts.item[index].content.news_item[0].title,
            defaultImageUrl: posts.item[index].content.news_item[0].thumb_url,
            createTime: posts.item[index].update_time
          }
        });

      }
    }

    offset=offset+count
  }
}

到这里,公众号的文章就顺利同步到了小程序的云数据库中了,后面小程序渲染的数据源就可以直接从云数据库中取了。

当然你也可以举一反三,数据源不一定通过公众号,也可以通过github或者其他途径,统一同步到小程序的云数据库中,这样你的博客小程序就可以完全独立了。

云后台截图

总结

目前完全脱离ghost开源博客的小程序还在开发中,等有一些进展之后会开源出来,有兴趣的可以关注下。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容

  • 断舍离,听起来在很潇洒的事情。 对于物品处理,尤其是办公桌上的物品整理确实需要断舍离。现在相信一句话,以后可能用上...
    萨拉zanetti阅读 232评论 0 0
  • 从降生的那一刻起 就注定心不由主,恰似你是一个挖宝者 为了满足贪懒需要,或是是生存的本能 一步步...
    宇宙中的精灵阅读 250评论 0 0
  • 下面由我来带出,总结一下现在新的一种沟通方式,如何使用得体的微信礼仪: 1不要在微信上问“你好,在吗?”说句你好,...
    莎莎宝贝儿阅读 467评论 0 0