はてなブログAtomPub APIを使ってはてなブログの記事をエクスポートしたり投稿・編集を行うためのコマンドラインツール集です。

ダウンロード

MIT X11ライセンスでのリリースとなります。 実行可能ファイルを含むパッケージには.NET Framework版と.NET Core版があります。 実行環境にインストールされているランタイムにあわせてダウンロードしてください。

最新版

過去のバージョン

必要環境

.NET Frameworkまたは.NET Coreが動作する環境が必要です。 以下のいずれかのランタイムがインストールされている環境で実行してください。

  1. .NET Framework 4.6.1以上
  2. .NET Core Runtime 2.0.7以上
  3. Mono 5.4以上

以下の環境で動作することを確認しています。

  1. Windows 10 + .NET Framework/.NET Core
  2. Ubuntu 16.04 + .NET Core/Mono

未検証ですが、.NET CoreランタイムまたはMonoがインストールされていれば、Mac OSでも概ね問題なく動作するものと思われます。

使い方

パッケージ内には以下の実行ファイルが含まれています。

Login.exe
はてなブログへのログインを行うテストツール
FixMixedContent.exe
ブログ記事内における混在コンテンツの修正・ブログURLの変更を行うツール
DumpAllEntries.exe
すべてのブロク記事をダンプ・エクスポートするツール
PostNewEntry.exe
ブログに新規記事を投稿するツール
ReplaceEntryContent.exe
ブログ内の全記事の内容を一括置換・削除するツール
ModifyCategory.exe
ブログ記事のカテゴリを一括変更するツール

各ツール共通の使い方

「はてなブログ用ツール」はすべてコマンドラインツールであるため、コマンドプロンプトやバッチファイルを使って起動します。 .NET Framework版と.NET Core版で起動方法が若干異なります。 また各ツールごとに追加で指定する必要があるオプションもあります。 起動時には以下の例に従ってオプションを指定してください。

.NET Framework 4.6.1以上がインストールされているWindowsでは、次のように入力して各コマンドを起動してください。

コマンド起動例(Login.exeの場合)
Login.exe --id hatena --blog-id hatena.hatenablog.jp --api-key ******

.NET Core 2.0.7以上がインストールされているWindows・MacOS・Linuxでは、次のように入力して各コマンドを起動してください。

コマンド起動例(Login.dllの場合)
dotnet Login.dll -- --id hatena --blog-id hatena.hatenablog.jp --api-key ******

.NET Core版では実行ファイルの拡張子が.exeではなく.dllとなります。 以下のコマンド使用例においても適宜読み替えてください。


Mono 5.4以上がインストールされているWindows・MacOS・Linuxでは、次のように入力して各コマンドを起動してください。

コマンド起動例(Login.exeの場合)
mono Login.exe --id hatena --blog-id hatena.hatenablog.jp --api-key ******

Monoで実行する場合はルート証明書をインストールしておく必要があります。 詳細はFAQ: Security | Monoを参照してください。

共通の必須オプション

「はてなブログ用ツール」でははてなIDブログIDAPIキーの3つの必須オプションを指定する必要があります。 必須オプションと指定する内容は次のとおりです。

使用例(Login.exeの場合)
Login.exe --id hatena --blog-id hatena.hatenablog.jp --api-key ******
--id はてなID
はてなID(はてなのユーザーID)を指定してください。 はてなIDはブログのaboutページまたはプロフィールページにてご確認ください。
--blog-id ブログID
はてなブログのドメインを指定してください。 ドメインはブログの基本設定にて記載されているブログURLを指定してください。 独自ドメインを設定している場合でも、はてなブログオリジナルのブログURLを指定してください。
--api-key APIキー
ブログの詳細設定に記載されているAtomPubのAPIキーを指定してください。 (注意:§.APIキーの取り扱いについて)

その他ツールごとに指定するオプションについては§.各ツールの使い方を参照してください。

各ツールの使い方

Login.exe

はてなブログへのログインを行うツールです。

使用例
Login.exe --id hatena --blog-id hatena.hatenablog.jp --api-key ******
オプション
--id はてなID, --blog-id ブログID, --api-key APIキー
必須。 §.共通の必須オプションを参照してください。

このツールではログインを試行する以外の動作、たとえば記事の編集等は一切行いません。 他のツールと共通のオプション指定に誤りがないか、はてなブログAtomPub APIを使って記事の編集ができるかどうか確認するためのテストツールとして使います。

FixMixedContent.exe

ブログの全記事内における混在コンテンツとなりうるURL、および/または自ブログのリンクURLを修正します。 修正は行わず、混在コンテンツの検出のみを行うこともできます。

使用例
(混在コンテンツを修正する場合)
FixMixedContent.exe --id hatena --blog-id hatena.hatenablog.jp --api-key ****** --fix-mixed-content

(修正の適用は行わず、混在コンテンツの修正内容のみを表示する場合)
FixMixedContent.exe --id hatena --blog-id hatena.hatenablog.jp --api-key ****** --fix-mixed-content --dry-run

(一件ずつ確認しながら混在コンテンツを修正する場合)
FixMixedContent.exe --id hatena --blog-id hatena.hatenablog.jp --api-key ****** --fix-mixed-content --interactive

(混在コンテンツと自ブログのURLを修正する場合)
FixMixedContent.exe --id hatena --blog-id hatena.hatenablog.jp --api-key ****** --fix-mixed-content --fix-blog-url

