ルドルフもわたるふもいろいろあってな

Microsoft 365、Power Platform、PowerShellについて調べたことや検証したことなどを投稿します。技術の話は面白い。

【PowerShell】はてなブログの記事をCSVに一覧出力する

指定したはてなブログの記事情報をPowerShellを使ってCSV形式で一覧出力します。

最初に

この記事で公開しているPowerShellソースコードを作成するうえで、下記の記事を参考にさせていただきました
www.tekizai.net

具体的には Get-HatenaEntries という名前のファンクションを(一部自分好みに手をいれているものの)ほぼそのまま使わせていただいています。
m(__)m

背景

このブログは2022年9月10日現在、記事の投稿数が95です。だいぶ増えてきました。

投稿した記事内容とカテゴリーを振り返るために記事情報の一覧が欲しいと考えました。

実現方法

概要

標準機能では(= ブログの管理画面の操作では)そういった機能はないようです。
そのため、APIを使って実現してみました。

使用するAPIは「はてなブログAtomPub」を使用します。

はてなブログAtomPub」を使用します。これは、はてなブログが提供しているAPIです。

Atom Publishing Protocol とは
Atom Publishing Protocol(以下 AtomPub) はウェブリソースを公開、編集するためのアプリケーション・プロトコル仕様です。はてなブログのAtomPubと通じて、開発者ははてなブログのエントリを参照、投稿、編集、削除するようなオリジナルのアプリケーションを作成できます。

はてなブログAtomPub
https://developer.hatena.ne.jp/ja/documents/blog/apis/atom/

APIの使いかた

これらの値を使って下記の記載ルールでURIを定義します。APIキーは認証情報として渡します。
APIに対してHTTPリクエストを送ることで記事情報が返ってきます。記事情報の形式はXMLです。

$url = "https://blog.hatena.ne.jp/はてなID/【ブログID】/atom/entry"
$pass = ConvertTo-SecureString APIキー】 -AsPlainText -Force
$cr  = New-Object System.Management.Automation.PSCredential($hatenaId, $pass)

$req =Invoke-WebRequest -Method Get -Uri $url -Credential $cr

PowerShellスクリプトの使い方の説明

APIを使用するための準備

ブログの管理画面で下記の値を確認します。

これらの値の確認方法は

ブログ管理画面の「設定」を開きます

「詳細設定」を開きます

「ルートエンドポイント」をメモにひかえます。「はてなID」と「ブログID」がこれで分かりました。
次に、APIキーを確認するために「アカウント設定」のリンクをクリックします。

下図の赤枠で囲んでいる位置に「APIキー」が表示されます。APIキーの文字列をメモに控えます。

ソースコード

下記ソースコードが「はてなブログの記事をCSVに一覧出力する」PoweShellスクリプトです。
ソースコードをコピーしてテキストファイルに貼り付けてください。テキストの拡張子を.ps1にして保存してください。保存する際は文字列はUTF-8(BOMつき)にしてください。

ps1ファイルを実行すると、ps1ファイルと同じフォルダにCSVが出力されます。

#-------------------------------------------------
#入力情報の定義
#-------------------------------------------------
#region
#ハテナID
$hatenaId = "【ハテナID】"

#ブログID
$blogId   = "【ブログID】"

#APIキー
$apiKey   = "【APIキー】"

#endregion

#-------------------------------------------------
#ファンクション定義
#-------------------------------------------------
#すべての記事を取得する
function Get-HatenaEntries
{
    param
    (
      [parameter(mandatory=$true)]$blogId,
      [parameter(mandatory=$true)]$apiKey,
      [parameter(mandatory=$true)]$hatenaId
    )

    $url  = "https://blog.hatena.ne.jp/$($hatenaId)/$($blogId)/atom/entry"
    $pass = ConvertTo-SecureString $apiKey -AsPlainText -Force
    $cr  = New-Object System.Management.Automation.PSCredential($hatenaId, $pass)


    do
    {
        $req =Invoke-WebRequest -Method Get -Uri $url -Credential $cr
        $xml =([xml]$req.Content)

        Write-Output $xml.GetElementsByTagName("entry")        

        $url=($xml.feed.link | Where-Object{$_.rel -eq "next"}).href
    }
    while ($null -ne $url)
}

#-------------------------------------------------
#主処理
#-------------------------------------------------
#region
#「すべての記事を取得する」ファンクションを呼び出す
$entries = @(Get-HatenaEntries -blogId $blogId -apiKey $apiKey -hatenaId $hatenaId)

#CSVのファイル名を定義
$outputFile = ".\はてなブログの記事一覧.csv"

#記事の情報をCSVに出力
foreach($e in $entries)
{
    $obj = New-Object PSObject
    $obj | Add-Member -MemberType NoteProperty -Name 記事タイトル -Value $e.title
    $obj | Add-Member -MemberType NoteProperty -Name 投稿日時   -Value ([DateTime]$e.published).ToString("yyyy/MM/dd HH:mm:ss")
    if([string]::IsNullOrEmpty($e.category) -eq $false)
    {
        $obj | Add-Member -MemberType NoteProperty -Name カテゴリー -Value (($e.category | select term -ExpandProperty term) -join ",")

    }
    else
    {
        $obj | Add-Member -MemberType NoteProperty -Name カテゴリー -Value "-"
    }
    $obj | Add-Member -MemberType NoteProperty -Name 直接リンク -Value ($e.link | where rel -EQ alternate | select href -ExpandProperty href)
      
   #CSVに出力
    $obj | Export-Csv -Path $outputFile -Encoding UTF8 -NoTypeInformation -Append
}

#endregion

出力されるCSVの内容

出力されるCSVの列項目は下記の4つです。

  • 記事タイトル
  • 投稿日時
  • カテゴリー(複数ある場合はカンマ区切り)
  • 直接リンク


(参考)APIで記事本文を取得することもできます

今回のスクリプトでは取得対象にしていませんが、記事本文を取得することもできます。


最後に

今回はPowerShellを使ってはてなブログ記事の一覧取得を実施しました。
同じことを今後はPower Automate で実施したいと思います。それはまた、別記事として投稿したいと思います。

今回は以上です。