やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

はてなブログAPIでエントリを取得する

はてなAPIはじめの一歩。

成果物

GitHubHatena.Blog.API.Service.Get.201702281505

背景

ブログを楽に書きたかったが、予約投稿できなかった。

はてなブログAPIで予約投稿できない - やってみる

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取得 &lt;!-- more --&gt;

これはひどい。コードブロック内の文字もすべてサニタイズされてしまっている。atom(XML)形式で渡すためにサニタイズせざるを得なかったのだろうが…。入手したコードそのままではMarkdownとして使えない。

サニタイズエスケープ、なんというのが正しいか知らない。編集時に入力したMarkdownテキストそのままではない。Atom形式で用いるメタ文字が使われていたら、勝手に変換している。

高木浩光@自宅の日記 - プログラミング解説書籍の脆弱性をどうするか, 「サニタイズ言うなキャンペーン」とは何か, ASPとかJSPとかPHPとかERBとか、逆だ..

こうしてくれると嬉しい

Atomではメタ情報だけ渡して、記事の内容は別URLでプレーンテキストとして取得できるようにしてくれたらよかったのに。そのかわり10件ずつでなく100件ずつにしてくれたら。

さらにAtom(XML)でなくJSONならもっと楽だったのに。

どうしよう

http://lightson.dip.jp/zope/ZWiki/053_e6_96_87_e5_ad_97_e3_82_92_e3_82_a8_e3_82_b9_e3_82_b1_e3_83_bc_e3_83_97_e3_81_99_e3_82_8b_ef_bc_8f_e3_82_a8_e3_82_b9_e3_82_b1_e3_83_bc_e3_83_97_e3_82_92_e5_a4_96_e3_81_99

xml.sax.saxutilsモジュールのescape()、quoteattr()、unescape()関数を使えばなんとかできるかも?

6/25 エスケープを元に戻す 予定

所感

やってみると知らなかったことが判明して仕事が増えていく。すんなり楽にやらせてくれない。