成果物
Hatena.Blog.API.Service.Get.201702281505
背景
ブログを楽に書きたかったが、予約投稿できなかった。
AsciiDocをMarkdownにできなかった。
LinuxMint17.3にAtomをインストールした - やってみる
AtomにAsciiDoc用プラグインをインストールした - やってみる
plumaにAsciiDocのシンタックスハイライトを設定した - やってみる
FirefoxにAsciiDocのプレビューアをインストールする - やってみる
AsciiDoctorをインストールする - やってみる
Dockerについて調べてみた - やってみる
Pandocをインストールする - やってみる
投稿は一旦あきらめて、既存のはてなブログ記事を取得してみる。
ソースコード
単にHTTPのGET通信しているだけ。その応答をファイル保存した。形式はXML。
はてなAPI
はてなブログAtomPub - Hatena Developer Center
サービス取得
エントリIDを取得できる。ページネーションにより全記事データの取得ができる。
レスポンス
文書
<?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app">
Atom形式らしい。RSS形式と同じくブログ記事の概要を記したXMLのサブセット。
内容
「ブログ」「エントリ」の2種類。ブログデータは1つ。エントリは1記事あたり<entry>
内に含まれている。最大7件の<entry>
が含まれる。7件以降はページネーションでリクエストする。
ブログ
<link rel="first" href="https://blog.hatena.ne.jp/ytyaru/ytyaru.hatenablog.com/atom/entry" /> <link rel="next" href="https://blog.hatena.ne.jp/ytyaru/ytyaru.hatenablog.com/atom/entry?page=1488180703" /> <title> <subtitle> <link rel="alternate" href="http://blogmake.hatenablog.com/"/> <updated>2017-02-27T07:15:00+09:00</updated> <author> <name>ytyaru</name> </author> <generator uri="http://blog.hatena.ne.jp/" version="27e36a0f5d74ff87ae558ff0a6fa1e27">Hatena::Blog</generator> <id>hatenablog://blog/10328749687214714092</id>
エントリ
<entry> <id>XXXXXXXXXXXXXXXXx</id> <link rel="edit" href="https://blog.hatena.ne.jp/ytyaru/ytyaru.hatenablog.com/atom/entry/XXXXXXXXXXXXXXX"/> <link rel="alternate" type="text/html" href="http://ytyaru.hatenablog.com/entry/YYYY/MM/DD/HHMMSS"/> <author><name>ytyaru</name></author> <title>Pandocをインストールする</title> <updated>2017-06-21T00:00:00+09:00</updated> <published>2017-02-28T12:45:51+09:00</published> <app:edited>2017-02-28T15:11:09+09:00</app:edited> <summary type="text">ドキュメント変換ツール。</summary> <content type="text/x-markdown"> ... </content> </hatena:formatted-content> <category term="ワークフロー" /> <app:control> <app:draft>yes</app:draft> </app:control> </entry>
1記事分のデータ。
結果をみてみた
あわよくばこのXMLだけでバックアップできるかと思ったが、そのままでは使い物にならない。
無駄が多い
- たった7件ずつしか取得できないらしい
- (記事数÷7)回もリクエストしないと全件取得できない
- ブログのデータは毎回同一なので重複する
- XML特有の閉じタグがウザくて見づらい
- ファイルサイズ肥大化の原因になる
サニタイズ
時点 | コード |
---|---|
編集 | <!-- more --> |
API取得 | <!-- more --> |
これはひどい。コードブロック内の文字もすべてサニタイズされてしまっている。atom(XML)形式で渡すためにサニタイズせざるを得なかったのだろうが…。入手したコードそのままではMarkdownとして使えない。
サニタイズ、エスケープ、なんというのが正しいか知らない。編集時に入力したMarkdownテキストそのままではない。Atom形式で用いるメタ文字が使われていたら、勝手に変換している。
高木浩光@自宅の日記 - プログラミング解説書籍の脆弱性をどうするか, 「サニタイズ言うなキャンペーン」とは何か, ASPとかJSPとかPHPとかERBとか、逆だ..
こうしてくれると嬉しい
Atomではメタ情報だけ渡して、記事の内容は別URLでプレーンテキストとして取得できるようにしてくれたらよかったのに。そのかわり10件ずつでなく100件ずつにしてくれたら。
さらにAtom(XML)でなくJSONならもっと楽だったのに。
どうしよう
xml.sax.saxutils
モジュールのescape()、quoteattr()、unescape()関数を使えばなんとかできるかも?
6/25 エスケープを元に戻す 予定。
所感
やってみると知らなかったことが判明して仕事が増えていく。すんなり楽にやらせてくれない。