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

相關文章
相關標籤/搜索