Qiitaで投稿した記事をプリザンターのテーブル上に作成する

# はじめに

株式会社インプリムではQiitaを使い技術ブログの作成をしています。わたしもQiitaの記事を随時投稿しているのですが、今回はプリザンターにQiitaの記事を登録して、管理したいと思ったためPowerShellで実装しました。  
PowerShellで実装した理由としては、現在担当している業務でPowerShellを使っているからです。その中でログ出力の方法や一般的な書式などを学びましたため、その学びの復習として本記事を投稿します。  

# テーマ

今回の記事でご紹介するテーマとしては「Qiitaで投稿した記事をプリザンターのテーブルに登録する」PowerShellです。Qiita APIを利用しているのですが、実は「[ChatGPT](https://chat.openai.com/auth/login)」を使って一部実装しています。「ChatGPT」にチャットした内容は「Qiitaの記事をPowerShellを使って100件取得する実装を教えてください。」と入力して、Qiitaの記事を取得するスクリプトを実装してもらいました。そのため、実際に私が実装した内容としては、「ログファイルに関する処理」と「APIを使ってプリザンターのテーブル操作に関する処理」のみです。実際の処理を後述します。  

# 処理の流れ

今回のスクリプトはとてもボリューミーなので、処理の流れを簡単に記載します。

```TEXT
1. 変数定義
2. ログファイルを作成する処理
→こちらの処理でログファイルを「$createLogDirectoryPath」で指定したディレクトリ配下に「yyyyMMddHHmmss(年月日時分秒)」形式で作成します。
3. 過去のログファイルを削除する処理
→こちらの処理で「$deletLogFilePeriod」で指定した日よりも前のログファイルを削除します。
4. レコードを全て削除する処理
→こちらの処理で「$apiKey」「$baseUri」「$recordId」を使い、特定テーブルの全レコードを削除します。
5. Qiitaの記事を取得する処理
→こちらの処理で「Qiita APIから記事を取得する処理」から記事の情報を取得し、「レコードを新規作成する処理」で特定テーブルにレコード単位(1レコード=1記事)で情報を登録します。
```

# スクリプト

```PowerShell
try {
    # 現在日時を取得
    $nowDate = Get-Date -Format "yyyyMMddHHmmss"
    # ログファイルの格納場所を定義
    $createLogFilePath = $createLogDirectoryPath + '\' + $nowDate + '.log'

    # プログラムの処理速度を計測する処理
    $processingSpeed = (Measure-Command {


    <#
    変数定義箇所
    #>

    <#
    「Qiitaの記事を取得する処理」に関する変数定義
    #>
    # Qiita APIのエンドポイントURLの指定
    $qiitaApiUrl = 'https://qiita.com/api/v2/items'
    # アクセストークン
    $accessToken = 'XXXX'
    # 取得したいユーザー名を指定
    $userName = 'XXXX'
    # 取得したい件数を指定
    $maxPage = 100

    <#
    「レコードを全て削除する処理」と「レコードを新規作成する処理」に関する変数定義
    #>
    # APIキー
    $apiKey = 'XXXX'
    # 一括処理URLとレコード作成URLのドメインまでの指定(スキーマ+ドメイン「http://localhost」のように指定)
    $baseUri = 'XXXX'
    # レコードIDを指定
    $recordId = 'XXXX'

    <#
    「過去のログファイルを削除する処理」に関する変数定義
    #>
    # ログファイルを削除する期間を定義(日にち単位)
    # 例) 18日 17:00に実行し、かつ「4」を指定した場合、14日の16:59以前のファイルが削除されます。
    $deletLogFilePeriod = X

    <#
    「ログファイルを作成する処理」に関する変数定義
    #>
    # ログファイルの格納ディレクトリのPathを定義
    $createLogDirectoryPath = 'XXXX'


    <#
    プログラム箇所
    ユーザは操作する必要なし
    #>

    # 「main処理」の呼び出し
    main

    # main処理
    function main () {
        try {
            # 「ログファイルを作成する処理」の呼び出し
            createLogFile
            # 「過去のログファイルを削除する処理」の呼び出し
            deleteLogFile
            # 「レコードを全て削除する処理」の呼び出し
            deleteRecord
            # 「Qiitaの記事を取得する処理」の呼び出し
            getQiita
        }
        # try句の中でエラーが起きたときの処理
        catch {
            # スクリプトの処理でのエラー内容をログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] ' + $error[0]
            Add-Content -Path $createLogFilePath -Value $comment
            # スクリプトの実行エラーによって異常終了
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】「main処理」の異常終了'
            Add-Content -Path $createLogFilePath -Value $comment
            # 処理を中断する
            exit
        } finally {
        # 「main処理」が渉猟したことをログファイルに出力
        $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【INFO】「main処理」が終了しました。'
        Add-Content -Path $createLogFilePath -Value $comment
        }
    }


    # ログファイルを作成する処理
    function createLogFile () {
        try {
            # 指定のフォルダが存在する場合の処理
            if (Test-Path $createLogDirectoryPath) {
                # 同名のログファイルが存在しない場合の処理
                if ( - !(Test-Path $createLogFilePath)) {
                    # 空のログファイルを新規作成
                    Out-File $createLogFilePath
                    # ログファイルが作成されたことをログファイルに出力
                    $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【INFO】ログファイルが作成されました。作成ファイル：' + $createLogFilePath
                    Add-Content -Path $createLogFilePath -Value $comment
                    # スクリプトを実行する事をログファイルに出力
                    $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】スクリプトの実行開始'
                    Add-Content -Path $createLogFilePath -Value $comment
                }
                # 同名のログファイルが存在する場合の処理
                else {
                    # ログファイルに追記する場合のログ開始位置がわかるようにログファイルに出力
                    $comment = '------------------------------------'
                    Add-Content -Path $createLogFilePath -Value $comment
                    # スクリプトを実行する事をログファイルに出力
                    $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】スクリプトの実行開始'
                    Add-Content -Path $createLogFilePath -Value $comment
                }
            }
            # 指定のフォルダが存在しない場合の処理
            else {
                # 指定のフォルダが存在しない旨、コンソールに出力
                $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 指定のフォルダが存在しません。指定のフォルダ：' + $createLogDirectoryPath
                write-host $comment
                # 処理を中断する
                exit
            }
        }
        # try句の中でエラーが起きたときの処理
        catch {
            # スクリプトの処理でのエラー内容をログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] ' + $error[0]
            Add-Content -Path $createLogFilePath -Value $comment
            # スクリプトの実行エラーによって異常終了
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】「ログファイルを作成する処理」の異常終了'
            Add-Content -Path $createLogFilePath -Value $comment
            # 処理を中断する
            exit
        } finally {
            # 「ログファイルを作成する処理」が渉猟したことをログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【INFO】「ログファイルを作成する処理」が終了しました。'
            Add-Content -Path $createLogFilePath -Value $comment
        }
        # 変数を呼び出し元に返す
        return $createLogFilePath
    }


    # 過去のログファイルを削除する処理
    function deleteLogFile () {
        # 「過去のログファイルを削除する処理」が開始したことをログファイルに出力
        $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】「過去のログファイルを削除する処理」の開始'
        Add-Content -Path $createLogFilePath -Value $comment
        try {
            # 削除対象のログファイルをログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【INFO】削除対象ファイル：今日から' + $deletLogFilePeriod + '日以前のファイル'
            Add-Content -Path $createLogFilePath -Value $comment
            # 過去のログファイルを削除
            Get-ChildItem $createLogDirectoryPath -Recurse | Where-Object { $_.CreationTime -lt (Get-Date).AddDays(-$deletLogFilePeriod) } | Remove-Item -Force
            # 過去のログファイルの削除処理を終了した旨ログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】ファイルの削除処理終了'
            Add-Content -Path $createLogFilePath -Value $comment
        }
        # try句の中でエラーが起きたときの処理
        catch {
            # エラー内容をログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] ' + $error[0]
            Add-Content -Path $createLogFilePath -Value $comment
            # エラーによって異常終了した旨ログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】「過去のログファイルを削除する処理」の異常終了'
            Add-Content -Path $createLogFilePath -Value $comment
            # 処理を中断する
            exit
        } finally {
            #「過去のログファイルを削除する処理」が終了したことをログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】「過去のログファイルを削除する処理」の終了'
            Add-Content -Path $createLogFilePath -Value $comment
        }
    }


    # レコードを全て削除する処理
    function deleteRecord () {
        # 「レコードを全て削除する処理」が開始したことをログファイルに出力
        $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】「レコードを全て削除する処理」の開始'
        Add-Content -Path $createLogFilePath -Value $comment
        try {
            # リクエスト情報を設定
            $deleteRecordJsonData = @{
                'ApiVersion' = 1.1
                'ApiKey'     = $apiKey
                'All'        = 'TRUE'
            }
            # JSON形式に変換
            $deleteRecordConvertBody = $deleteRecordJsonData | ConvertTo-Json
            # 一括処理URLの指定
            $deleteRecordPath = $baseUri + '/fs/api/items/' + $recordId + '/bulkdelete'
            # 一括処理URLをログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【INFO】一括処理URL：' + $deleteRecordPath
            Add-Content -Path $createLogFilePath -Value $comment
            # Webページからのレスポンスを取得
            $deleteRecordData = Invoke-RestMethod -Uri $deleteRecordPath -ContentType "application/json" -Method POST -Body $deleteRecordConvertBody
            # Webページからのレスポンスをログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【INFO】レスポンス内容：' + $deleteRecordData
            Add-Content -Path $createLogFilePath -Value $comment
        }
        # try句の中でエラーが起きたときの処理
        catch {
            # スクリプトの処理でのエラー内容をログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] ' + $error[0]
            Add-Content -Path $createLogFilePath -Value $comment
            # スクリプトの実行エラーによって異常終了
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】「レコードを全て削除する処理」の異常終了'
            Add-Content -Path $createLogFilePath -Value $comment
            # 処理を中断する
            exit
        } finally {
            #「過去のログファイルを削除する処理」が終了したことをログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】「過去のログファイルを削除する処理」の終了'
            Add-Content -Path $createLogFilePath -Value $comment
        }
    }

    # Qiitaの記事を取得する処理
    function getQiita () {
        # 「Qiitaの記事を取得する処理」が開始したことをログファイルに出力
        $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】「Qiitaの記事を取得する処理」の開始'
        Add-Content -Path $createLogFilePath -Value $comment
        try {
            # 全件のQiita記事を取得して表示
            $page = 1
            $allArticles = @()
            # Qiitaの記事内容を取得する反復処理が開始したことをログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】Qiitaの記事内容を取得する反復処理が開始しました。'
            Add-Content -Path $createLogFilePath -Value $comment
            do {
                # 「Qiita APIから記事を取得する処理」の呼び出し
                # Qiitaの記事内容(Webページからのレスポンス)を設定
                $articles = Get-QiitaArticles $userName $page
                # Qiitaの記事が存在した場合の処理
                if ($articles) {
                    # Qiitaの記事情報を設定
                    $allArticles += $articles
                    # Qiitaの記事の件数をインクリメント(+1)
                    $page++
                }
            # 読み込む記事がなくなったら反復処理を抜ける
            } while ($articles.Count -gt 0)
            # Qiitaの記事内容を取得する反復処理が終了したことをログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】Qiitaの記事内容を取得する反復処理が終了しました。'
            Add-Content -Path $createLogFilePath -Value $comment
            # Qiitaの記事情報が存在した場合の処理
            if ($allArticles) {
                # Qiitaの記事情報を読み込む反復処理が開始したことをログファイルに出力
                $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】Qiitaの記事情報を読み込む反復処理が開始しました。'
                Add-Content -Path $createLogFilePath -Value $comment
                # カウンタを指定
                $count = 1
                # Qiitaの記事情報を1件ずつ読み込む
                foreach ($article in $allArticles) {
                    # 「タイトル」を設定
                    $title = $article.title
                    # 「内容」を設定(マークダウン形式になるように設定)
                    $body = '[md]' + $article.body
                    # 「分類B」を設定
                    $classB = $article.url
                    # レコード作成処理の呼び出し
                    createReord $title $body $classB $count
                    # カウンタをインクリメント
                    $count++
                }
                # Qiitaの記事情報を読み込む反復処理が終了したことをログファイルに出力
                $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】Qiitaの記事情報を読み込む反復処理が終了しました。'
                Add-Content -Path $createLogFilePath -Value $comment
            }
        }
        # try句の中でエラーが起きたときの処理
        catch {
            # スクリプトの処理でのエラー内容をログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] ' + $error[0]
            Add-Content -Path $createLogFilePath -Value $comment
            # スクリプトの実行エラーによって異常終了
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】「Qiitaの記事を取得する処理」の異常終了'
            Add-Content -Path $createLogFilePath -Value $comment
            # 処理を中断する
            exit
        } finally {
            #「Qiitaの記事を取得する処理」が終了したことをログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】「Qiitaの記事を取得する処理」の終了'
            Add-Content -Path $createLogFilePath -Value $comment
        }
    }


    # Qiita APIから記事を取得する処理
    function Get-QiitaArticles ($userName, $page) {
        # 「Qiita APIから記事を取得する処理」が開始したことをログファイルに出力
        $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】「Qiita APIから記事を取得する処理」の開始'
        Add-Content -Path $createLogFilePath -Value $comment
        try {
            # Queryを発行する
            $query = '?per_page=' + $maxPage + '&page=' + $page + '&query=user:' + $userName
            # Queryをログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【INFO】Query：' + $query
            Add-Content -Path $createLogFilePath -Value $comment
            # URLを設定する
            $url = $qiitaApiUrl + $query
            # URLをログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【INFO】URL：' + $url
            Add-Content -Path $createLogFilePath -Value $comment
            # Qiita APIへのリクエスト用ヘッダーを作成
            $headers = @{
                'Authorization' = 'Bearer ' + $accessToken
            }
            # Webページからのレスポンスを取得
            $response = Invoke-RestMethod -Uri $url -Headers $headers -Method Get
        }
        # try句の中でエラーが起きたときの処理
        catch {
            # スクリプトの処理でのエラー内容をログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] ' + $error[0]
            Add-Content -Path $createLogFilePath -Value $comment
            # スクリプトの実行エラーによって異常終了
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】「Qiita APIから記事を取得する処理」の異常終了'
            Add-Content -Path $createLogFilePath -Value $comment
            # 処理を中断する
            exit
        } finally {
            #「Qiita APIから記事を取得する処理」が終了したことをログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】「Qiita APIから記事を取得する処理」の終了'
            Add-Content -Path $createLogFilePath -Value $comment
        }
        # 変数を呼び出し元に返す
        return $response
    }


    # レコードを新規作成する処理
    function createReord ($title, $body, $URL, $count) {
        # 「レコードを新規作成する処理」が開始したことをログファイルに出力
        $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] ' + $count +'【DEBUG】「レコードを新規作成する処理」の開始'
        Add-Content -Path $createLogFilePath -Value $comment
        try {
            # リクエスト情報を設定
            $createRecordJsonData = @{
                "ApiVersion" = 1.1
                "ApiKey"     = $apiKey
                "Title"      = $title
                "Body"       = $body
                "ClassHash"  = @{
                "ClassB" = $URL
                }
            }
            # JSON形式に変換
            $createRecordConvertBody = $createRecordJsonData | ConvertTo-Json
            # プリザンターで表示時に文字化けしないようにUTF-8にエンコーディング
            $createRecordEncodedConvertBody = [System.Text.Encoding]::UTF8.GetBytes($createRecordConvertBody)
            # レコード作成URLの指定
            $createRecordPath = $baseUri + '/fs/api/items/' + $recordId + '/create'
            # レコード作成URLをログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【INFO】レコード作成URL：' + $createRecordPath
            Add-Content -Path $createLogFilePath -Value $comment
            # Webページからのレスポンスを取得
            $createRecordresponseData = Invoke-RestMethod -Uri $createRecordPath -ContentType "application/json" -Method POST -Body $createRecordEncodedConvertBody
            # レコード作成APIのレスポンスをログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【INFO】レスポンス内容' + $createRecordresponseData
            Add-Content -Path $createLogFilePath -Value $comment
        }
        # try句の中でエラーが起きたときの処理
        catch {
            # スクリプトの処理でのエラー内容をログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] ' + $error[0]
            Add-Content -Path $createLogFilePath -Value $comment
            # スクリプトの実行エラーによって異常終了
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】「レコードを新規作成する処理」の異常終了'
            Add-Content -Path $createLogFilePath -Value $comment
            # 処理を中断する
            exit
        } finally {
            #「レコードを新規作成する処理」が終了したことをログファイルに出力
            $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】' + $count +'「レコードを新規作成する処理」の終了'
            Add-Content -Path $createLogFilePath -Value $comment
        }
    }
    }).TotalMilliseconds

    # プログラムの処理速度をログファイルに出力
    $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】処理速度(ミリ秒)' + $processingSpeed
    Add-Content -Path $createLogFilePath -Value $comment
}
# try句の中でエラーが起きたときの処理
catch {
    # スクリプトの処理でのエラー内容をログファイルに出力
    $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] ' + $error[0]
    Add-Content -Path $createLogFilePath -Value $comment
    # スクリプトの実行エラーによって異常終了
    $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】「プログラムの処理速度を計測する処理」の異常終了'
    Add-Content -Path $createLogFilePath -Value $comment
    # 処理を中断する
    exit
} finally {
    # 処理が終了したことをログファイルに出力
    $comment = '[' + $(Get-Date -Uformat %Y%m%d_%H:%M:%S) + '] 【DEBUG】処理の終了'
    Add-Content -Path $createLogFilePath -Value $comment
}
```

少し手を加えていますが、「ChatGPT」を使って実装した処理は「Qiitaの記事を取得する処理」と「Qiita APIから記事を取得する処理」です。個人的にはこの処理、とくに「Qiita API」を使う箇所に関しては難しいと感じたため、「ChatGPT」が実装してくれて助かりました！「ChatGPT」さまさまです！さらに、提供された実装をそのまま使うことができました！やはり、はじめてのことは調べてもわからないことが多く、挫折するところでしたが、何とか実装が完了しました。そのほかの処理に関しては私が実装いたしました。まだ、バッチ処理として動かしたことはありませんが、想定通りの動きができているため、こちらの処理で完成なのかなと思っています。また、上記処理を実行した際のログファイルの内容を後述します。

# ログファイルの内容

```TEXT
[20230725_14:40:19] 【INFO】ログファイルが作成されました。作成ファイル：C:\Implem\個人フォルダ_その他諸々\その他\batch\logFile\getQiitaBlog\20230725144019.log
[20230725_14:40:19] 【DEBUG】スクリプトの実行開始
[20230725_14:40:19] 【INFO】「ログファイルを作成する処理」が終了しました。
[20230725_14:40:19] 【DEBUG】「過去のログファイルを削除する処理」の開始
[20230725_14:40:19] 【INFO】削除対象ファイル：今日から4日以前のファイル
[20230725_14:40:19] 【DEBUG】ファイルの削除処理終了
[20230725_14:40:19] 【DEBUG】「過去のログファイルを削除する処理」の終了
[20230725_14:40:19] 【DEBUG】「レコードを全て削除する処理」の開始
[20230725_14:40:19] 【INFO】一括処理URL：https://<サーバ名>/fs/api/items/<サイトID>/bulkdelete
[20230725_14:40:20] 【INFO】レスポンス内容：@{Id=<サイトIDが表示されます。>; StatusCode=200; LimitPerDate=1000000; LimitRemaining=999429; Message=Qiita: 49 件 一括削除しました。}
[20230725_14:40:20] 【DEBUG】「過去のログファイルを削除する処理」の終了
[20230725_14:40:20] 【DEBUG】「Qiitaの記事を取得する処理」の開始
[20230725_14:40:20] 【DEBUG】Qiitaの記事内容を取得する反復処理が開始しました。
[20230725_14:40:20] 【DEBUG】「Qiita APIから記事を取得する処理」の開始
[20230725_14:40:20] 【INFO】Query：?per_page=<$maxPageが表示されます。>&page=1&query=user:<$userNameが表示されます。>
[20230725_14:40:20] 【INFO】URL：https://qiita.com/api/v2/items?per_page=<$maxPageが表示されます。>&page=1&query=user:<$userNameが表示されます。>
[20230725_14:40:21] 【DEBUG】「Qiita APIから記事を取得する処理」の終了
[20230725_14:40:21] 【DEBUG】「Qiita APIから記事を取得する処理」の開始
[20230725_14:40:21] 【INFO】Query：?per_page=<$maxPageが表示されます。>&page=1&query=user:<$userNameが表示されます。>
[20230725_14:40:21] 【INFO】URL：https://qiita.com/api/v2/items?per_page=<$maxPageが表示されます。>&page=1&query=user:<$userNameが表示されます。>
[20230725_14:40:22] 【DEBUG】「Qiita APIから記事を取得する処理」の終了
[20230725_14:40:22] 【DEBUG】Qiitaの記事内容を取得する反復処理が終了しました。
[20230725_14:40:22] 【DEBUG】Qiitaの記事情報を読み込む反復処理が開始しました。
[20230725_14:40:22] 【DEBUG】1件数目の「レコードを新規作成する処理」の開始
[20230725_14:40:22] 【INFO】レコード作成URL：<URLが表示されます。>
[20230725_14:40:22] 【INFO】レスポンス内容@{Id=<レコードIDが表示されます。>; StatusCode=200; LimitPerDate=1000000; LimitRemaining=999428; Message=<記事のタイトルが表示されます。> を作成しました。}
[20230725_14:40:22] 【DEBUG】1件数目の「レコードを新規作成する処理」の終了
[20230725_14:40:22] 【DEBUG】2件数目の「レコードを新規作成する処理」の開始
[20230725_14:40:22] 【INFO】レコード作成URL：<URLが表示されます。>
[20230725_14:40:22] 【INFO】レスポンス内容@{Id=<レコードIDが表示されます。>; StatusCode=200; LimitPerDate=1000000; LimitRemaining=999428; Message=<記事のタイトルが表示されます。> を作成しました。}
[20230725_14:40:22] 【DEBUG】2件数目の「レコードを新規作成する処理」の終了
・
・
・
[20230725_14:40:36] 【DEBUG】Qiitaの記事情報を読み込む反復処理が終了しました。
[20230725_14:40:36] 【DEBUG】「Qiitaの記事を取得する処理」の終了
[20230725_14:40:36] 【INFO】「main処理」が終了しました。
[20230725_14:40:36] 【DEBUG】処理速度(ミリ秒)17236.4193
[20230725_14:40:36] 【DEBUG】処理の終了
```

ログファイルの内容はこのようになっています。例外チェックは実施していません。

# 実行結果(イメージ)

上記スクリプトを実行した際の編集画面のイメージを添付いたします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659914/76e5bd3c-8d7d-718d-9aad-f70a1f6ce8fd.png)  
ポイントとしては、「タイトル」に記事のタイトル、「内容」に記事の内容、「分類B」に記事のURLを登録します。登録対象のテーブルにはスクリプトを実装しており、分類Bの右横にある「リンク」ボタンをクリックすると記事に遷移します。また、スクリプトの「createReord」メソッドの引数として渡している「$body」に「[md]」を文字列結合しているので、編集画面でもマークダウン形式で表示されていますね。想定通りです！

# さいごに

今回の記事はとてもボリューミーな内容となっていますが、処理自体はとてもシンプルです。ログファイルへの出力処理がほとんどだと思います。正直ログファイルへの出力処理を別の関数にまとめようかとも思ったのですが、処理自体が2行なのでどれだったら関数にまとめて呼び出さなくても良いのではないかと個人的な判断で実装を辞めました（後、少し面倒だったから・・・)。もし、関数にまとめたほうがパフォーマンスが向上するなどアドバイスいただけますと嬉しいです。