目录

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

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

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

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

这里有个链接,说每天6点发出阅读量最高。那么我们会希望先把内容准备好,然后6点的时候自动发出。
那么这个需求要怎么实现。我们一步一步做起来。

---------------- 分析 --------------

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

---------------- 准备工作 --------------

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

---------------- 开工 --------------

看一下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) { });

跑起来看一眼返回的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;
}

现在再看看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}}}}

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

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

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

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

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

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

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

下载demo

C蛮的全栈之路-node篇(二) 实战一:自动发博客的更多相关文章

  1. C蛮的全栈之路-node篇(一) 环境布置

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

  2. C蛮的全栈之路-序章 技术栈选择与全栈工程师

    目录 C蛮的全栈之路-序章 技术栈选择与全栈工程师C蛮的全栈之路-node篇(一) 环境布置C蛮的全栈之路-node篇(二) 实战一:自动发博客 博主背景 985院校毕业,至今十年C++开发工作经验, ...

  3. Python全栈之路-----基础篇

    Python诞生 Python是著名的”龟叔“Guido van Rossum(吉多·范罗苏姆)在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言. Python语法很多来自C,但又受到 ...

  4. Python全栈之路目录结构

    基础 1.Python全栈之路-----基础篇 2.Python全栈之路---运算符与基本的数据结构 3.Python全栈之路3--set集合--三元运算--深浅拷贝--初识函数 4.Python全栈 ...

  5. 绝版Node--Sequlize搭建服务(Node全栈之路)

    绝版Node--Sequlize搭建服务(Node全栈之路) 参考资料:https://itbilu.com/nodejs/npm/VkYIaRPz-.html 准备环境:Mysql,Node 前沿: ...

  6. 绝版Node--Sequlize搭建服务(Node全栈之路 二)

    在Node全栈之路(一),也就是上篇文章中,我们讲到了sequlize的基本增删该查,这篇文章,我们在上篇文章的基础上继续探讨,讲一下关于sequlize创建的表之间的对应关系 参考资料:https: ...

  7. Python全栈之路----目录

    Module1 Python基本语法 Python全栈之路----编程基本情况介绍 Python全栈之路----常用数据类型--集合 Module2 数据类型.字符编码.文件操作 Python全栈之路 ...

  8. Python全栈之路----常用模块----hashlib加密模块

    加密算法介绍 HASH       Python全栈之路----hash函数 Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列 ...

  9. python 全栈之路

    目录 Python 全栈之路 一. Python 1. Python基础知识部分 2. Python -函数 3. Python - 模块 4. Python - 面对对象 5. Python - 文 ...

随机推荐

  1. 同时连接多台Android设备进行Monkey Test

    事情多了就会乱,时间久了就会忘. adb -s remount id(devices ID) adb -s shell id monkey -p package name -v count

  2. chapter3:Collaborative Filtering ---------A Programmer's Guide to Data Mining

    Implicit rating and item based filtering Explicit rating: 用户明确的对item评分 Implicit rating:反之 明确评分所存在的问题 ...

  3. Android SlidingMenu 滑出侧边栏

    最近有个项目需要使用侧边栏,而且希望是左右两侧都能够滑出侧边菜单,在网上查找实现方式时,发现大家用的最多的还是大神jfeinstein10的SlidingMenu库,地址https://github. ...

  4. Hadoop--map/reduce实现单词计数

    import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.*; import org.apache.hadoop.mapred.*; ...

  5. 【转】谁说Vim不是IDE?(三)

    谁说Vim不是IDE?(三)   常用插件 之所以说Vim形成了自己的生态环境,就是因为Vim具备开放的插件体系,开发者为了提升开发效率,为Vim编写了数以万计的插件,我们可以根据需要任意选择,也可以 ...

  6. hdoj 1002 A + B Problem II【大数加法】

    A + B Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  7. json中文编码问题

    在和微信接口交互的过程中需要传参json而里面有中文的存在,所以json_encode($data)编码后会形成 {"group":{"name":" ...

  8. Yii2 behavior运用

    class ReturnDataTypeBehaviors extends Behavior { public $type = 'json'; public $pcOrMobile = 'pc'; / ...

  9. PAT 1018. Public Bike Management

    There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...

  10. 理解标签重置reset

    /*样式表文件来自 懒人css http://lrcss.lrjz100.com *//*---------重置---------*/html{font-size: 100%;-webkit-text ...