masalibの日記

システム開発、運用と猫の写真ブログです

node.jsで「はてなブログ」の記事更新(はてな表記)

今のところ、はてな表記のみなのですが
node.jsを使って「はてなブログ」を更新する事ができました

ソース

//ブログ更新
var wsse = require('wsse');//解説①
var token = wsse({ username: 'masalib', password: 'password' });
var webclient = require("sync-request"); //解説②
var fs = require('fs');
var putdata = (function(param) {return param[0];})`<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app">
  <title>titme</title>
  <author><name>masalib</name></author>
  <content type="text/x-hatena-syntax">
`;
//解説③
var contendata = (function(param) {return param[0];})`
hantenahyoukixxxx
hantenahyoukixxxx
hantenahyoukixxxx
hantenahyoukixxxx
hantenahyoukixxxx
hantenahyoukixxxx
`;

putdata += escape_html(contendata);//エスケープ処理
putdata += '</content><updated>2012-08-03T01:43:06+09:00</updated> <app:control>   <app:draft>no</app:draft>  </app:control></entry>';

var res = webclient( 'PUT' , 'https://blog.hatena.ne.jp/masalib/masalib.hatenablog.com/atom/entry/12704591929888428295' , {
  headers: {
    "content-type": "application/x.atom+xml",
    "X-WSSE": token.getWSSEHeader({ nonceBase64: true }),
  },
  body: putdata
});
console.log(res);

// 解説④
function escape_html (string) {
  if(typeof string !== 'string') {
    return string;
  }
  return string.replace(/[&'`"<>]/g, function(match) {
    return {
      '&': '&amp;',
      "'": '&#x27;',
      '`': '&#x60;',
      '"': '&quot;',
      '<': '&lt;',
      '>': '&gt;',
    }[match]
  });
}



解説

①WSSEの認証

var wsse = require('wsse');//解説①
var token = wsse({ username: 'masalib', password: 'password' });

画像アップ同様にWSSEで認証しました


②通信は同期

var webclient = require("sync-request"); //解説②

画像アップ同様に、アップ後に後続の処理をおこなわせる必要があったので
同期処理でやりました
今回も同期処理(sync-request)を使っていました


はてなAPIxmlを作成して送信すると反映される仕組みらしいので
今回も記事データのXMLを作成しました

<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom"
       xmlns:app="http://www.w3.org/2007/app">
  <title>新しいタイトル</title>
  <author><name>name</name></author>
  <content type="text/plain">
    ** 新しい本文
  </content>
  <updated>2008-01-01T00:00:00</updated>
  <category term="Scala" />
  <app:control>
    <app:draft>no</app:draft>
  </app:control>
</entry>

エスケープ処理
タイトルはやっていないのですが
記事内容に「&」のような文字列があると
400エラーになるのでエスケープ処理をいれました

今のところ、はてな表記のみなのですが
node.jsを使って「はてなブログ」を更新する事ができました



はてなブログをnode.jsで更新シリーズの進捗

・記事データをXMLとしてダウンロード
 バックアップ用を更新用でわける処理を追加予定

・記事データXMLから画像をダウンロード
 はてな表記:現在進行中
 HTML:未完
 MARKDOWN:未完

・画像をクオリティーを下げずに圧縮 完了
・画像をはてなフォトにアップ
  画像アップ 完了
  アップした内容からXMLを更新:未完

・記事データのSSL
 はてな表記:現在進行中
 HTML:未完
 MARKDOWN:未完

 変更箇所を洗い出し中

・記事データXMLから記事を更新
 はてな表記:完了
 HTML:未完
 MARKDOWN:未完

はてなブログSSLについて

staff.hatenablog.com


はてなブログSSL化が発表になりました
ふと思ったのがスマフォしか持っていない人って
どうやって更新するんだろう・・・
PCあきなのかな

ちなみに自分は3サイトで約440記事でした
440記事をチェックするなんて無理ゲー
11月までに完成させないと・・・