はてなブログ API では予約投稿ができない

はてなブログ API を使ってみたが、クソほど充実していない。

目次

はてなブログ API を使う

はてなブログ API を使ってみようーと思うと、公式の不親切な OAuth がどうしたこうしたみたいなリファレンスが飛んでくる。

なんやねんこの OAuth 1.0 ってのは。結局 curl じゃやれんのかいな。メンドクサ。

と思ってよくよく調べると、もっと簡単なやり方があった。

自分のブログの「設定」→「詳細設定」の下部に「AtomPub」という項目がある。ココの

を控えておく。

ルートエンドポイントは、ユーザ ID とブログ URL から組み立てるだけなのでバレても良いが、API キーはパスワードと同等なのでバラさないように。

curl でやるなら、以下のように -u 【ユーザ ID】:【API キー】 を指定すればアレコレできる。

# 公開済の記事を取得する例
$ curl -X GET -u 'neos21:xxxxxxxxxx' 'https://blog.hatena.ne.jp/neos21/neos21.hatenablog.com/atom/entry'

# 投稿する
$ curl -X POST -u 'neos21:xxxxxxxxxx' -d '<?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>neos21</name></author>
  <content type="text/x-markdown">__エントリ本文__

# ほげふが</content>
  <updated>2021-01-01T08:00:00+09:00</updated>
  <category term="Scala" />
  <app:control><app:draft>yes</app:draft></app:control>
</entry>' \
  'https://blog.hatena.ne.jp/neos21/neos21.hatenablog.com/atom/entry'

記事取得は GET、記事投稿は POST だ。

下書き投稿はできるが予約投稿はできない

そんで本題。POST で記事を投稿する時、

<app:control><app:draft>yes</app:draft></app:control>

とすれば下書き投稿され、

<app:control><app:draft>no</app:draft></app:control>

app:draft の値を yes から no に変えれば、実際に投稿できる。

一方で、updated 要素では記事の投稿時刻を指定できる。

<updated>2021-01-01T08:00:00+09:00</updated>

ということは、未来日付を指定しつつ下書き保存したら、予約投稿になるのか? と思ったが、予約投稿にはならない。

以下の記事も同じことを検証し、そう結論づけていた。

結局、日付を指定しようがしまいが、「下書き」or「実際に投稿」しか選べないし、日付はどちらにせよ「投稿日時」として利用されるだけなのだ。コレは API で作った下書き投稿をブラウザで開いてみれば分かる。

予約投稿はどう実現されている?

じゃあブラウザで見ている公式の記事投稿画面では、どうやって「予約投稿する」処理をしているのか。

開発者ツールで見てみると、/edit への POST 時に、フォームパラメータとして draft: 予約投稿する という情報を投げているようだった。

それならと思って

<app:control><app:draft>予約投稿する</app:draft></app:control>

というパラメータで POST してみたが、コレは yes 扱いになってしまい即投稿されてしまった。

結論:API からは予約投稿できない

ということで結論。

いちいちブラウザでポチポチしたくないんだけど、仕方なさそう…。

参考文献