すくらっぷ あんど びるどー(したい)

日々やった事のメモとかまとめ。

logsyncを導入してローカルでブログ記事を更新できるようにしたのと、PowerShellでの失敗の話

これ自体をblogsyncでやりました。

ローカルではてなブログの記事の管理をしたかったので、はてなブログ用のCLIツール「blogsync」を導入した。

今回は、Windows環境でこの blogsync を導入して自由にローカル執筆できる環境を作るまでの手順と実際につまずいた数々の失敗、そして一番重要な「APIキー(パスワード)流出を防ぐセキュリティ対策」まとめる。

導入編:Scoopの罠と、一番ラクな「Go言語経由」でのインストール

Windowsでコマンドラインツールを入れる時、パッケージマネージャーの「Scoop」でやろうとして失敗した。

# 失敗例
scoop install blogsync
# => Couldn't find manifest for 'blogsync'. (そんなアプリ無いよ、と怒られます)

なんか公式ではないらしい。この辺はよーわからん。調べてくれたことをうのみにするならばである。 なのでGo言語で行った。

  1. Go言語(本体)をインストールする
  2. 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 ファイルをネットにアップロード(コミット)してはいけません。

www.psi.co.jp

正直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 blognot 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がやった方がはやい。とはいえこれで色々とはかどりそう。少なくとも実際に動いたというのは良い経験になった。あとエラーも勉強になった。明日には忘れてそうだけど。
あとは慣れだと思われる。