はてなブログのHTTPS化とblogsyncによる一括編集
このブログでHTTPS配信を設定したのは3月のことでした。
そういえばtech blogの方はHTTPS配信設定しました。
— progrhyme (@progrhyme) 2018年3月24日
このブログは開設から日が浅く、記事数も少ないので特に記事内容のリンクを修正するといった手間はほとんど発生しませんでした。
…が、つい先日、軽い気持ちで管理者権限を持っている別のはてなブログをHTTPS化したところ、mixed contentsが大量に発生し、スライドなどの埋込みコンテンツが真っ白になるという事態になってしまいました。
最近の記事は手作業でちまちまとリンクを修正したのですが、合計で300以上の記事数が有り、さすがにやってられんということで自動化できる手段がないかな…と調べました。
そこで思い出したのが、 @kiririmode さんが書いていた下の記事です。
blogsync というツールを使うと、はてなブログの記事を一括で編集操作できるようです。
というわけで、やってみました。
blogsyncのインストール
以下、動作環境はUnix系OSの前提で書きます。
blogsyncはGo言語で書かれたCLIツールです。
下のコマンドでインストールできます。
go get github.com/motemen/blogsync
設定ファイルの用意
READMEの通りですが、 $HOME/.config/blogsync/config.yaml
という設定ファイルを用意します。
このブログをサンプルとすると、下のような内容になります:
tech-progrhyme.hatenablog.com: username: progrhyme password: <APIキー> default: local_root: /home/progrhyme/my/blog
ここで、 <APIキー>
は、はてなブログの詳細設定画面から取得することができます。
全エントリをはてなブログからダウンロード
blogsync pull tech-progrhyme.hatenablog.com
これにより、設定ファイルの local_root
で指定したディレクトリ配下に記事のテキストがダウンロードされます。
下のように tech-progrhyme.hatenablog.com/entry/${日付}/${記事名 or タイムスタンプ}.md
というファイル名で格納されます。*1
/home/progrhyme/my/blog └── tech-progrhyme.hatenablog.com └── entry ├── 20170314 │ └── 1489417212.md ├── 20170331 │ └── 1490886079.md ├── 20170521 │ └── 1495292715.md :
記事のリンクを一括置換
git grep -l http://tech-progrhyme | xargs perl -pi -e 's|http://tech-progrhyme|https://tech-progrhyme|g'
他に、いくつかのドメインについても、以下の条件を満たすものは同様に一括置換しました:
ワンライナーとしては下のようになりました:
for domain in www.slideshare.net qiita.com togetter.com connpass.com; do echo $domain git grep -l http://$domain | xargs perl -pi -e "s|http://${domain}|https://${domain}|g" done
更新したコンテンツをアップロード
これらの記事テキストはGitで管理することにしたので、以下のようにして差分のあるファイルをblogsyncコマンドでpushしました:
git diff origin/master --name-only | xargs -t -n1 blogsync push
以上で、作業は完了です。
ブログのページにアクセスすると、ちゃんと各リンクのURLが更新されていました。
終わりに
調べてみて「これなら簡単にできそうだな」と思ったのですが、やってみると実際に簡単でした。
こういったツールやAPIが整っていて良かったです。
もし、はてなブログのHTTPS化をまだやっていなくて、このような記事内容の一括編集が必要な方がいたら、blogsyncが活用できそうです。
ご参考まで。
参考
脚注
*1:ファイル名が*.mdなのはMarkdownで編集しているので
*2:実際は別のドメインですが、説明の流れで http://tech-progrhyme.hatenablog.com を対象としています。