PowerShellを駆使してQiita閲覧数を効率化！作業時間30万円分を節約する自動ツール

![00014622_51f602.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784222/5ec1a4d5-a787-af3a-157a-d1319e14c6fe.jpeg)

# はじめに

　「夏が過ぎ　風あざみ　誰の憧れに彷徨う」――これは井上陽水の「少年時代」の冒頭の一節ですが、それを思わせる美しい風景画像を見つけました。（うっとり）  
ただし、この風景画像はAIが生成したものです。これに限らず、AI技術の進化には本当に驚かされます。企業においても、こうした技術を早く導入しないと、気がつけば「コダック」や「シアーズ」、「ブラックベリー」のように時代に取り残されてしまうのではないかと感じています。  
　さて、脱線はここまでにして、今日はWindowsだけで完結する「Qiita投稿記事の閲覧数取得ツール」をご紹介したいと思います。


# 背景

　最近、記事を頻繁に投稿するようになったのですが、悪い癖で「今日はどれくらいの方が読んでくれたのだろう…」と、ついつい確認したくなってしまいます。その度にQiita APIを送信するため手作業でいろいろと設定し、閲覧数を確認していました。
 　作業にかかる時間は1回につき約5分ほど。1日で5回程度確認すると、1日で25分、1週間では175分、年間に換算すると9,125分の時間が無駄になっています。お金に換算するのは少し気が引けますが、時給2,000円と考えると、約304,167円もの損失です。30万円近くのロスは無視できない金額です。  
　そこで今回は、定期的に自動で閲覧数を取得するツールを開発することにしました。Linux系OS向けの方法は色々と公開されていますが、Qiitaの投稿者全員がプログラミングに精通しているわけではありません。そこで、`WSL`を使わずにWindowsだけで動かせるツールを開発することにしました。



# 現状のプログラムの紹介
　冒頭で触れた通り、WindowsのパソコンでもWSL（Windows Subsystem for Linux）を使用することで、Linux環境のコマンドラインを利用して簡単に実行することが可能です。

 ```:
curl -H 'Authorization: Bearer ****************************************' 'https://qiita.com/api/v2/items/fa16888c60dfae0a6479' | jq | grep -E "page_views_count|likes_count|reactions_count|stocks_count|followees_count|followers_count"
curl -H 'Authorization: Bearer ****************************************' 'https://qiita.com/api/v2/items/ecedd7c85ca1b0b0fc58' | jq | grep -E "page_views_count|likes_count|reactions_count|stocks_count|followees_count|followers_count"
curl -H 'Authorization: Bearer ****************************************' 'https://qiita.com/api/v2/items/155a83163849db593b51' | jq | grep -E "page_views_count|likes_count|reactions_count|stocks_count|followees_count|followers_count"
curl -H 'Authorization: Bearer ****************************************' 'https://qiita.com/api/v2/items/551c93cd94404c9381c7' | jq | grep -E "page_views_count|likes_count|reactions_count|stocks_count|followees_count|followers_count"
curl -H 'Authorization: Bearer ****************************************' 'https://qiita.com/api/v2/items/d1d263ece0e23c7d7576' | jq | grep -E "page_views_count|likes_count|reactions_count|stocks_count|followees_count|followers_count"
curl -H 'Authorization: Bearer ****************************************' 'https://qiita.com/api/v2/items/dacebc6d548af229d257' | jq | grep -E "page_views_count|likes_count|reactions_count|stocks_count|followees_count|followers_count"
.......
 ```
上記のように、Qiitaのアクセストークン（Bearer ****************************************）を使用してAPIを叩くことで、ページビュー数やいいね数などを取得していました。コマンドをテキストファイルに保存しておけば、Ubuntuのターミナルで簡単に実行できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784222/dc12bfde-6e13-7c46-d871-893bb9b67ee6.png)

このように、複数行をまとめて実行し、Qiitaのページビュー数（page_views_count）を一括で確認していました。しかし、1日に何度もこれを実行するのは面倒です。

# 改良したプログラムの紹介
今回の目標は、プログラムに詳しくない人でも、Windows上で簡単に実行できるツールを作ることでした。そこで、すべてをPowerShellで実装しました。私は今回、PowerShellを本格的に学び始めたのですが、その柔軟性には驚きました。特に、古いDOSコマンドに比べて使い勝手が良いと感じました。

では、今回作成したプログラムをご紹介します。

