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

ダウンロード

MIT X11ライセンスでのリリースとなります。

変更履歴、および過去のリリース・version 3.0以前のソースコードは§.変更履歴をご覧ください。

現在、本ツール(HatenaBlogTools)と同名のVisual Studio Code拡張がリリースされています。 作者は別であり、こちらでは質問等は受け付けられないので、混同にご注意ください。 VSCode拡張のHatenaBlogToolsをご所望の方・問い合わせを行いたい方は下記リンクをご覧ください。

本ツールの実行可能ファイルは現在このページのみで配布しており、Visual Studio Marketplaceを含む各種ホスティングサイトでは配布していませんので、入手元にはご注意ください。 このページ以外から入手した実行可能ファイルの使用による動作結果については一切保証できませんのでご注意ください。

本ツールはVisual Studio Code対応のツールではありません。 現在、HatenaBlogToolsで検索すると使い方等を掲載した記事が複数掲載されていますが、それらを参照する際はお手数ですが本ツールに関する解説かどうかをご確認ください。

また、新規に解説記事を掲載しようと考えている方に於かれましては、「はてなブログ用ツール(HatenaBlogTools)」ないしは「HatenaBlogTools(コマンドラインツール集)」のようにVSCode拡張と弁別できるような表記とするか、少なくとも本ページへのリンク付きで記載していただけますと幸いです。

必要環境

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

  1. .NET Core Runtime 3.1以上
  2. Mono 6.6以上
  3. .NET Framework 4.7以上

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

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

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

使い方

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

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

まず§.各ツール共通の使い方を一読した上で、目的にあわせて上記のツールの使い方を参照してください。

各ツール共通の使い方

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

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

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

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


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

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

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

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


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

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

ツールの出力が文字化けする場合は、ターミナルで使用する文字コードをUTF-8に変更するなどしてください。 コマンドプロンプトの場合は、以下のコマンドで文字コードをUTF-8に変更することができます。 以下のコマンドを入力してからツールを起動してください。

コマンドプロンプトの文字コードをUTF-8に変更するコマンド
chcp 65001

共通の必須オプション

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

使用例(Login.exeの場合)
Login.exe --id hatena --blog-id hatena.hatenablog.jp --api-key ******
--id はてなID
はてなID(はてなのユーザーID)を指定してください。 はてなIDはブログのアカウント設定(id:******の部分)またはプロフィールページにてご確認ください。
--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

(混在コンテンツの修正する場合、ただしドメイン部がexample.netのURLは修正対象から除外する)
FixMixedContent.exe --id hatena --blog-id hatena.hatenablog.jp --api-key ****** --fix-mixed-content --exclude-domain example.net

(修正の適用は行わず、混在コンテンツの修正内容のみを表示する場合)
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-mixed-contentのサブオプション
--include-domain ドメイン名
オプション、複数指定可。 指定されたドメイン名のURLのみを修正対象とします。 例として「--include-domain example.com --include-domain example.net」と指定した場合は、混在コンテンツとなりうるURLのうち、ドメイン部分がexample.comまたはexample.netのものだけをhttps://に修正します。
なお--include-domain--exclude-domain同時に指定することはできません
--exclude-domain ドメイン名
オプション、複数指定可。 指定されたドメイン名のURLを修正対象外とします。 例として「--exclude-domain example.com --exclude-domain example.net」と指定した場合は、混在コンテンツとなりうるURLのうち、ドメイン部分がexample.comまたはexample.netのものはhttps://に修正しません。
なお--include-domain--exclude-domain同時に指定することはできません
--fix-blog-url
オプション。 記事本文内における自ブログのURLをhttp://からhttps://に修正します。 ブログのHTTPSを有効にする際に、記事内のURLも変更したい場合に使用します。 動作の詳細は§.--fix-blog-urlの動作で解説します。
--fix-blog-urlのサブオプション
--custom-domain 独自ドメイン名
オプション。 独自ドメインを使用してブログを公開している場合、その独自ドメインを指定します。 --fix-blog-urlで自ブログURLの修正を行う場合に、独自ドメインのURLも修正したい場合に指定します。
--update-content
オプション。 上記オプションでの修正箇所がない場合でも、常に再投稿を行うことにより記事を更新します。 ただし、-n,--dry-runが指定されている場合は、このオプションが指定されていても再投稿は行いません。 その他、動作の詳細は§.--update-contentの動作で解説します。
--list-fixed-entry
オプション。 すべての記事の更新が完了した際に、修正を行った記事のURL一覧を表示します。
--entry-url-skip-to エントリURL
オプション。 指定された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の修正も本ツールでは修正できません。 記事本文に埋め込まれたCSSなどの修正に関しては、§.ReplaceContentText.exeをご利用ください。

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

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

