これ自体をblogsyncでやりました。
ローカルではてなブログの記事の管理をしたかったので、はてなブログ用のCLIツール「blogsync」を導入した。
今回は、Windows環境でこの blogsync を導入して自由にローカル執筆できる環境を作るまでの手順と実際につまずいた数々の失敗、そして一番重要な「APIキー(パスワード)流出を防ぐセキュリティ対策」まとめる。
- 導入編:Scoopの罠と、一番ラクな「Go言語経由」でのインストール
- 「blogsyncが認識されません」エラーから抜ける方法
- APIキー流出を防ぐセキュリティ設定
- ローカルに保存する
- 日々の運用フローと、PowerShell特有の失敗
- 触った所感
- まとめ
導入編:Scoopの罠と、一番ラクな「Go言語経由」でのインストール
Windowsでコマンドラインツールを入れる時、パッケージマネージャーの「Scoop」でやろうとして失敗した。
# 失敗例 scoop install blogsync # => Couldn't find manifest for 'blogsync'. (そんなアプリ無いよ、と怒られます)
なんか公式ではないらしい。この辺はよーわからん。調べてくれたことをうのみにするならばである。 なのでGo言語で行った。
- Go言語(本体)をインストールする
- Goのコマンドを使ってblogsyncをインストールする
手順1:Go言語のインストール(Scoop使用)
Scoopを使って、大元の「Go言語」をインストール。
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser irm get.scoop.sh | iex scoop install go
手順2:blogsyncのインストール
Goが入ったら、以下のコマンドを叩く。
go install github.com/x-motemen/blogsync@latest
失敗ポイント1:
goコマンドが認識されなかった 。
一度ターミナル(PowerShellの画面)を閉じて、新しく開き直してから次のコマンドを実行する。
「blogsyncが認識されません」エラーから抜ける方法
無事にインストールが終わった!と思い、確認しようとすると……
# 失敗例 blogsync -v # => blogsync : 用語 'blogsync' は、コマンドレット、関数...として認識されない。
原因は、インストールされたツール(blogsync.exe)が置かれる隠れたフォルダ(C:\Users\ユーザー名\go\bin)に、Windowsのパス(Path)通ってなかった。
環境変数をいじってもなぜか現在のターミナルに反映されなかったため、今回は「フルパスを直接指定して実行する」という力技。
# バージョン確認(これ以降はすべてこの ~/go/bin/blogsync.exe から始めます) ~\go\bin\blogsync.exe -v # => blogsync.exe version 0.20.1 (HEAD)
APIキー流出を防ぐセキュリティ設定
ツールが動くようになったら、ブログと同期するための設定ファイル(blogsync.yaml)を作る。
自分のブログの「はてなID」と「APIキー(パスワードと同等の権限を持つ超重要情報)」を書く。
⚠️ セキュリティリスクについて APIキーが他人に知られると、あなたのブログを勝手に全削除されたり、スパム記事を大量に投稿される危険性があります。 特にこのフォルダごと
GitHubなどの公開リポジトリで管理しようと思っている人は、絶対にこのblogsync.yamlファイルをネットにアップロード(コミット)してはいけません。
正直AIのAPIキーもれたりとかいうのはSNSで読んでたりするんでこわいと思いつつ触っている。
安全な設定ファイルの作り方
適当な作業用フォルダ(例:blogsync_work)を作り、そこに blogsync.yaml を作成します。
# blogsync.yaml あなたのドメイン.com: username: あなたのはてなID password: APIキー(ダッシュボード>設定>詳細設定>AtomPub にある文字列) default: local_root: ./
これをしておくことで、誤って設定ファイルがネットに公開される事故(APIキー流出)を100%防ぐことができます。
ローカルに保存する
安全な設定ファイルができたら、ターミナルで同期コマンド(pull)を叩きます!
~\go\bin\blogsync.exe pull あなたのドメイン.com
過去の記事や下書きが一斉にMarkdownファイルとしてダウンロードされる。
日々の運用フローと、PowerShell特有の失敗
こっからPowerShell特有の罠にハマった(バカ)
1. 新しく記事を下書きとして失敗
# 公式ドキュメント通りの書き方(PowerShellだとエラーになる) ~\go\bin\blogsync.exe post --draft あなたのドメイン.com < NUL # => 演算子 '<' は予約されています、と怒られる
PowerShellでは < という記号が使えないため、最初は "" | (空の文字列を流し込む)という書き方で回避しようとしました。
Windows環境においてタイトルを空文字にして作成すると、致命的なエラーがでる。
タイトルが無いと「.md」という拡張子だけのファイルが作られてしまい、Windowsシステム上で隠しファイル扱いになり、blogsyncがフォルダのパスを正しく認識できなくなった。その結果、アップロード(push)時に cannot find blog や not a blog entry というエラーがでる。
下記で実行する。
echo "テスト記事" | ~\go\bin\blogsync.exe post --draft ドメイン
こうすることで「テスト記事.md」という正常なファイルが作られ、動く。
失敗ポイント2:中身のコピペによる「EditURL」消失
エラーでファイルを作り直した際、Front Matter(ファイルの一番上の---で囲まれた設定部分)まで誤って上書きしてしまうと、ブログ側との紐付け情報であるEditURLが消えてしまいnot a blog entryと弾かれます。コピーする際は本文だけにするか、EditURLを消さないように注意してください。
やった。失敗した。誤チェストでござる!
2. 記事を投稿・更新する時
作成された .md ファイルを開き、下書きを書いて保存したら、反映する。下書きを保存しないとできない。できなかった。
# PowerShell(Windows)のパス区切りのままだとエラーになる ~\go\bin\blogsync.exe push あなたのドメイン.com\entry\_draft\my-article.md # => error "..." is not a blog entry
Windows標準の \(バックスラッシュ)でファイルパスを指定すると、blogsyncが正しくフォルダを認識できずエラーになる。
必ず /(スラッシュ)にする
# 正解のコード(スラッシュ区切り) ~\go\bin\blogsync.exe push あなたのドメイン.com/entry/_draft/my-article.md
触った所感
- 構文エラーがおおくなった。誤チェストでエラーが起こりまくる。確認は女々か? 名案にごつ!(よく確認しましょう)
- .mdというファイル名になり、Windowsで正しく認識されず cannot find blog などの謎エラーに繋がった。
- YAMLのスペース不足: Title:テスト のようにコロンやハイフンの直後にスペースを忘れるだけで構文エラーになった。
- 同期・プッシュの失敗
- パスの区切り文字: Windows標準の \(バックスラッシュ)でパスを指定すると、「記事ではない」と判定されて push できなかった(/ が正解)。パスのコピーが原因とポカミス。
- フォルダ指定漏れ: _draft/ などの階層をパスに含め忘れると、ファイルが見つからないエラーになった。 ドメインの不一致(404): 独自ドメイン (syurainu.com) の設定だけでは、内部APIドメイン (hatenablog.com) で書かれた EditURL を同期できなかった。
- 手動修正によるIDズレ: EditURL を手動でコピーした際に、古い無効なIDを貼り付けてしまい、サーバーから 404 拒否をされた。
- 多分AIなかったらできなかった。でもAI君が間違えてURL書いてる時もあるからトントンって事でどうか1つ(釣り合ってない取引)。
- 勉強も含めてやっているので楽しいんだが、慣れてない人はそもそも嫌になりそうだなって思った。実際会社でPowerShellの話をしたら嫌がられた。
- PowerShellで色々やるのは楽。これは覚えよう。
- 多分僕の良く間違うのはこうしたちょっとした文字とかの間違い……なんだと思われる。これが多い。
- shortnoteの更新がこれではかどりそう。
まとめ
初めは割と簡単にいくんじゃねーのって思ったら意外と面倒だった。たぶん僕がやらないでAIがやった方がはやい。とはいえこれで色々とはかどりそう。少なくとも実際に動いたというのは良い経験になった。あとエラーも勉強になった。明日には忘れてそうだけど。
あとは慣れだと思われる。