(自ブログのURLと独自ドメインでのURLを修正する場合)
FixMixedContent.exe --id hatena --blog-id hatena.hatenablog.jp --api-key ****** --fix-blog-url --custom-domain myblog.example.com

(全記事の更新を行う場合)
FixMixedContent.exe --id hatena --blog-id hatena.hatenablog.jp --api-key ****** --update-content
オプション
--id はてなID, --blog-id ブログID, --api-key APIキー
必須。 §.共通の必須オプションを参照してください。
--fix-mixed-content
オプション。 記事本文内において、混在コンテンツとなりうるリンクのURLをhttp://からhttps://に修正します。 動作の詳細は§.--fix-mixed-contentの動作で解説します。
--fix-blog-url
オプション。 記事本文内における自ブログのURLをhttp://からhttps://に修正します。 ブログのHTTPSを有効にする際に、記事内のURLも変更したい場合に使用します。 動作の詳細は§.--fix-blog-urlの動作で解説します。
--custom-domain 独自ドメイン
オプション。 独自ドメインを使用してブログを公開している場合、その独自ドメインを指定します。 --fix-blog-urlで自ブログURLの修正を行う場合に、独自ドメインのURLも修正したい場合に指定します。
--update-content
オプション。 上記オプションでの修正箇所がない場合でも、常に再投稿を行うことにより記事を更新します。 ただし、-n,--dry-runが指定されている場合は、このオプションが指定されていても再投稿は行いません。 その他、動作の詳細は§.--update-contentの動作で解説します。
--list-fixed-entry
オプション。 すべての記事の更新が完了した際に、修正を行った記事のURL一覧を表示します。
-n,--dry-run
オプション。 実際に修正内容の投稿を行わずに終了します。 修正内容の確認など動作テストの際に使います。
-i,--interactive
オプション。 修正内容を投稿する前に、その都度確認を行います。
--diff-cmd コマンド, --diff-cmd-args コマンド引数
オプション。 修正前後の差分を指定されたコマンドで表示します。 diffコマンドなどで差分を確認したい場合はこのオプションを指定してください。 より詳しい設定方法については§.差分表示のオプション(--diff-cmd, --diff-cmd-args)を参照してください。
その他の動作オプション
--input-content ファイル名
はてなブログの記事を修正する代わりに、指定されたファイルの内容に対して修正を行います。 ファイル名に-を指定した場合は、標準入力の内容を読み込んで修正します。
このオプションは、ローカル環境で変更内容の確認を行いたい場合、またははてなブログ以外のブログデータを修正したい場合など使います。
このオプションを指定した場合、はてなブログへのログイン、および記事の修正・再投稿は一切行いません。
--fix-blog-urlオプションと組み合わせて使う場合は、--custom-domainオプションにてブログURLのドメインを指定してください。
--output-content ファイル名
--input-contentで指定したファイルの内容を修正した結果を、指定されたファイルに書き込みます。 省略した場合、ファイル名に-を指定した場合は、標準出力へ書き込みます。

このツールを使った混在コンテンツの修正手順例については§.HTTPS有効化までの手順例で解説します。

本ツールの修正対象となるのはブログ内の全記事のみです。 ヘッダ・フッタ・サイドバー・記事上下のカスタマイズなど、デザイン設定画面で埋め込んでいる混在コンテンツ・リンクURLの修正は本ツールでは修正できないため、手動で修正してください。 また、デザインCSS、および記事本文に埋め込まれたCSSにおける混在コンテンツ・リンクURLの修正も本ツールでは修正できません。

記事の内容によっては完全な修正ができない可能性もあります。 混在コンテンツを完全になくすことを目的とする場合は、他の検出ツール等を併用することをおすすめします。

本ツールでは「下書き」として投稿されている記事も修正対象に含まれます。 下書きを除外して修正する機能を実装する予定は考えていませんが、要望がある場合は掲示板の方へおねがいします。

--fix-mixed-contentの動作

オプション--fix-mixed-contentを指定した場合、記事本文内における混在コンテンツとなりうる埋め込みリンクのURLをhttp://からhttps://に修正します。 修正対象となる要素と属性(HTMLタグ)は次のとおりです。

  • <img>要素のsrc属性およびsrcset属性
  • <source>要素のsrc属性およびsrcset属性
  • <script>要素のsrc属性
  • <video>要素のsrc属性
  • <audio>要素のsrc属性
  • <iframe>要素のsrc属性
  • <embed>要素のsrc属性
  • rel属性にstylesheetが指定されている<link>要素のhref属性
  • <form>要素のaction属性
  • <object>要素のdata属性

上記の属性の値がhttp://で始まる場合は、それをhttps://に修正します。 修正される/されないリンクを例示すると次のようになります。

httpsに修正される/修正されないリンクの例
<!-- httpsに修正されるタグの例 -->
<img src="http://hatena.example.com/cinnamon.jpg">
<script src="http://hatena.example.com/cinnamon.js">
<link rel="stylesheet" href="http://hatena.example.com/cinnamon.css">
<iframe src="http://hatena.example.com/cinnamon.html">

<!-- httpsに修正されないタグの例 -->
<img src="//hatena.example.com/cinnamon.jpg"> <!-- スキームが省略されているので修正の必要なし -->
<img src="https://hatena.example.com/cinnamon.jpg"> <!-- すでにhttpsになっているので修正の必要なし -->
<a href="http://hatena.example.com/cinnamon.html"> <!-- aタグでのリンクは混在コンテンツではないので修正しない -->
<link rel="icon" src="http://hatena.example.com/cinnamon.png"> <!-- rel=stylesheetではないので修正しない -->
<img src="http://hatena.example.com"> <!-- ドメイン名の後に"/"がないURLは修正しない -->

