Hatena::ブログ(Diary)

児童小銃 RSSフィード

みえない自由が欲しくて
みえない銃を撃ちまくる
THE BLUE HEARTS 「TRAIN-TRAIN」

なんばりょうすけの仮住まいです

連絡先: rna◎cyber●email●ne●jp


プライバシーポリシー


2017-02-15

[][] 「はてなブログライター」を作りました

はてなブログ用の「はてなダイアリーライター」(http://www.hyuki.com/techinfo/hatena_diary_writer.html) 的なコマンドラインツールを作りました。GitHub で公開しています。

お知らせ

  • 2017-02-16 00:30 バグがありました。まだ使わないで!
  • 2017-02-16 01:10 修正しました。既に使ってしまった人は README.md の「注意事項」を参照して投稿データファイルを修正してください。

あらまし

はてなダイアリーライター(以下はてダラ)は2004年に結城浩(id:hyuki)さんが公開されて以来、僕も勝手に略称を考えたり勝手にパッチを送りつけたりしつつ愛用し続けて、今まさにこの時も使っているのですが、はてなブログに対応した同様のツールというのがなさそうなので作ってみました。ruby は不慣れなので色々アレかもしれませんがお手柔らかに…

というか、はてダラがないためにダイアリーから離れられなかったようなものなのですが。でも、ダイアリーの方はモバイル用の表示がダメ過ぎて、スマホで読まれることがほとんどだと思われる今時のブログ事情を考えると、はてなブログに移行せざるを得ないな、しかたない、作るか、と。

仕様とか

はてなブログライターでははてなブログの AtomPub API 経由で記事を投稿します。API 操作には id:lyokato さんの開発した AtomPub モジュール atomutil を使用しました。そのままでは投稿に失敗することがあったので一部 monky patch で対処しています。*1

はてダラとよく似た仕様になっていますが、いくつか違うところもあります。

  • エントリの書式、エントリファイル名の書式が変わった
  • エントリのテンプレートを生成するサブコマンドを用意した
  • 下書きの投稿、下書きの公開ができるようになった
    • 公開した投稿を下書きに戻すのはできません…

詳細は README.md を参照してください。

内部的には touch.txt とエントリファイルの更新日時を使った更新検出はやめて、エントリファイル毎に最終投稿時のファイル更新日時とハッシュを記録して、エントリファイルが新しくてもハッシュが一致しないなら投稿しないようにしました。これで日記ファイルをコピーして新しいHDDに引っ越したら次に投稿した時に大量の記事が再投稿(更新)されるという悲劇はなくなるはずです。

ただし、あいかわらず投稿先のエントリの内容をチェックしていないので、Webやアプリからエントリを更新した場合でも、はてなブログライターから更新をかけると問答無用で上書きしてしまいます。

出先などからスマホのはてなブログアプリからエントリを投稿したり投稿済みのエントリを修正したりというシーンは結構ありそうなので、双方向に同期できるようにしたいところですが、そのへんは今後の課題です。

なお、「はてダラスプリッタ(hws.pl)」に対応するツールは作っていません。僕自身 diary.txt にダラダラ書いて hws.pl で切って hw.pl で投稿、という流れでずっとやってきたのでなんとかしたかったのですが、記事と投稿先アドレスの対応が投稿後に決まるため、どうにもうまくできませんでした。

とりあえず新しいブログで使っています。まだ始めたばかりなのでエントリが増えた時にまともに動くかわかりませんが…

*1Ruby 2.3 ではてな公式のサンプルを試したところ /usr/lib/ruby/2.3.0/rexml/text.rb:396:in `gsub': incompatible encoding regexp match (UTF-8 regexp with ASCII-8BIT string) (Encoding::CompatibilityError) で投稿できず、encode('BINARY', 'BINARY') をやめたらそこはクリアしたのですが、atomutil.rb:764:in `=~': incompatible encoding regexp match (ASCII-8BIT regexp with UTF-8 string) (Encoding::CompatibilityError) に。結局 Content#body= を上書きして使用しています。

トラックバック - http://d.hatena.ne.jp/rna/20170215/p1