--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のサポート状況を事前にご確認ください。

一部のURLを除外して修正したい場合はオプション--exclude-domainを一緒に指定してください。 逆に、一部のURLだけを修正したい場合はオプション--include-domainを一緒に指定してください。


--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修正のテストを目的としてお使いください。

2018-04時点では、自ブログのURLをhttps://を変更にしても[〜:embed]などのリンク記法で貼り付けた自ブログの記事リンクはHTTPのままとなるようです。 これはHTTPS化を有効にしたあとに記事を更新してもそのままとなるようです。 はてなブログの仕様なのか、今後変更される予定があるのかどうかは未確認です。

--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フィード形式で出力します。 はてなブログAtomPub APIで取得できる内容をすべて出力します。 --formatの指定を省略した場合は、この形式で出力します。
atom-post
atomを指定した場合と同様ですが、投稿データのみを含むAtomフィード形式で出力します。 はてなブログの管理上使用されるデータ等は除去されます。
atom-blogger
Blogger向けのAtomフィード形式で出力します。
entry-file
本文の内容(編集画面と同じ内容)を記事ごとに個別のファイルへ出力します。 各記事のタイトル・カテゴリ等は別のファイルentry-metadata.ブログドメイン名.xmlにまとめてAtomフィード形式で出力します。
出力ファイル名または出力ディレクトリ名
オプション。 ダンプした結果を保存する際のファイル名を指定してください。 省略した場合、-を指定した場合は標準出力に書き出します。
--format entry-fileを指定した場合は必須のオプションになります。 出力先のディレクトリを指定してください。
--include-category カテゴリ名
オプション、複数指定可。 指定されたカテゴリが設定されている記事のみを抽出してダンプします。 (より詳しくは§.--include-categoryと--exclude-categoryを参照してください)
---exclude-category カテゴリ名
オプション、複数指定可。 指定されたカテゴリが設定されている記事を除外してダンプします。 (より詳しくは§.--include-categoryと--exclude-categoryを参照してください)
--exclude-notation 記法名
オプション、複数指定可。 指定された記法で記述されている記事のみを抽出してダンプします。 (より詳しくは§.--include-notationと--exclude-notationを参照してください)
--include-notation 記法名
オプション、複数指定可。 指定された記法で記述されている記事を除外してダンプします。 (より詳しくは§.--include-notationと--exclude-notationを参照してください)

オプションの詳細

--include-category--exclude-category

--include-category 日記 --include-category お知らせ」と指定した場合は、記事に[日記]と[お知らせ]のどちらか一方でも設定されていれば抽出されます

--exclude-category 日記 --exclude-category お知らせ」と指定した場合は、記事に[日記]と[お知らせ]のどちらか一方でも設定されていれば除外されます

--include-category--exclude-category同時に指定することはできません

--include-notation--exclude-notation

--include-notation--exclude-notationには、次のいずれかの記法を指定することができます。

html
見たままモード(HTML形式)で記述されている記事を除外/抽出します。
hatena
はてな記法モードで記述されている記事を除外/抽出します。
md
Markdownモードで記述されている記事を除外/抽出します。

--include-notation md --include-notation html」と指定した場合は、Markdownモードと見たままモードの記事のみが抽出されます

--exclude-notation md --exclude-notation html」と指定した場合は、Markdownモードと見たままモードの記事が除外されます

--include-notation--exclude-notation同時に指定することはできません

はてなブログAtomPub APIの仕様による制限