```powershell:qiita_score.ps1
$headers = @{"Authorization" = "Bearer ****************************************"}

# 取得するURLのリスト
$urls = @(
    'https://qiita.com/api/v2/items/fa16888c60dfae0a6479',
    'https://qiita.com/api/v2/items/ecedd7c85ca1b0b0fc58',
    'https://qiita.com/api/v2/items/155a83163849db593b51',
    'https://qiita.com/api/v2/items/551c93cd94404c9381c7',
    'https://qiita.com/api/v2/items/d1d263ece0e23c7d7576',
    'https://qiita.com/api/v2/items/dacebc6d548af229d257',
    'https://qiita.com/api/v2/items/4bbf2c987856a9435280',
    'https://qiita.com/api/v2/items/bee253fcb345c7428224',
    'https://qiita.com/api/v2/items/55ed1488ecae8357b614',
    'https://qiita.com/api/v2/items/0d4aa37cef5bd071ea7b',
    'https://qiita.com/api/v2/items/ac599fc8968e50c21d99',
    'https://qiita.com/api/v2/items/6f0bb486128832885138',
    'https://qiita.com/api/v2/items/0559f7d8d91c9a010eda',
    'https://qiita.com/api/v2/items/2bd4743c529082e76e96',
    'https://qiita.com/api/v2/items/e677a87dfb66e1245d72',
    'https://qiita.com/api/v2/items/099d7c04e3e3b2358e87',
    'https://qiita.com/api/v2/items/468999b4ef28d416f7b5',
    'https://qiita.com/api/v2/items/2dbfc158da29fde7601f',
    'https://qiita.com/api/v2/items/3c356fe738e883902e91',
    'https://qiita.com/api/v2/items/f6b8e3426349767e8f7b',
    'https://qiita.com/api/v2/items/d2dd5466f3e1e125f6e4',
    'https://qiita.com/api/v2/items/45dffc2bc8334561a432',
    'https://qiita.com/api/v2/items/c6d85efae7641bde7041',
    'https://qiita.com/api/v2/items/d1578a8bedc53404f8ef',
    'https://qiita.com/api/v2/items/1e03b29bb245b553be26',
    'https://qiita.com/api/v2/items/5e51dfbf31ef4f117a9a',
    'https://qiita.com/api/v2/items/715fffd87a636565d256',
    'https://qiita.com/api/v2/items/7e2e00049ba14aca716a',
    'https://qiita.com/api/v2/items/3740e300e946b33bae00'
)


# ループでURLを処理
foreach ($url in $urls) {
    try {
        # Invoke-WebRequestでデータ取得
        $response = Invoke-WebRequest -Uri $url -Headers $headers

        # 取得したコンテンツをUTF-8で変換してJSON化
        $data = $response.Content | Out-String | ConvertFrom-Json | Select-Object page_views_count, created_at, title

        # created_atの日付フォーマットを変更
        $data | ForEach-Object {
            $_.created_at = [DateTime]::Parse($_.created_at).ToString("yyyy/M/d")
            $_
        } | Select-Object page_views_count, created_at, title

        # CSVファイルにデータを書き出す（1つ目はBOM付き、2つ目以降はAppendで追加）
        if ($urls[0] -eq $url) {
            # 最初のファイルはUTF-8 BOM付きで作成
            $data | Export-Csv -Path log.csv -NoTypeInformation -Encoding UTF8
        } else {
            # 2つ目以降はUTF-8で追加
            $data | Export-Csv -Path log.csv -NoTypeInformation -Append -Encoding UTF8
        }
    } catch {
        Write-Host "エラーが発生しました: $_"
    }
}
```
URLリスト（`$urls`)にある記事IDを自分の投稿記事に置き換えるだけで、QiitaのAPIを使ってデータを取得できます。


# 苦労したポイント
今回は主に2つの点で苦労しました。特に**PowerShell**を本格的に学ぶのが初めてだったため、スムーズに進まない部分がありました。

### 1.文字化け
**PowerShell**が`UTF-8`を正しく認識せず、出力したCSVファイルが日本語の部分で文字化けしてしまいました。この問題を解決するために、出力コンテンツを`UTF-8`で変換し、JSON化する必要がありました。
```powershell:
# 取得したコンテンツをUTF-8で変換してJSON化
$data = $response.Content | Out-String | ConvertFrom-Json | Select-Object page_views_count, created_at, title
```

それから、JSON化したコンテンツを`UTF-8`で出力し直しました。
```powershell:
$data | Export-Csv -Path log.csv -NoTypeInformation -Encoding UTF8
```


### 2.日付フォーマット
QiitaのAPIから取得した日付は「`2024-10-01T10:00:00+09:00`」のようなISO 8601形式ですが、Excelではこのままだと数値として扱えません。`yyyy/M/d`形式に変換する必要がありました。

```powershell
# created_atの日付フォーマットを変更
$data | ForEach-Object {
    $_.created_at = [DateTime]::Parse($_.created_at).ToString("yyyy/M/d")
```

### 3.改行の問題
`ps1`ファイルを実行すると、改行の形式が問題になりエラーが発生しました。これは、**LF**形式の改行ではなく、**CR+LF**形式に置き換えることで解決しました。

今回のツールはPowerShellを利用しており、Qiitaの閲覧数を簡単に取得できるようになりました。

# 実行
:::note warn
実行方法を追記いたします。(2024/10/5)
作成した`ps1`ファイルを右クリックします。すると以下のようなダイアログが出ますので、「POwerShellで実行」を選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784222/5cc0f06d-a8fc-57e3-d07a-aabe03b5e4c4.png)
:::

プログラムを実行すると、`PowerShell`のプロンプトが数十秒表示された後、自動的に閉じられます。残されたファイルは「log.txt」のみです。早速その中身を確認してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784222/0db3d563-c9d1-8c4e-26bc-0051b69a4ab5.png)

「ページビュー数」、「作成日付」、「タイトル」がすべて正しく出力されています。このA列のデータをコピーして、管理用のシートに毎日貼り付けていくことにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784222/ff6b95bf-08a0-54cd-2753-273f64dfaf01.png)

B列の「1日当たりのアクセス数」は以下の計算式で算出しています。

**[1日当たりのアクセス数] = [最大値] / ( [今日] - [作成日付] + 1)**

これで、どの投稿が急上昇しているのかを確認していく予定です。

# スケジューラ設定

このプログラムを、毎回パソコンにログインする際に自動で実行されるよう、「タスクスケジューラ」に登録します。具体的な設定方法については、別の投稿記事を参考にしていただけると幸いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784222/30341ceb-9f07-4ba3-3e81-c8641fb236eb.png)

# おわりに

これで、毎日手動で行っていた作業が自動化され、大幅に時間が節約できました。プログラムやマクロに詳しくない方でも、このスクリプトの`$urls`に自分の投稿記事のURLを設定するだけで、簡単に記事のアクセス数を取得できます。この空いた時間を、新たなコンテンツ制作に充てることができるでしょう。

最後までお読みいただき、ありがとうございました。