C蛮的全栈之路-node篇(二) 实战一:自动发博客
目录
C蛮的全栈之路-序章 技术栈选择与全栈工程师
C蛮的全栈之路-node篇(一) 环境布置
C蛮的全栈之路-node篇(二) 实战一:自动发博客
---------------- 我是分割线 --------------
光看不写,收获必定不高。
咱们从一个实际功能开始把node用起来。
这里有个链接,说每天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等周边的东西。
作为第一个例子算比较单纯了。
C蛮的全栈之路-node篇(二) 实战一:自动发博客的更多相关文章
- C蛮的全栈之路-node篇(一) 环境布置
目录 C蛮的全栈之路-序章 技术栈选择与全栈工程师C蛮的全栈之路-node篇(一) 环境布置C蛮的全栈之路-node篇(二) 实战一:自动发博客 ---------------- 我是分割线 ---- ...
- C蛮的全栈之路-序章 技术栈选择与全栈工程师
目录 C蛮的全栈之路-序章 技术栈选择与全栈工程师C蛮的全栈之路-node篇(一) 环境布置C蛮的全栈之路-node篇(二) 实战一:自动发博客 博主背景 985院校毕业,至今十年C++开发工作经验, ...
- Python全栈之路-----基础篇
Python诞生 Python是著名的”龟叔“Guido van Rossum(吉多·范罗苏姆)在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言. Python语法很多来自C,但又受到 ...
- Python全栈之路目录结构
基础 1.Python全栈之路-----基础篇 2.Python全栈之路---运算符与基本的数据结构 3.Python全栈之路3--set集合--三元运算--深浅拷贝--初识函数 4.Python全栈 ...
- 绝版Node--Sequlize搭建服务(Node全栈之路)
绝版Node--Sequlize搭建服务(Node全栈之路) 参考资料:https://itbilu.com/nodejs/npm/VkYIaRPz-.html 准备环境:Mysql,Node 前沿: ...
- 绝版Node--Sequlize搭建服务(Node全栈之路 二)
在Node全栈之路(一),也就是上篇文章中,我们讲到了sequlize的基本增删该查,这篇文章,我们在上篇文章的基础上继续探讨,讲一下关于sequlize创建的表之间的对应关系 参考资料:https: ...
- Python全栈之路----目录
Module1 Python基本语法 Python全栈之路----编程基本情况介绍 Python全栈之路----常用数据类型--集合 Module2 数据类型.字符编码.文件操作 Python全栈之路 ...
- Python全栈之路----常用模块----hashlib加密模块
加密算法介绍 HASH Python全栈之路----hash函数 Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列 ...
- python 全栈之路
目录 Python 全栈之路 一. Python 1. Python基础知识部分 2. Python -函数 3. Python - 模块 4. Python - 面对对象 5. Python - 文 ...
随机推荐
- python多进程的理解 multiprocessing Process join run
最近看了下多进程. 一种接近底层的实现方法是使用 os.fork()方法,fork出子进程.但是这样做事有局限性的.比如windows的os模块里面没有 fork() 方法. windows:.lin ...
- Android TextView : “Do not concatenate text displayed with setText”
参考:http://stackoverflow.com/questions/33164886/android-textview-do-not-concatenate-text-displayed-wi ...
- NTP DDOS攻击
客户端系统会ping到NTP服务器来发起时间请求更换,同步通常每隔10分钟发生: 从NTP服务器发回到客户端的数据包可能比初始请求大几百倍.相比之下,通常用于放大攻击中的DNS响应被限制仅为8倍的带宽 ...
- 为什么JavaScript开发如此疯狂
本文由码农网 – 小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! Web开发太有意思了! 但是JavaScript则……令人望而生畏. Web开发中其他一切对你而言都是小菜一碟, ...
- Linux下常用I/O模型
Linux异步I/O是Linux内核中提供的一个相当新的增强.它是2.6版本内核的一个标准特性,异步非阻塞I/O背后的基本思想是允许进程发起很多I/O操作,而不用阻塞或等待任何操作完成.稍后或在接收到 ...
- weekend110(Hadoop)的 第四天笔记
(2015年1月18日) 课程目录 01-复习 02-hadoop中的序列化机制 03-流量求和mr程序开发 04-hadoop的自定义排序实现 05-mr程序中自定义分组的实现 06-shuffle ...
- (转)在Mac下使用OpenCV, 在Xcode下使用OpenCV (非常基础,详细)
转自:http://blog.sciencenet.cn/home.php?COLLCC=3456986939&COLLCC=3456885714&mod=space&uid= ...
- 部署war包到tomcat服务器
1.首先通过eclipse的maven install生成项目的war包 2.然后把war包解压到tomcat目录下的webapps目录下 3.然后运行tomcat下的bin目录下的startup.b ...
- CUDA8.0+VS2013的安装和配置
首先声明,本文借鉴自:http://blog.csdn.net/u011314529/article/details/51505029 所以,可参考链接的博文.但原文有个瑕疵就是,cublas.lib ...
- js_面向对象编程
主要内容 值类型与引用类型的特征 深拷贝与浅拷贝 对象的动态特性 构造函数的执行过程 异常处理 dom操作(略) <!DOCTYPE html> <html> <head ...