Qiitaに投稿した記事を画像込みでバックアップ (Power Automate)

# はじめに
現時点のQiita側の仕様に基づき作成していますが、今後の継続的動作保証はありません。
また、別に引っ越しを助長するものではありませんので、ご注意ください。

今回は Power Automateを利用して、Qiitaに投稿した過去の自分の投稿をバックアップする方法を紹介します。
ここでバックアップと言っているのは、「記事の.mdファイルの取得＆記事中の画像ファイルの取得＆記事ごとの分類」を指しています。

また、一番最初のステップ、URL一覧の作成だけHTTPのプレミアムアクションを使っていますが、こちらは手作業でリストを作っていれば利用しなくて問題ありません。

# 準備:URL一覧作成
まずは元になるURL一覧を作成します。Qiita API v2のDocumentによれば、

```
https://qiita.com/api/v2/users/<userID>/items?per_page=xxxx
```
これでjson形式の配列として、URL・タイトル等の一覧が取れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/674752ba-02bc-dc06-dd46-cd8161f83670.png)

一覧ができたら、これをどこか、メモ帳にでもメモしておきます。

# URL一覧の記事バックアップ

## 前提

- Power Automateが利用できること
- OneDrive/OneDrive for Businessが利用できること

OneDriveはもろもろのアクションで利用していますので、今回は必須です。

## 全体とやっていること
ちょっと数式を使ったところを①～③でマークしましたので、これらを説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/76361f0b-6a46-f5b5-f7c3-75b80d67ae04.png)

### ①:記事本文の保存
OneDrive for businessのURLからファイル作成のアクションを利用しています。
ここで注意するのはリクエストURLです。本文をMarkdown形式でとるためには".md"をURLに付与する必要があります。
あとは記事ごとにフォルダを分けたいので、記事のIDでフォルダをつくってそこにMarkdownを.txtで保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/c946d615-01de-8dcc-4912-73a08b15375f.png)

ファイルの元URLは
**Source URL**

```
concat(items('Apply_to_each')?['url'],'.md')
```

ファイルの保存先は
**Destination file Path**

```
concat('/QiitaBK/',last(split(items('Apply_to_each')?['url'],'/')),'/',last(split(items('Apply_to_each')?['url'],'/')),'.txt')
```
ここわかりにくいですが、SplitしてURLから記事IDを取り出して、```/QiitaBK/bcd3f305d5abd1b11208/bcd3f305d5abd1b11208.txt```
このような文字列を作っているだけです。

### ②:記事中の画像URL一覧取得
**[2020/03/26 15:40修正]**
Markdownの中をみると、```![image.png](https://....)```や```![xxxx.gif](https://...)```のようにして画像ファイルのリンクが貼られています。これを利用して記事中の画像URL一覧を作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/1b972834-1e7d-5cd5-59e1-fc799303d60b.png)
※ @tomikiya さんからのフィードバックで、gifも含めて取得する方法に修正。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/ce1fb9a0-d2fb-8226-5f80-8d41548d09f0.png)


使うアクションは選択(Select)です。

Fromには、txtファイルの中身を取得した結果を ```https://qiita-image-store``` でSplitした結果の2番目以降を入れます。
※1番目は不要箇所なので捨てるためにskipを利用

```
skip(split(body('Get_file_content_using_path'),'https://qiita-image-store'),1)
```

Mapのところでは、またSplitしていて、

```
concat('https://qiita-image-store',split(split(item(),')')?[0],'"')?[0])
```
これでURLが一覧できます。

数式ごちゃごちゃかいてありますが、まず最初のskip(split....)で以下のような文字列の一覧が得られます。
```".s3.ap-northeast-1.amaz....)ここにあとは記事の本文が云々カンヌン"```
ここから()内の画像URLを取りたいので、後ろカッコ) でsplitして[0]をとります。画像サイズを変更するためにimgタグが使われていたりすると最後が.jpg"> となったりするので、それを考慮してもう一回splitします。

### ③:画像保存
最後の画像保存ステップでは、記事を保存したフォルダと同じ場所に画像を入れていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/73d92550-bb71-fba9-7b87-9c669b92e044.png)

画像の保存場所だけ、ごちゃごちゃと数式書いたので、残しておきます。
URLには以下の式

```
items('Apply_to_each_2')?['url']
```

保存場所には

```
concat('/QiitaBK/',last(split(items('Apply_to_each')?['url'],'/')),'/',last(split(items('Apply_to_each_2')?['url'],'/')))
```
先ほどの本文のときとほとんど同じです。

# 動かしてみた結果
無事93投稿が7分ほどでバックアップ完了しました。
残課題としては、記事の投稿日をどこかに添えておきたいんですが、それはそれで別リストにしたほうがよさそうなので、APIで取ってこようかなと思います。
以上、Power Automateを使えばQiitaの投稿バックアップもお手軽簡単という内容でした！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/bf00857e-7563-88a2-7d2f-48fc06e59e00.png)