はてなブログAtomPub APIでは、記事ごとの設定や記事に付けられたコメントは取得できません。 そのため、このツールの出力結果には記事のタイトル・本文・カテゴリといくつかのメタデータのみが含まれます。 記事ごとの設定やコメントは含まれません。

また、同APIでは、記事がどの記法で書かれた内容かを取得することはできますが、投稿の際は常にブログ設定で指定されている記法として投稿されます。

上記のことから、このツールで出力された結果を再度インポートしても完全には記事を復元できません。 したがって、このツールをバックアップ用途に使うことはできません

各出力フォーマットの詳細と制限事項

Movable Type形式

  • 常にUTF-8で出力します。
  • メタデータはAUTHOR, TITLE, STATUS, DATE, TAGS, BASENAME, CONVERT BREAKSを出力します。
  • カテゴリはすべてタグ(TAGS)として出力します。 PRIMARY CATEGORYおよびCATEGORYは出力しません。
  • エントリ本文(BODY)にはオリジナル文面ではなく、各種記法から変換されたHTML(hatena:formatted-content)を出力します。
    • はてなキーワードへの自動リンクもそのまま出力します。 なお、キーワードの自動リンクを削除する機能を搭載する予定はありません。

はてな日記データ形式の制限事項

  • 常にUTF-8で出力します。
  • すべてはてな記法で記述されているものとして出力します。 Markdown形式・見たままモードで書かれている記事であってもインポートする際にははてな記法として扱われます。
  • 記事中で見出し記法(*~~)を使用していてもそのまま出力するため、インポートする際には個別の記事として扱われます。
  • はてなグループにてインポート出来ることを確認しています。 それ以外のサービスでインポート可能かどうか未検証です。

Blogger向けのAtomフィード形式形式

  • メタデータはatom:id, atom:author, atom:published, atom:updated, atom:title, atom:category, app:control/app:draftを出力します。 (ただし、atom:updatedなどBlogger側でインポートされないメタデータもある模様です)
  • エントリ本文(atom:content)にはオリジナル文面(atom:content)ではなく、各種記法から変換されたHTML(hatena:formatted-content)を出力します。
    • はてなキーワードへの自動リンクもそのまま出力します。 なお、キーワードの自動リンクを削除する機能を搭載する予定はありません。

個別のファイルへ出力

  • 指定されたディレクトリへ本文を記事ごとに個別のファイルに保存します。
    • ファイル名は公開年月日・エントリのURL(カスタムURLが指定されている場合はそのURL)を元に決定されます。
    • ファイル拡張子は、本文の記法に合わせて決定されます。
      • はてな記法の場合は.hatena.txt
      • Markdownの場合は.md
      • 見たままモード(HTML)の場合は.html
      • 未定義・未知の記法の場合は.txt
  • タイトル・記事のカテゴリを含む、本文以外のメタデータは、Atomフィード形式で個別のファイルにまとめて出力します。
    • atom:contentは、内容を削除し、替わりに該当する記事のファイルへのリンク(フルパス)をXLink属性で記述します。 出力例は以下を参照してください。
ダンプされるメタデータファイルにおけるatom:contentの出力例
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app" xmlns:xlink="http://www.w3.org/1999/xlink">
  <entry>
    <title>個別のファイルへの出力例</title>
    <content type="text/x-markdown" xlink:type="simple" xlink:href="file:///path/to/output/directory/20200401_entry-2020-04-01-195242.md" />
      :
      :

DumpAllEntriesを使ったブログのエクスポート/インポート事例

DumpAllEntriesを使ってエクスポートしたデータは、以下のブログサービスにてインポートできることを確認しています。 これ以外のブログサービスでのインポート可能かどうかは未検証です。

  • はてなブログ
  • はてなダイアリー
  • Blogger

