(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【curl】はてなブログを自動更新するワンライナー

スポンサーリンク

はじめに

はてなブログではAPIを利用することで自動投稿/更新が可能です。

そんなAPIを利用したもの中で、PythonやJavaの上で実装したものは既に他記事でありましたが、curlコマンドを用いたものは見当たりませんでした。
特に追加でインストールが不要であること、ワンライナーで動くこと等、一部には需要があるかと思い今回は要点を記事にしました。

動作確認環境
Mac OS X 10.12.6
curl 7.54.0

はてなブログAPIについて

詳細は以下の開発チームの記事にありますが
はてなブログAtomPub - Hatena Developer Center
自動投稿/更新はXMLデータの送付で行います

今回は更新を例に解説します。

更新処理を行うには、対象のブログのエントリーIDに対してXML文書をPUTします。

まずはcurlとid/keyの動作検証も兼ねて

# curl -u {ブログID}:{AtomPubAPIキー} https://blog.hatena.ne.jp/{はてなID}/{ブログID}/atom/entry/

とターミナルで打ってみてください。
下書き含め、記事の情報がずらずらと標準出力から取得できます。

また、後ほど使う記事の{entry_id}もここで確認できます。
見つからなければ自動更新したい記事のHTMLを確認してみてください。20桁あたりの数字があります。

<article class="entry hentry ".... id="entry-XXXXXX"..

uオプションは認証のためのオプションです。
ここを指定しないと、またはIDとキーが一致しないと

<p class="error-box">Authorization required</p>

または

<p class="error-box">Invalid login</p>

というエラーが返ってきます。

自動更新のcurlコマンド

実際に記事を更新するためのコマンドは以下です。

cat test.xml | curl -X PUT -H "Content-type: text/xml" --data-binary @- -u {ブログID}:{AtomPubAPIキー} https://blog.hatena.ne.jp/{はてなID}/{ブログID}/atom/entry/{entry_id}

@-と指定することで、標準入力のxmlをPUTできます。
そのxmlファイルのサンプルは以下に記載しておきます。

<?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>name</name></author>
  <content type="text/plain">
ブログ本文
  </content>
  <category term="ブログカテゴリ" />
  <app:control>
    <app:draft>no</app:draft>
  </app:control>
</entry>

ブログタイトル、ブログ本文、ブログカテゴリを編集してください。

  <category term="ブログカテゴリ1" />
  <category term="ブログカテゴリ2" />

とすれば複数カテゴリも設定できます。

また、--data-binaryを指定している理由は、ブログ本文に改行が入っている場合にそれを正しくPUTするためです。

実際にコマンド発行に成功すれば

 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 40550    0 40550    0     0  22316      0 --:--:--  0:00:01 --:--:-- 22317
<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom"
       xmlns:app="http://www.w3.org/2007/app">
....

このように送り込まれるXMLファイルが標準出力に出てきます。

終わりに

この記事が後続の方の参考になれば幸いです。

おまけ

以下の記事はこの仕組みで自動更新しています。