专栏首页Bug生活2048[博客小程序]公众号文章同步至云数据库实现

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

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

一些想法

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

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

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

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

确认可操作性

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

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

文档截图1

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

文档截图2

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

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

172.81.207.12172.81.212.74172.81.235.12172.81.236.99172.81.245.51212.64.65.131212.64.84.22212.64.85.139212.64.85.35212.64.87.134212.64.57.239212.64.68.233212.64.84.102212.64.84.30212.64.84.54212.64.85.82212.64.89.109212.64.89.115212.64.89.17212.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开源博客的小程序还在开发中,等有一些进展之后会开源出来,有兴趣的可以关注下。

本文分享自微信公众号 - Bug生活2048(BugLife2048),作者:Bug2048

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python自学之路-内置函数说明及实例(二)

    这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。

    Bug生活2048
  • 微信小程序版博客——图片相关处理

    前面提到,小程序服务端的数据是基于Ghost的公共API的,在设计首页文章列表时,为了美观加上了头图,但是服务端没有提供对应的字段(头图url)。

    Bug生活2048
  • 利用Python拒绝重复工作,每周的项目进度还是自动发送的好

    由于远程办公的原因,很多口头汇报或者会议同步的事项都需要邮件或者书面的方式进行汇报了。

    Bug生活2048
  • oracle主键自增

    剑行者
  • BDTC 2017 | 探索跨平台、异构数据、推荐系统的实践应用

    12月7-9日,由中国计算机学会主办,CCF 大数据专家委员会承办,的2017中国大数据技术大会(BDTC 2017),在北京新云南皇冠假日酒店隆重举行。本次大...

    挖掘大数据
  • 「TEG+系列」数据的力量-解密《魔兽》大电影14亿背后的故事

    “ 我知道你不知道,对已知的掌握; 我猜到你猜不到,基于已知对未知的预判; 我做到你没做到,基于正确的预判形成正确的行动决策; ...

    TEG云端专业号
  • CB Insights:2019年2季度全球金融科技发展报告

    点滴科技资讯
  • 为什么重写 equals 时必须重写 hashcode?

    equals 默认是和==一样,判断引用是否相等的,一般需要覆写后才能实现真正的判等。

    水货程序员
  • jQuery打造智能提示插件

    插件根据实际需要在单功能上封装的,实现传入后台数据地址,要保存值的input,前台要传入的参数(过滤条件),来返回下拉提示数据,数据过多可上下滚动选择,选择后显...

    欢醉
  • 7-3 约瑟夫环 (25 分)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    韩旭051

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动