Power Automateから Qiita API v2 を使って記事投稿をCSVに出力する

# はじめに
つたないQiitaの投稿ですが、それなりに記事数が増えてきたので、
50回目の記事投稿のテーマとして、`Power Automateを利用したQiitaの記事一覧の取得`を
選定しました。

普段アウトプットに取り組まれている方のお力になれれば何よりです。

# 概要
今回は`Power Automate`にて、`Qiita API v2`から、記事情報の一覧を取得し、
`SharePoint`にCSVファイルとして保存します。

記事投稿の一覧を取得するうえで、[下記の記事](https://qiita.com/fkooo/items/250f42a0b641fb96b5ff)と[公式ドキュメント](https://qiita.com/api/v2/docs)を参考にしました。

### 1. [参考にさせていただいた記事](https://qiita.com/fkooo/items/250f42a0b641fb96b5ff)

https://qiita.com/fkooo/items/250f42a0b641fb96b5ff

### 2. [公式ドキュメント](https://qiita.com/api/v2/docs)

https://qiita.com/api/v2/docs

# ざっくり手順

|No|アクション|詳細
|---|---|---
|1|**作成**|CSVのファイル名用に`yyyyMMdd`で本日日付を取得
|2|**作成**|QiitaのUserIDを格納
|3|**HTTP**|`Qiita API v2`に要求を送信する
|4|**JSONの解析**|戻り値を使いやすいように設定
|5|**CSV テーブルの作成**|必要な列のみ抽出
|6|**ファイルの作成**|SharePointにCSVを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/7953b4ea-2466-b61b-3503-209462cbb1ac.png)

## 作成アクションでファイル名とUserIDを設定
今回のフローでいう`定数`や`変数`の立ち位置にくるものです。

### 何気にややこしい`yyyyMMdd`

本日日付は、`utcNow`を`convertTimeZone`したうえで、日付書式文字列に変えています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/ea9e812b-5fe5-2c63-730e-38db7d15e284.png)

```
convertTimeZone(utcNow(),'UTC','Tokyo Standard Time','yyyyMMdd')
```

### QiitaのUserID

自分の画面でいうと下記のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/4f2c243e-00b7-8764-27c9-df7f2e00e042.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/ece5ad3f-eed6-c89a-07bb-e309b3f4096d.png)

https://qiita.com/DEmodoriGatsuO

## 肝心なHTTP要求 Qiita API v2

- Qiita APIのURI

```
https://qiita.com/api/v2/users/@{ユーザーID}/items
```

こちらに、パラメーターである`page`と`per_page`を設定します。
URIに直接書くと下記のようになります。

```
https://qiita.com/api/v2/users/@{ユーザーID}/items?page=1&per_page=5
```

**個人的にPower Automateで`Queries`として別で設定できることが好みなので、画像のとおり設定しています。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/27749b1a-6a66-f6b0-7b2b-45b8f9ffd31b.png)

|Key|Value|Memo
|---|---|---
|`Method`|`GET`||
|page|1|ページ番号
|per_page|50|1ページあたりに含まれる要素数|

記事数が多い方は上記の設定にお気を付けください。
私はまだまだ少ないので、`page`は1、`per_page`の設定を、Qiitaの記事数に設定します。

## HTTPの戻り値
`Qiita API v2`を利用すると、戻り値で、ページの`タイトル`や`URL`や`いいね数`など
多くの値が取得できます。

JSONの解析では、私の例の場合、下記のスキーマを設定しております。

<details><summary>JSONの解析</summary>

```json
{
    "type": "array",
    "items": {
        "type": "object",
        "properties": {
            "rendered_body": {
                "type": "string"
            },
            "body": {
                "type": "string"
            },
            "coediting": {
                "type": "boolean"
            },
            "comments_count": {
                "type": "integer"
            },
            "created_at": {
                "type": "string"
            },
            "group": {},
            "id": {
                "type": "string"
            },
            "likes_count": {
                "type": "integer"
            },
            "private": {
                "type": "boolean"
            },
            "reactions_count": {
                "type": "integer"
            },
            "stocks_count": {
                "type": "integer"
            },
            "tags": {
                "type": "array",
                "items": {
                    "type": "object",
                    "properties": {
                        "name": {
                            "type": "string"
                        },
                        "versions": {
                            "type": "array"
                        }
                    },
                    "required": [
                        "name",
                        "versions"
                    ]
                }
            },
            "title": {
                "type": "string"
            },
            "updated_at": {
                "type": "string"
            },
            "url": {
                "type": "string"
            },
            "user": {
                "type": "object",
                "properties": {
                    "description": {
                        "type": "string"
                    },
                    "facebook_id": {
                        "type": "string"
                    },
                    "followees_count": {
                        "type": "integer"
                    },
                    "followers_count": {
                        "type": "integer"
                    },
                    "github_login_name": {
                        "type": "string"
                    },
                    "id": {
                        "type": "string"
                    },
                    "items_count": {
                        "type": "integer"
                    },
                    "linkedin_id": {
                        "type": "string"
                    },
                    "location": {
                        "type": "string"
                    },
                    "name": {
                        "type": "string"
                    },
                    "organization": {
                        "type": "string"
                    },
                    "permanent_id": {
                        "type": "integer"
                    },
                    "profile_image_url": {
                        "type": "string"
                    },
                    "team_only": {
                        "type": "boolean"
                    },
                    "twitter_screen_name": {
                        "type": "string"
                    },
                    "website_url": {
                        "type": "string"
                    }
                }
            },
            "page_views_count": {},
            "team_membership": {},
            "organization_url_name": {},
            "slide": {
                "type": "boolean"
            }
        },
        "required": [
            "rendered_body",
            "body",
            "coediting",
            "comments_count",
            "created_at",
            "group",
            "id",
            "likes_count",
            "private",
            "reactions_count",
            "stocks_count",
            "tags",
            "title",
            "updated_at",
            "url",
            "user",
            "page_views_count",
            "team_membership",
            "organization_url_name",
            "slide"
        ]
    }
}
```

</details>

:::note info
👆長いので折りたたみにしています
:::

`JSON の解析`で表示しているスキーマは、私の記事の投稿状況で、作成した例になるので、
私の例をコピペして上手くいかない場合は、一度HTTP要求を送信して、`サンプルの JSON ペイロードを入力するか、貼り付けする`ことをお勧めします。

### CSV テーブルを作成
`データ操作`アクションの一つである、`CSV テーブルを作成`を実行します。

https://learn.microsoft.com/ja-jp/power-automate/data-operations

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/c1a99fa8-0dcd-7158-f4da-8f82a63f58f0.png)

|Title|URL|CREATED|ID
|---|---|---|---
|記事のタイトル|リンク|作成日付|ID
|↓|↓|↓|↓

上記のテーブルをこちらで作成します。

## ファイルの作成

最後に`ファイルの作成`で、CSVをSharePointに出力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/4753b94e-c3e1-91a3-0096-fffdbd6053b4.png)

SharePointでなくても、`OneDrive`や`OneDrive for Business`でも同様の操作が可能です。

CSVテーブルの作成ですが、そのまま`CSVテーブルの作成`のOutputを設定してしまうと、
文字化けしてしまいます。

対策で下記の関数を`ファイル コンテンツ`に設定して、文字化け対策をします。

```
concat(decodeUriComponent('%EF%BB%BF'),body('CSV_テーブルの作成'))
```

## 実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/2b798c1e-2db4-30c1-efde-6949b9a03364.png)

# おわりに

つたないアウトプットですが、継続中です！
**良いPower Lifeを！**