--fix-mixed-contentでは、URLの修正に際してリンク先の検証は一切せずにhttps://に変換します。 そのため、修正によって存在しないURLとなり、スクリプトなどが正しく動作しなくなる(404エラーになる)可能性がある点に注意してください。 埋め込んでいるスクリプトや画像の配信元におけるHTTPSのサポート状況を事前にご確認ください。

また--fix-mixed-contentでは、はてな記法・Markdown記法のシンタックスハイライト記法で記述されているHTMLも修正対象となる点に注意してください。 たとえば次の例のように、シンタックスハイライト記法内にHTMLが記述されている場合、このHTMLのURLも修正対象としてみなされhttps://に修正されます。

URLが誤修正されてしまう例(はてな記法)
シンタックスハイライト記法でimgタグを表示する例です。

>|html|
<img src="http://hatena.example.com/cinnamon.jpg">
||<
URLが誤修正されてしまう例(Markdown記法)
シンタックスハイライト記法でimgタグを表示する例です。

```html
<img src="http://hatena.example.com/cinnamon.jpg">
```

現時点では、シンタックスハイライト記法内のHTMLをエスケープする(修正対象外とする)ことはできないので、記法内のHTMLがhttps://に修正しても問題ないかどうかを事前に確認するか、別途別のツールを使うなどして修正してください。

シンタックスハイライト記法内のHTMLをエスケープする機能は将来的には実装しようと考えていますが、需要が多そうであれば優先して対応を考えます。 要望があれば掲示板の方へおねがいします。

--fix-blog-urlの動作

オプション--fix-blog-urlを指定した場合、記事本文内に記載されているブログURLをhttp://からhttps://に修正します。 ブログURLはオプション--blog-idで指定されたブログドメインを元に決定されます。

--fix-blog-urlによるブログURLの修正は、ブログ設定でHTTPSを有効にした後または直前に行うようにしてください。 2018-04時点では、HTTPSを有効にしていない状態でhttps://でアクセスした場合でもhttp://へとリダイレクトされるようです。 そのため、HTTPSを有効にする前にURLをhttps://に変更してもブログの閲覧自体には支障はないと思われます。 一方それ以外の動作、例えば検索エンジンやウェブマスターツールなどの動作などについては検証していないため、正常性の保証はできません。

HTTPSを有効にした後にhttp://へアクセスした場合、はてなブログ側で自動的にリダイレクトされる設定になっているため、記事内のブログURLを修正しないままにしても問題になることはほとんどないと思われます。 一方、リダイレクトによる表示の遅延やSEO上のメリット/デメリットなどをシビアに考慮する場合は、--fix-blog-urlでブログURLを修正してください。

このオプションで修正対象となるのは、テキストとして書かれているブログURLと、<a>要素のhref属性に指定されているブログURLです。 <a>要素href属性以外のHTMLで記載されているURLは修正されません。

httpsに修正される/修正されないブログURLの例
-- 以下のURLはhttps://に修正される --

このブログのURLは http://smdn.hatenablog.jp/ です

<a href="http://smdn.hatenablog.jp/">ブログトップ</a>
<a href="http://smdn.hatenablog.jp/about">このブログについて</a>

