やってみる

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

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

できない仕様と思われる。

確認

ふつうにサイトから予約投稿することはできる。

「予約投稿」機能をリリースしました。指定した日時で記事を公開できます - はてなブログ開発ブログ
日時を指定して予約投稿する(編集オプション) - はてなブログ ヘルプ
公開済みの記事を再編集する際に、投稿日時を未来に変更できない不具合がありました(修正済み) - はてなブログ開発ブログ

誤解した経緯

はてなブログAtomPub - Hatena Developer Center

updated要素 ブログエントリを投稿する日時を指定します。この指定を行わなかった場合、投稿を行った日時が利用されます。

という文章から、updatedに未来の日時を指定したら予約投稿できると都合よく解釈した。そんなことは一言も書いていない。

ただの更新日時とも思ったが、それなら投稿時点を勝手に付与してくれればいいだけのはず。なければそうすると書いてあるし。わざわざ更新日時を偽装したり、サーバ日時と変えたいことなどあるだろうか?いやない。きっと予約投稿できるに違いない。

調べてみた

PHP+AtomPub+テキストではてなブログに投稿する - Sprint Life
はてなブログAtomPub POSTお試し · GitHub
[GAS]はてなブログAtomPubを扱うライブラリ - 技術のメモ帳
はてなブログの予約投稿を作ってみた - yamaheiのブログ

参考にさせていただいた。感謝。しかし、APIで予約投稿する記事が見当たらない。

やってみた

結論から言うと、予約投稿できなかった。

前回のコードに('updated',...の行を追記してみた。180秒後の日時を指定した。

        body = OrderedDict([
            ('entry', OrderedDict([
                ('@xmlns', 'http://www.w3.org/2005/Atom'),
                ('@xmlns:app', 'http://www.w3.org/2007/app'),
                ('title', title),
                ('author', OrderedDict([('name', 'name')])),
                ('content', OrderedDict([
                    ('@type', 'text/plain'),
                    ('#text', body)
                ])),
                ('updated', '{0:%Y-%m-%dT%H:%M:%S}'.format(datetime.datetime.now()+ datetime.timedelta(seconds=180))),
                ('category', self._create_categories(categories)),
                ('app:control', OrderedDict([
                    ('app:draft', self._is_draft(draft))
                ]))
            ]))])

結果

ブログを確認するとAPI発行直後に公開されていた。

編集画面で確認すると「すぐに公開する」になっており「指定日時で予約投稿する」になっていなかった。

Draftの真偽を変更したが、どちらも「すぐに公開する」になっていた。ただ、下書き(Draft)のものはブログに表示されていなかった。編集画面でしか見れない。「すぐに公開する」とあるのに公開されていない。どういうこと?

混乱の理由

  1. 「下書き」をわかっていなかった
  2. 公開しないのに「公開する」という矛盾した表記がある
  3. 「下書き」と「予約投稿」が一緒くた

A. 「下書き」をわかっていなかった

動作を見ると「下書き」は公開されないものらしい。まずそれがわかっていなかった。今まで単なる「下書き」を書いたことがなかったから理解できなかったのだと思う。

B. 公開しないのに「公開する」という矛盾した表記がある

ボタンとラジオボタンの矛盾

紛らわしいのは編集画面。APIにて下書き(draft=yes)で投稿した記事を編集画面でみてみると、予約日時が「すぐに公開する」とある。実際は下書きなので公開されないから矛盾した表現になる。submitボタンは「公開する」「下書きを更新する」になっている。「下書きを更新する」を選ぶと実際は公開されない。でも、投稿日時は「すぐに公開する」という表現になっている。その矛盾した表現が紛らわしい。

ラジオボタンと日時テキストボックスの矛盾

投稿日時を入力していても「すぐに公開する」ラジオボタンにチェックしてあると公開されてしまう。

日時を未来に指定して入力しているにも関わらず、「すぐに公開する」ラジオボタンが優先され、日時指定が無視されてしまう。日時指定と「すぐに公開する」が矛盾している。

どう解釈すればいいか

おそらく「編集している今、"公開する"ボタンを押せば」という条件つきで「すぐに公開する」という意味なのだろう。もしくは投稿日時オプションなので「予約投稿する」とき以外は無効であるという前提なのか。「公開する」「下書き保存する」「予約投稿する」ボタンと連動していないのでわからない。その仕様を把握していないと理解できない。仮に理解していても矛盾した表現であることに変わりない。

なぜこんなことになったか予想

おそらく予約機能はあとから追加されたので、最適な画面設計になっていないのではないか。

なるだけ楽に開発するために、修正はせず、すでにあった画面に投稿日時オプションをとってつけたのだろう。だから矛盾したり無駄な操作を要する画面になったのだろう。

どうなれば嬉しいか

ボタン3つ パターン

ボタンを「公開する」「下書きを更新(保存)する」「予約投稿する」の3つを表示し、予約投稿するときにだけ投稿日時の編集オプションを表示しれくれるとわかりやすい。

投稿日時を入力すると「予約投稿する」以外のボタンがグレーアウトするか非表示になると操作ミスも起こりにくくなって嬉しい。

プルダウンボタン パターン

もしくは現状の「公開する」ボタンの横にあるリストで「下書きを保存する」に変更できるのと同様に、「予約投稿する」も選べるようにする。そのときだけ、ボタンの横に日時を必須入力させる。

これなら矛盾のない表現で、ミスも起こらず、必要最小限の表示項目にできてわかりやすい。

C. 「下書き」と「予約投稿」が一緒くた

予約投稿した記事は"記事の管理"画面で「下書き」の区分に含められてしまう。予約投稿でない(すぐに公開する)ただの「下書き」と一緒になってしまう。

永久に公開されない記事と、いずれ公開される記事が同じ「下書き」の区分になってしまっている。予約投稿マークで区別をつけることはできる。しかし、ごちゃまぜの一覧から目視で探さねばならないせいで見落としてしまう可能性が生じる。

  • 内容的に未完成なので後で清書したい
  • 内容的にはもう完成したので投稿日時を指定しておく

まったく意味あいが違う。次にユーザがとるアクションも異なる。 清書したい「下書き」の記事を探すことから始めねばならなくなる。

どうなると嬉しいか

記事の管理画面でも「公開」「予約投稿」「下書き」の3つに区分してくれると混乱せずに済む。

  • 「下書き」記事一覧をみれば、あとで清書や日時設定すべき記事だけを抽出できてスムーズに清書作業に入れる
  • 「予約投稿」記事一覧をみれば、未公開の完成記事がどれかわかる
  • 「公開」記事一覧をみれば、完成した公開記事だけ見れる

まとめ

パターン 投稿日時 submitボタン API 結果
公開 すぐに公開する 公開する draft=no すぐブログに表示される
下書き すぐに公開する 下書き保存する draft=yes 決してブログに表示されない
予約投稿 指定日時で予約投稿する 予約投稿する (できない) 指定日時になるとブログに表示される。それまで「記事の管理」画面では「下書き」の区分になっている。

はてなブログ投稿パターン

方法 投稿日時 submitボタン
公開 すぐに公開する すぐブログに表示される
下書き すぐに公開する 決してブログに表示されない
予約投稿 指定日時で予約投稿する 指定日時になるとブログに表示される。それまで「記事の管理」画面では「下書き」の区分になっている。

APIで行える投稿パターン

方法 API
公開 draft=no
下書き draft=yes
予約投稿 (できない)

はてなブログAPIでは予約投稿できない。「公開する」と「下書き保存する」だけできる。

所感

はてなブログAPIで予約投稿できないとわかってガッカリした。動作確認まで苦労したのに。