以下のエクスポート/インポート事例を観測しています。 過去のバージョンを使用した事例もあるため、現在も確実に動作することを保証することはできませんので、参考としてご覧ください。

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 カテゴリ
オプション、複数指定可。 投稿する記事に設定するカテゴリを指定してください。
--draft
オプション。 記事を下書きとして投稿します。 指定しなかった場合は、投稿完了と同時に公開されます。
--from-file ファイル
オプション。 指定されたファイルを読み込んでその内容を本文として投稿します。 -を指定すると標準入力から読み込みます。 指定しなかった場合は、コマンドライン引数で指定されているテキストを本文として投稿します。
--from-atom-file ファイル
オプション。 Atomフィード形式のファイルに記載されている内容で投稿します。 ファイルのフォーマットは§.DumpAllEntries.exeで出力されるAtomフィード形式と同じです。
ファイルに複数のエントリが記載されている場合は、それらをすべて投稿します。 既存のエントリの場合(メンバURI・link[@rel="edit"]@hrefが定義されていて、実際に存在する場合)は、新規投稿ではなく対象のエントリを更新します
このオプションを指定した場合、--title, --category, --draft, --from-fileの各オプションおよび投稿文の指定はすべて無視されます。

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

ReplaceContentText.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に指定された文字列を正規表現として解釈します。 正規表現を使った置換を行いたい場合はこのオプションを使用してください。
--replace-title-only
オプション。 記事の本文ではなくタイトルに対して置換を行います。
-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キーを発行しておくようにすることを推奨します。

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

不具合・要望等

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

変更履歴

version 3.0 / 2020-04-02

  • すべてのコマンドについて
    • 必要ランタイム要件をそれぞれ.NET Core 3.1/.NET Framework 4.7/Mono 6.6以上に変更
    • はてなブログAPI接続時に使用するTLSプロトコルバージョンを1.2固定からシステムのデフォルト動作での選択となるように変更(暗号スイートを含む)
    • はてなブログAPI接続時にサーバー証明書の検証を行うようにした
    • エントリの著者(atom:author)が複数となる場合をサポート (ただし、はてなブログProのブログに対して実際に動作するかは未検証)
  • ReplaceEntryContent.exe
    • タイトルのみの置換を行うためのオプション--replace-title-onlyを追加
  • DumpAllEntries.exe
    • Blogger形式でダンプするためのオプション--format atom-bloggerを追加
    • 各エントリを個別のファイルとしてダンプするためのオプション--format entry-fileを追加
      • 各エントリのタイトル・カテゴリ・投稿日・下書き等のメタデータはentry-metadata.&var{ブログID}.xmlにまとめて出力
    • 特定の記法で書かれたエントリのみを除外/抽出するためのオプション--exclude-notation/--include-notationを追加

version 2.2 / 2018-05-19

  • すべてのコマンドについて
    • リクエスト送信時のリトライ・タイムアウトの設定を、60秒ごと最大0回リトライから20秒ごと最大3回リトライに変更
    • サーバー証明書の検証処理をランタイムのデフォルト動作に変更
  • FixMixedContent.exe
    • オプション--entry-url-skip-toを追加、指定されたURLのエントリまで処理をスキップできるようにした
    • 更新に失敗して処理を中断する際に、失敗したエントリのURLを出力するように変更
  • ReplaceContentText.exe
    • 更新に失敗して処理を中断する際に、失敗したエントリのURLを出力するように変更
  • PostNewEntry.exe
    • オプション--from-atom-fileを追加、Atomフィード形式のファイル内容に基づいてエントリを投稿できるようにした
      • 制限事項:現時点のはてなブログAtomPub APIの仕様では、記法を指定して投稿しても強制的にブログの編集モードとなる模様
    • 例外エラーにより投稿に失敗した場合に、詳細なエラー原因を出力するように変更
  • DumpAllEntries.exe
    • オプション--formatに指定できるフォーマットとしてatom-postを追加、はてなブログの管理に用いられるデータを除いて投稿データのみを含むAtomフィード形式でダンプできるようにした

version 2.1 / 2018-04-28

  • すべてのコマンドについて
    • リクエスト送信時に設定するUser-Agentをusageで表示するようにした
  • FixMixedContent.exe
    • オプション--include-domain/--exclude-domainを追加、--fix-mixed-contentで修正対象に含める/除外するURLのドメインを指定できるようにした
    • 変更箇所のあるなしを若干わかりやすく表示するようにした
    • デバッグ用のコードが残っていたのを修正

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

  • 初版