[http://smdn.hatenablog.jp/:title=はてな記法でのリンク]

[Markdown記法でのリンク](http://smdn.hatenablog.jp/)



-- 以下のURLはhttps://に修正されない --

<link href="http://smdn.hatenablog.jp/"> (a@href以外のURLはhttpsに修正されない)

http://smdn.hatenablog.jp (ドメイン名の後に"/"がないURLは修正されない)

独自ドメインを使ってブログを運営している場合、オプション--custom-domainを指定することで、独自ドメインでのURLも修正することができます。 例えば、example.comという独自ドメイン名を使用している場合は、--custom-domain example.comを指定します。 このように指定することで、本文内のURLがhttp://example.com/からhttps://example.com/へと修正されます。 修正対象については上記のとおりです。 なお、--custom-domainを指定した場合でも、はてなブログオリジナルのURLが記述されていればそのURLも修正されます。

2018-04時点では、独自ドメインが設定されているブログではHTTPSを有効化することはできません。 (HTTPSで配信する - はてなブログ ヘルプ) HTTPSを有効にできない状態で独自ドメインURLをhttps://に修正した場合の結果については未検証です。 独自ドメインでのURL修正のテストを目的としてお使いください。

--update-contentの動作

オプション--update-contentを指定した場合、すべての記事を再投稿して更新します。 このオプションだけを指定した場合、記事内容に変更は加えず再投稿して更新します。 --fix-mixed-contentまたは--fix-blog-urlと組み合わせて指定した場合は、その修正のあるなしに関わらず更新します。

はてなフォトライフの画像を貼り付けていたり、ブログ編集画面サイドバーの各種埋め込み機能を使っている場合は、このオプションを指定して記事を更新するようにしてください。 これらの埋め込み機能により生成されるHTMLの混在コンテンツは、記事を再度「更新する」ことで解消するとされています。 --update-contentを指定することにより記事を再投稿すると、すべての記事を一括して更新することができます。

はてなフォトライフにアップロードした画像

「はてなフォトライフ」にアップロードした画像がHTTPで配信されている場合、一部を除き、記事を再度「更新する」ことで解消します。

レストラン紹介から貼り付けた画像

編集サイドバーのレストラン紹介から貼り付けたぐるなびや食べログの画像は、記事を再度「更新する」ことで解消します。

【よくある質問】HTTPS配信時の混在コンテンツ(Mixed Content)対応について - はてなブログ ヘルプ

なお--update-contentは、はてなフォトライフの画像URLを直接imgタグ等で埋め込んでいる箇所の修正はしません。 この場合は--fix-mixed-contentで修正してください。

HTTPS有効化までの手順例

以下、はてなブログの利用形態別にFixMixedContentを使ってHTTPSを有効化するまでの手順の例を掲載します。 FixMixedContentを使って混在コンテンツを修正する際の参考ととしてお読みください。

以下の手順では記事本文以外のカスタマイズ箇所の修正については省略しています。 ヘッダ・フッタ・サイドバー・CSSなどをカスタマイズしている場合は、以下の手順とは個別にカスタマイズした部分のチェックと修正も行ってください。

修正の本番に入る前にエクスポートを行い、ブログデータのバックアップを取っておくことをおすすめします。 また可能なら修正のテストを行うことをおすすめします。 はてなブログでは同一アカウントでサブブログを作ることができ、またインポート/エクスポートにも対応しています。 そのため、修正対象のブログをエクスポート/インポートしてブログのコピーを作り、テストを行うことができます。

テスト用のブログを作らず直接修正する場合は、まず-nまたは--dry-runオプションを付けることで実際の修正を行わずに修正される内容を確認する、次に-iまたは--interactiveオプションを付けることで一件ずつ確認しながら修正を適用することをおすすめします。 修正内容の確認に関しては§.差分表示のオプション(--diff-cmd, --diff-cmd-args)も参照してください。

「各種埋め込み記法・編集サイドバーの埋め込み機能を使用していない。 記事内にHTMLタグを直接記述していない」場合

記事内で混在コンテンツが生じている可能性がないため、すぐにHTTPSを有効にしても問題ないと思われます。

「各種埋め込み記法・編集サイドバーの埋め込み機能を使用している。 記事内にHTMLタグは直接記述していない」場合

埋め込み機能によって混在コンテンツが生じている可能性があるため、記事の更新により修正する必要があります。

  1. オプション--update-contentを指定してFixMixedContentを実行する
    1. 本文内のブログURLも修正したい場合は--fix-blog-urlも指定する
  2. ブログ設定でHTTPSを有効にする

「記事内にHTMLタグを直接記述している。 シンタックスハイライト記法を使っていない」場合

HTMLタグによって混在コンテンツが生じている可能性があるため、記事本文を検証して修正する必要があります。

  1. オプション--fix-mixed-contentを指定してFixMixedContentを実行する
    1. 各種記法・埋め込み機能を使用している場合は--update-contentも指定する
    2. 本文内のブログURLも修正したい場合は--fix-blog-urlも指定する
  2. ブログ設定でHTTPSを有効にする

「記事内にHTMLタグを直接記述している。 シンタックスハイライト記法を使っていて、かつHTML内にURLを記述している」場合

HTMLタグによって混在コンテンツが生じている可能性があるため、記事本文を検証して修正する必要があります。 一方、シンタックスハイライト記法内で記述しているHTMLのURLは修正してよいか別途確認する必要があります。

  1. 事前にシンタックスハイライト記法内のHTMLにURLが記述されていないか、https://に修正しても問題ないか確認する
    1. 問題がある場合はFixMixedContentでは対応できないので、FixMixedContentでの修正時にスキップする(--interactiveオプションを使って修正する)、FixMixedContentでの修正後に個別に編集して戻す、あるいは他のツールを使用するなどしてください
  2. オプション--fix-mixed-contentを指定してFixMixedContentを実行する
    1. 各種記法・埋め込み機能を使用している場合は--update-contentも指定する
    2. 本文内のブログURLも修正したい場合は--fix-blog-urlも指定する
  3. ブログ設定でHTTPSを有効にする

「記事内に混在コンテンツがあるかわからない。 あるかどうか調べたい」場合

オプション--fix-mixed-content--dry-run、また必要に応じて§.差分表示のオプション(--diff-cmd, --diff-cmd-args)を指定してFixMixedContentを実行してください。 実際の修正は行わずに、修正対象の混在コンテンツがあれば表示させることができます。

各オプションの指定例とツールの動作・出力例

各コマンドラインオプションを指定した場合のツールの動作と出力内容の例です。

$ dotnet FixMixedContent.dll -- --id smdn --blog-id smdn.hatenablog.jp --api-key ****** --fix-mixed-content --fix-blog-url --diff-cmd git --diff-cmd-args 'diff --no-index --color' --interactive --dry-run
ログインしています ... ログインに成功しました。
http://smdn.hatenablog.jp/entry/2018/04/20/160531 "記事タイトル" 
diff --git a/./.tmp/original.txt b/./.tmp/modified.txt
index dedcac4..ba8cc11 100644
--- a/./.tmp/original.txt
+++ b/./.tmp/modified.txt
@@ -1,11 +1,11 @@
 <figure class="figure-image figure-image-fotolife mceNonEditable" title="smdn">
-<p><img class="hatena-fotolife" src="http://cdn-ak.f.st-hatena.com/images/fotolife/s/smdn/20131114/20131114222653.png" alt="smdn favicon" /></p>
+<p><img class="hatena-fotolife" src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/smdn/20131114/20131114222653.png" alt="smdn favicon" /></p>
 <figcaption>smdn</figcaption>
 </figure>
-<p><iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="http://smdn.hatenablog.jp/entry/2013/09/25/130552" src="http://smdn.hatenablog.jp/embed/2013/09/25/130552" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="http://smdn.hatenablog.jp/entry/2013/09/25/130552">smdn.hatenablog.jp</a></cite></p>
-<p><iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="http://smdn.hatenablog.jp/entry/2013/09/25/130516" src="http://smdn.hatenablog.jp/embed/2013/09/25/130516" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="http://smdn.hatenablog.jp/entry/2013/09/25/130516">smdn.hatenablog.jp</a></cite></p>
+<p><iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="http://smdn.hatenablog.jp/entry/2013/09/25/130552" src="https://smdn.hatenablog.jp/embed/2013/09/25/130552" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://smdn.hatenablog.jp/entry/2013/09/25/130552">smdn.hatenablog.jp</a></cite></p>
+<p><iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="http://smdn.hatenablog.jp/entry/2013/09/25/130516" src="https://smdn.hatenablog.jp/embed/2013/09/25/130516" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="https://smdn.hatenablog.jp/entry/2013/09/25/130516">smdn.hatenablog.jp</a></cite></p>

http://smdn.hatenablog.jp/entry/2013/09/25/130835 "test9" (変更なし)
http://smdn.hatenablog.jp/entry/2013/09/25/130823 "test8" (変更なし)
http://smdn.hatenablog.jp/entry/2013/09/16/232017 "test2" (変更なし)
http://smdn.hatenablog.jp/entry/2013/09/16/231938 "test1" (変更なし)
完了

--diff-cmdオプションを指定しない場合の例。

$ dotnet FixMixedContent.dll -- --id smdn --blog-id smdn.hatenablog.jp --api-key ****** --fix-mixed-content --dry-run
ログインしています ... ログインに成功しました。
http://smdn.hatenablog.jp/entry/2018/04/20/160531 "記事タイトル" 
[  変更前の本文  ]
<p><iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="http://smdn.hatenablog.jp/entry/2013/09/25/130552" src="http://smdn.hatenablog.jp/embed/2013/09/25/130552" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="http://smdn.hatenablog.jp/entry/2013/09/25/130552">smdn.hatenablog.jp</a></cite></p>
[  変更後の本文  ]
<p><iframe class="embed-card embed-blogcard" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" title="http://smdn.hatenablog.jp/entry/2013/09/25/130552" src="https://smdn.hatenablog.jp/embed/2013/09/25/130552" frameborder="0" scrolling="no"></iframe><cite class="hatena-citation"><a href="http://smdn.hatenablog.jp/entry/2013/09/25/130552">smdn.hatenablog.jp</a></cite></p>

http://smdn.hatenablog.jp/entry/2013/09/25/130835 "test9" (変更なし)
http://smdn.hatenablog.jp/entry/2013/09/25/130823 "test8" (変更なし)
http://smdn.hatenablog.jp/entry/2013/09/16/232017 "test2" (変更なし)
http://smdn.hatenablog.jp/entry/2013/09/16/231938 "test1" (変更なし)
完了

--input-contentの例

$ echo '<iframe src=http://exmaple.com/>' | dotnet FixMixedContent.dll -- --fix-mixed-content --input-content -
<iframe src=https://exmaple.com/>
$ echo '<a href=http://example.com/>' | dotnet FixMixedContent.dll -- --fix-blog-url --custom-domain example.com --input-content -
<a href=https://example.com/>

DumpAllEntries.exe

(2014-08-22) はてなブログにMovable Type形式でのエクスポート機能が追加されました。 (記事データをエクスポートできるようにしました。ブログのバックアップ等にご利用ください - はてなブログ開発ブログ) このツールでも引き続きMovable Type形式でのダンプを行うことはできますが、記事に付いたコメントなどは保存されず、また記事数が多い場合は処理に時間がかかります。 そのため、はてなブログのエクスポート機能を使うことをおすすめします。

すべてのブロク記事をダンプするツールです。 はてなブログからのエクスポートなどに使うことができます。

使用例
DumpAllEntries.exe --id hatena --blog-id hatena.hatenablog.jp --api-key ****** --format mt 出力ファイル名
オプション
--id はてなID, --blog-id ブログID, --api-key APIキー
必須。 §.共通の必須オプションを参照してください。
--format 出力フォーマット
オプション。 mtを指定するとMovable Type形式、hatenaを指定するとはてなの日記データ形式、atomを指定するとAtomフィード形式で出力します。 省略した場合はAtomフィード形式で出力します。
出力ファイル名
オプション。 ダンプした結果を保存する際のファイル名を指定してください。 省略した場合、-を指定した場合は標準出力に書き出します。
--include-category カテゴリ名
オプション、複数指定可。 指定されたカテゴリが設定されている記事のみを抽出してダンプします。 例として「--include-category 日記 --include-category お知らせ」と指定した場合は、記事に[日記]と[お知らせ]のどちらか一方でも設定されていれば抽出されます。 --include-category--exclude-category同時に指定することはできませんは
---exclude-category カテゴリ名
オプション、複数指定可。 指定されたカテゴリが設定されている記事を除外してダンプします。 例として「--exclude-category 日記 --exclude-category お知らせ」と指定した場合は、記事に[日記]と[お知らせ]のどちらか一方でも設定されていれば除外されます。 --include-category--exclude-categoryはは同時に指定することはできませんは

このツールでは記事ごとの設定や記事に付けられたコメントはダンプされません(はてなブログAtomPubの仕様)。 そのため、このツールで出力された結果を再度インポートしても完全には記事を復元できないため、バックアップ用途に使うことはできません

その他、フォーマット毎の制限事項は以下のとおりです。

PostNewEntry.exe

ブログに新規記事を投稿するツールです。 ファイルに書いた内容を投稿したり、他のツールが生成した結果を直接投稿したりすることができます。

使用例
PostNewEntry.exe --id hatena --blog-id hatena.hatenablog.jp --api-key ****** --title タイトル --category カテゴリ1 --category カテゴリ2 投稿文...
PostNewEntry.exe --id hatena --blog-id hatena.hatenablog.jp --api-key ****** --title タイトル --from-file post.txt
オプション
--id はてなID, --blog-id ブログID, --api-key APIキー
必須。 §.共通の必須オプションを参照してください。
--title タイトル
オプション。 投稿する記事のタイトルを指定してください。 指定しなかった場合は、空欄のまま投稿します。
--category カテゴリ
オプション、複数指定可。 投稿する記事に設定するカテゴリを指定してください。
--from-file ファイル
オプション。 指定されたファイルを読み込んでその内容を本文として投稿します。 -を指定すると標準入力から読み込みます。 指定しなかった場合は、コマンドライン引数で指定されているテキストを本文として投稿します。

このツールを使って複数の記事を投稿する場合は1日あたりに投稿できる記事数の制限にご注意ください。 2013-12-03現在では1日あたり100件まで投稿できます。 (1日の記事数と、1記事あたりのコメント数の制限を緩和しました - はてなブログ開発ブログ)

ReplaceEntryContent.exe

ブログ内の全記事を検索して内容を一括置換するツールです。 定型文、文末の署名やリンクなどを一括して書き換えたりする目的で使えるほか、記事内の特定の文字列を削除するためにも使うことができます。

使用例
ReplaceContentText.exe --id hatena --blog-id hatena.hatenablog.jp --api-key ****** --from "置換したい文字列" --to "置換後の文字列"
ReplaceContentText.exe --id hatena --blog-id hatena.hatenablog.jp --api-key ****** --from "置換したい文字列" --to "置換後の文字列" -n
ReplaceContentText.exe --id hatena --blog-id hatena.hatenablog.jp --api-key ****** --from "削除したい文字列"
ReplaceContentText.exe --id hatena --blog-id hatena.hatenablog.jp --api-key ****** --regex --from "置換したい文字列の正規表現" --to "置換後の正規表現"
オプション
--id はてなID, --blog-id ブログID, --api-key APIキー
必須。 §.共通の必須オプションを参照してください。
--from 文字列
必須。 置換または削除したい文字列を指定してください。
--to 文字列
オプション。 置換後の文字列を指定してください。 --toの指定を省略した場合は、--fromで指定した文字列を削除(空文字に置換)します。
--regex
オプション。 --fromおよび--toに指定された文字列を正規表現として解釈します。 正規表現を使った置換を行いたい場合はこのオプションを使用してください。
-n,--dry-run
オプション。 実際に置換は行わずに終了します。 置換される内容の確認など動作テストの際に使います。
-i,--interactive
オプション。 置換した本文を投稿する前に、その都度確認を行います。
--diff-cmd コマンド --diff-cmd-args コマンド引数
オプション。 置換前後の差分を指定されたコマンドで表示します。 diffコマンドなどで差分を確認したい場合はこのオプションを指定してください。 より詳しい設定方法については§.差分表示のオプション(--diff-cmd, --diff-cmd-args)を参照してください。

置換に際しては-n-iオプションを使って置換される内容を事前に確認することをおすすめします。

--regexオプションを指定した場合は、--toオプションで$1などの正規表現を指定することにより--fromでキャプチャした文字列に置換することができます。 --fromオプションは複数行モードの正規表現として処理されます。 --regexオプションで使用できる正規表現は.NET Frameworkで使用できる正規表現を参照してください。

ModifyCategory.exe

(2013-12-04) はてなブログにカテゴリ編集機能が追加されました。 (年の瀬にはブログも大掃除! カテゴリーを編集できるようにしたほか、記事を管理しやすくしました - はてなブログ開発ブログ) このツールでも引き続きカテゴリ編集を行うことはできます。 しかし、このツールでは記事のデータを取得・再投稿することでカテゴリの変更を行うため、記事数が多い場合は変更に時間がかかります。 そのため、カテゴリの名前を変更もしくは削除を行いたい場合は、はてなブログのカテゴリ編集機能を使うことをおすすめします。

ブログ記事のカテゴリを一括変更するツールです。 カテゴリの削除・新規設定・統合に使うことができます。

使用例
ModifyCategory.exe --id hatena --blog-id hatena.hatenablog.jp --api-key ****** "旧カテゴリ:新カテゴリ"

コマンドラインオプションは次のとおりです。

オプション
--id はてなID, --blog-id ブログID, --api-key APIキー
必須。 §.共通の必須オプションを参照してください。
-n,--dry-run
オプション。 実際に変更は行わず、変更されるカテゴリの一覧を表示して終了します。 変更される記事の確認など動作テストの際に使います。
カテゴリ指定のオプション
旧カテゴリ:新カテゴリ
オプション、複数指定可。 全記事の旧カテゴリ新カテゴリに変更します。 このオプションは以下のように指定することができます。
カテゴリのリネーム
"old:new"と指定した場合、カテゴリ[old]を[new]に変更します。 カテゴリのリネームを行う場合は、はてなブログのカテゴリ設定画面の「名前を変更」を利用することをおすすめします。
カテゴリの削除
"old:"と指定することでカテゴリ[old]を削除します。 カテゴリの削除を行う場合は、はてなブログのカテゴリ設定画面の「削除」を利用することをおすすめします。
カテゴリのリネーム (AND条件でのリネーム)
"old1;old2:new1;new2"と指定した場合、カテゴリ[old1]と[old2]の両方が指定されている記事の場合のみそれぞれをカテゴリ[new1]と[new2]に置き換えます。
カテゴリの統合 (AND条件での変更)
"old1;old2:new"と指定した場合、カテゴリ[old1]と[old2]の両方が指定されている記事の場合のみそれらを統合してカテゴリ[new]に変更します。
カテゴリの削除 (AND条件での削除)
"old1;old2:"と指定した場合、カテゴリ[old1]と[old2]の両方が設定されている記事の場合のみそれぞれを削除します。
カテゴリの新規設定
":new"と指定した場合、カテゴリが設定されていない記事にカテゴリ[new]を新規設定します。 ":new1;new2"とすればカテゴリ[new1]と[new2]の二つを新規設定します。
カテゴリの分割
"old:new1;new2"と指定した場合、カテゴリ[old]を削除してカテゴリ[new1]と[new2]を設定します。
カテゴリ指定の構文
"a;b;c:A;B"と指定した場合、カテゴリ[a][b][c]のすべてが設定されている記事のみ、[a][b][c]を[A][B]に変更します。 "a;b;c:A;B" "d:D;E"のように複数の組み合わせを指定することもできます。 ;(セミコロン)はカテゴリの区切り文字、:(コロン)は変更前後のカテゴリグループの区切り文字として解釈されます。 なお、現在のバージョンでは:(コロン)、;(セミコロン)を含むカテゴリ名を指定した場合、正しく解釈することができません
動作例
$ mono ModifyCategory.exe --id hatena --blog-id hatena.hatenablog.jp --api-key ****** "テスト:test"
以下のカテゴリを変更します
[テスト] -> [test]

エントリを取得中 ...
以下のエントリのカテゴリが変更されます
2013-09-25T13:07:55+09:00 "test7" [テスト] -> [test]
2013-09-25T13:06:56+09:00 "test5" [新しいカテゴリ][テスト] -> [新しいカテゴリ][test]
2013-09-25T13:05:52+09:00 "テスト4" [テスト][新しいカテゴリ][VB] -> [test][新しいカテゴリ][VB]
2013-09-16T23:20:17+09:00 "test2" [テスト][新しいカテゴリ] -> [test][新しいカテゴリ]
2013-09-16T23:19:38+09:00 "test1" [テスト] -> [test]
変更しますか  (y/N)? y

変更を更新中: 2013-09-25T13:07:55+09:00 "test7" [test] ... 
変更を更新中: 2013-09-25T13:06:56+09:00 "test5" [新しいカテゴリ][test] ... 
変更を更新中: 2013-09-25T13:05:52+09:00 "テスト4" [test][新しいカテゴリ][VB] ... 
変更を更新中: 2013-09-16T23:20:17+09:00 "test2" [test][新しいカテゴリ] ... 
変更を更新中: 2013-09-16T23:19:38+09:00 "test1" [test] ... 
変更が完了しました


$ mono ModifyCategory.exe --id hatena --blog-id hatena.hatenablog.jp --api-key ****** "test:" ":新しいカテゴリ"
以下のカテゴリを変更します
[test] -> (削除)
(新規設定) -> [新しいカテゴリ]

エントリを取得中 ...
以下のエントリのカテゴリが変更されます
2013/09/25 13:07:55 +09:00 "test7" [test] -> [新しいカテゴリ]
2013/09/25 13:06:56 +09:00 "test5" [テスト][test] -> [テスト]
2013/09/25 13:05:52 +09:00 "テスト4" [] -> [新しいカテゴリ]
2013/09/16 23:20:17 +09:00 "test2" [test][テスト] -> [テスト]
2013/09/16 23:19:38 +09:00 "test1" [] -> [新しいカテゴリ]
変更しますか  (y/N)? y

変更を更新中: 2013/09/25 13:07:55 +09:00 "test7" [新しいカテゴリ] ... 
変更を更新中: 2013/09/25 13:06:56 +09:00 "test5" [テスト] ... 
変更を更新中: 2013/09/25 13:05:52 +09:00 "テスト4" [新しいカテゴリ] ... 
変更を更新中: 2013/09/16 23:20:17 +09:00 "test2" [テスト] ... 
変更を更新中: 2013/09/16 23:19:38 +09:00 "test1" [新しいカテゴリ] ... 
変更が完了しました

変更を元に戻す機能はありません。 変更対象の記事が多い場合は、カテゴリを1つずつ確認しながら変更する、事前にサブブログを使って動作テストすることをおすすめします。

差分表示のオプション(--diff-cmd, --diff-cmd-args)

オプション--diff-cmdおよび--diff-cmd-argsを指定することで、変更内容の差分を指定されたコマンドで表示させることができます。 diffコマンドなどを使って変更内容を確認したい場合にはこのオプションを指定してください。

--diff-cmd コマンドではコマンドのパス、--diff-cmd-args コマンド引数ではコマンドに渡す引数を指定します。 オプション--diff-testを指定すると、指定されたコマンドが動作するかテストすることができます(ツール本来の動作は行わず、テストを行ったあとに終了します)。

--diff-cmdの指定と--diff-testでのテストの動作例
FixMixedContent.exe --diff-cmd diff --diff-test
2c2
< この行の差分が見えていなければ失敗です
---
> この行の差分が見えていれば成功です

--diff-cmd--diff-cmd-argsの指定方法をいくつか例示します。

diffコマンド
--diff-cmd diff
diffコマンド Unified形式
--diff-cmd diff --diff-cmd-args '--unified'
git diffコマンド カラー表示
--diff-cmd git --diff-cmd-args 'diff --no-index --color --'
git diffコマンド 正規表現でのword-diff
--diff-cmd git --diff-cmd-args 'diff --no-index --word-diff-regex="[^\x80-\xBF][\x80-\xBF]*" --'
git diffコマンド (Git for Windows)
--diff-cmd "C:\Program Files\Git\bin\git.exe" --diff-cmd-args "diff --no-index --"
WinMergeによるGUIでの差分表示
--diff-cmd "C:\Program Files\WinMerge\WinMergeU.exe"

差分表示にマージ用のツールなどを使う場合、ツール上で差分を変更しても再投稿される内容には反映されないので注意してください。 現時点ではあくまで差分の表示のみをサポートしています。

その他特記事項

  • 本ツールは、はてなブログをより便利に使うための機能を提供することを目的としています。 特にDumpAllEntries.exeは、記事データをいつでも自分の手元にダウンロードできる手段を用意することにより、気軽にはてなブログを使い始め、また安心して使い続けられるようにすることを目的としています。
  • ウェブサービスではなくコマンドラインツールであるため、ユーザー自身とはてなブログ以外の第三者に認証情報や記事の内容を送信することはありません。 プライベートブログを運営している場合などでも安心してお使いいただけます。

APIキーの取り扱いについて

APIキーを公開したり他の誰かに知られたりしないようにしてください。 APIキーが第三者に知られた場合、HatenaBlogToolsだけでなくAPIキーを使用する他のツールも実行可能な状態となり、ブログの記事内容の改竄や勝手な新規投稿を許すことにつながります。

誤ってAPIキーを公開してしまった場合には、ブログの詳細設定より古いAPIキーを破棄して新しいAPIキーを発行することができます。

なお、本ツールではAPIキーはコマンド実行時のみに使用し、コマンド終了時には破棄します。 ファイルやレジストリ等にAPIキーをキャッシュすることはありません。

不具合・要望等

不具合や機能追加の要望等は掲示板へどうぞ。

変更履歴

version 2.0 / 2018-04-22

  • すべてのコマンドについて
    • ルートエンドポイントにてログインを試行し、コレクションURIをサービス文書から取得するように動作を変更した
    • TLS 1.2を使用し、常にHTTPSで接続するようにした
    • リクエスト送信時にUser-Agentヘッダを設定するようにした (ツールのバージョン情報、ランタイムのバージョン情報、OSバージョン情報を送信)
    • .NET Core版を追加
    • 長いコマンドラインオプションの形式を-longoptから--long-optionのように変更 (旧来のコマンドラインオプションも引き続き使用可能)
  • FixMixedContent.exeを追加
  • Login.exeを追加
  • ReplaceContentText.exe
    • 正規表現での置換時のパフォーマンスを若干向上
    • AtomPubメンバURIではなく、ブログエントリのURL(text/htmlのalternative link)を表示するように変更
    • オプション--diff-cmd, --diff-cmd-argsを追加、変更内容を指定されたdiffコマンドで表示できるようにした
    • オプション-iを追加、置換内容を投稿する前に都度確認できるようにした
  • ModifyCategory.exe
    • エントリの投稿日時ではなく、ブログエントリのURL(text/htmlのalternative link)を表示するように変更
  • DumpAllEntries.exe
    • --format atomで明示的にAtom形式を指定して出力できるようにした
    • Movable Type形式について、HTTPSを有効にしている場合にBASENAMEが正しく出力されない不具合を修正

version 1.06 / 2014-09-26

  • atom:publishedおよびatom:updatedに不正な形式の日時が設定されている場合はその値を無視するようにした
  • DumpAllEntries.exe
    • 指定されたカテゴリの記事のみを抽出/除外してダンプできるようにした
    • atom:updatedに不正な形式の日時が設定されていた場合、Movable Type形式の場合はDATEメタデータを出力せず、はてな日記データ形式の場合はunix epochとみなして出力するようにした

version 1.05 / 2014-08-23

  • DumpAllEntries.exe
    • Movable Type形式で出力する場合は、はてなブログでエクスポートされるものと同じ内容でBASENAMECONVERT BREAKSを出力するようにした

version 1.04 / 2014-06-13

  • ModifyCategory.exe
    • 変更するカテゴリをAND条件で指定できるようにした
    • カテゴリの新規設定ができるようにした

version 1.03 / 2014-02-02

  • ReplaceEntryContent.exeを追加

version 1.02 / 2013-12-03

  • PostNewEntry.exeを追加

version 1.01 / 2013-11-22

  • DumpAllEntries.exe
    • Movable Type形式・はてな日記データ形式でのダンプをサポート

version 1.00 / 2013-11-18

  • 初版