C蛮的全栈之路-node篇(二) 实战一:自动发博客

目录

C蛮的全栈之路-序章 技术栈选择与全栈工程师
C蛮的全栈之路-node篇(一) 环境布置
C蛮的全栈之路-node篇(二) 实战一:自动发博客html

---------------- 我是分割线 --------------node

光看不写,收获一定不高。
我们从一个实际功能开始把node用起来。mysql

【数据分析】6 点发的文章在博客园阅读量最高?web

这里有个连接,说天天6点发出阅读量最高。那么咱们会但愿先把内容准备好,而后6点的时候自动发出。
那么这个需求要怎么实现。咱们一步一步作起来。redis

---------------- 分析 --------------sql

考虑作法,好比有这些思路:
一、博客园自己提供的定时发博客的办法
二、博客园提供的API
三、模拟登录操做博客园后台
翻一下后台,博客自身没有提供这个功能,但在“设置”底部有一个“MetaWeblog访问地址: http://rpc.cnblogs.com/metaweblog/bolee”。
说明支持MetaWeblog接口API。
定时功能满地都是,成熟的很,因此须要作的主要就是要实现一个调用MetaWeblog发布博客的功能。express

---------------- 准备工做 --------------npm

上GitHub,搜MetaWeblog,找JavaScript的资源,就找到了“node-modules/metaweblog”。
简单看一眼,里头实现了一个metaweblog的client,正是咱们须要的。
那么创建一个工程目录,用npm install metaweblog拿下来。
它依赖xml2json,这玩意当然性能好,不过依赖node-gpy,麻烦。从GitHub找个node-xml2json做为替换,一样npm取下来换上。
这样准备工做就齐全了。json

---------------- 开工 --------------框架

看一下metaweblog的接口。主要用这两个API。
Post metaWeblog.getPost(postid, username, password);
bool metaWeblog.editPost(postid, username, password, post, publish);
可见从getPost拿到随笔,用editPost传publish=true就能够发布了。

Post的结构里必填的部分以下:
dateTime dateCreated
string description
string title

OK!开始编码:

var MetaWeblog = require('metaweblog').MetaWeblog;
var rpcurl = 'http://rpc.cnblogs.com/metaweblog/你的昵称';
var username = '你的昵称';
var password = '你的密码'; 
var postid = '你要发布的随笔的连接末尾的数字';
var publish = true;

var blog = new MetaWeblog(rpcurl);

// GetPostByPostID
blog.getPost(postid, username, password, function(err, post) {

});
View Code

跑起来看一眼返回的post是这样的。

能够看到,内容是xmlrpc转成的JSON,里头有一大堆过路节点,实际有用的内容不过是一些name-value对,那么咱们来一段代码把过路节点干掉,剩下纯粹的name-value对。

function jsonGetNameValue(obj) {
  if (typeof(obj) != 'object') {
    return {};
  }
  var name = obj['name'];
  var value = obj['value'];
  var ret = {};
  if(name != undefined && value != undefined) {
    ret[name] = value;
  }

  for(var key in obj) {
    extend(ret, jsonGetNameValue(obj[key]));
  }
  return ret;
}
View Code

如今再看看jsonGetNameValue(post)的内容:

这就舒服多了,咱们想要的Post结构的内容都在里头。这样就能够调用editPost了。

 

// GetPostByPostID
blog.getPost(postid, username, password, function(err, post) {
  var ret = jsonGetNameValue(post);
  var editedPost = {'dateCreated': parseCNBlogIsoDatetime(ret['dateCreated']['datetime']['iso8601']),
    'description': ret['description']['string'].toString(),
    'title': ret['title']['string']};
  
  // publish
  blog.editPost(postid, username, password, editedPost, publish, function(err, editResult) {
    console.log(JSON.stringify(editResult));
  });
});

// 返回{"params":{"param":{"value":{"boolean":1}}}}
View Code

 

跑起来看一眼,输出了true。

确认一下,果真已经发布出去了。

---------------- ESLint --------------

用npm装一下ESLint,VSCode里装个ESLint扩展,配好后报出一些错误,都解决掉,把格式顺一顺。
这样第一个版本就出炉了。
还有什么是能够作的呢?能够考虑来个ES6版本,加上错误处理等。

---------------- 功能点 --------------

npm、GitHub、ESLint等,这个例子没有express、koa什么的框架,也没有什么redis、mysql、MongoDB等周边的东西。

做为第一个例子算比较单纯了。

下载demo

相关文章
相关标签/搜索