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 - 文 ...
随机推荐
- ARM学习笔记10——GNU ARM命令行工具
一.编译器arm-linux-gcc 1.用arm-linux-gcc编译一个程序,一般它是要经过如下步骤的: 1.1.预处理阶段 编译器把上述代码中stdio.h编译进来,使用GCC的选项-E可以使 ...
- Joomla的在线视频播放插件:AllVideos
一个很好的插件,只需要在文章中插入一条简单的语句就可以实现视频播放,视频可以位于网站服务器上或其他视频网站的. 例如:{f4v}ShaHua-H264{/f4v} 我在使用中只有一个地方觉得需要更 ...
- [学习笔记]设计模式之Builder
写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 作为一个新入职的魔导士呢,哦不,是程序员,我以为并没有太多机会去设计项目的软件架构.但是,工作一段时间之后,自己渐渐意识到,哪怕是自己 ...
- ar技术序章-SDK介绍和选择
转自: http://blog.csdn.net/kun1234567/article/details/10402535 ar技术序章-SDK介绍和选择 分类: Augmented Reality20 ...
- datasorttable表格
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- 循环中continue和break的区别
continue是指跳出本次循环 进入下次循环 再来一次 break是指循环结束 再也不来了 可以用一个广告来解释这个区别 这是continue 房:Hi 郭:是你啊 房:我订的书到了吗 房:啊!对了 ...
- Sublime ctags 函数跳转插件安装
Sublime Text安装插件的方法,主要有以下两种: 1. 直接通过下载安装包安装 在编辑器菜单中点击“Preferences”–“Browse Packages…”打开插件安装目录,然后把下载的 ...
- 为什么String要设计成不可变的?
英文原:http://www.programcreek.com/2013/04/why-string-is-immutable-in-java/ 转自:http://blog.csdn.net/ren ...
- SSO之CAS备忘
http://blog.chinaunix.net/uid-28380443-id-4740103.html 自己负责的公司基于CAS单点登录平台架构已经上线运行,很多细节的东西是时候备忘一下了,开源 ...
- JavaBean以及MVC模式
JavaBean, 咖啡豆. JavaBean是一种开发规范,可以说是一种技术. JavaBean就是一个普通的java类.只有符合以下规定才能称之为javabean: 1)必须提供无参数的构造方法 ...