QiitaにCLIで投稿や更新できるツールを作った

# 概要

Qiita に CLI で投稿/更新するクライアントツールを作りました。

Qiita は一般公開/限定公開記事問わず、よく利用しています。記事をちょっと直して、投稿し直すこともままあるのですが、いちいち Qiita のエディタから投稿するのが面倒だったので、CLI で更新できると便利なんじゃないかと思い、2, 3日で作りました。

# Qiisync

以下に置いてあります。

https://github.com/d-tsuji/qiisync

<img width="300" alt="logo.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89391/22822b06-5507-55a0-12ff-16509f02bc42.png">

# どんなことができるか

Qiisync では以下の 3 つの操作をサポートしています。

- Qiita から記事のダウンロード
- Qiita へ記事を投稿
- Qiita へ記事を更新

## 記事のダウンロード (qiisync pull)

```bash
$ qiisync pull
```

<script id="asciicast-zyIpxyuZyyeQ25pV4i1Tx7nxL" src="https://asciinema.org/a/zyIpxyuZyyeQ25pV4i1Tx7nxL.js" async></script>

Qiita の記事を設定ファイルで指定したディレクトリ配下に日付別にダウンロードできます。ローカルファイルを更新していて、Qiita の記事に比べて、ローカルのファイルが新しくなっている場合はファイルが更新されないなどの機能も備えています。

```bash
$ ./qiisync pull
     fresh remote=2020-04-14 11:26:38 +0900 JST > local=0001-01-01 00:00:00 +0000 UTC
     store /mnt/c/Users/dramt/go/src/github.com/d-tsuji/qiisync/testdata/output/pull/20200413/改行コードって難しいっ.md
     ...
     fresh remote=2019-12-05 07:01:29 +0900 JST > local=0001-01-01 00:00:00 +0000 UTC
     store /mnt/c/Users/dramt/go/src/github.com/d-tsuji/qiisync/testdata/output/pull/20191124/GoでシンプルなHTTPサーバを自作する.md
     fresh remote=2019-12-10 07:00:25 +0900 JST > local=0001-01-01 00:00:00 +0000 UTC
     store /mnt/c/Users/dramt/go/src/github.com/d-tsuji/qiisync/testdata/output/pull/20191118/GoのFormatterの書式における'+'フラグと独自実装.md
     fresh remote=2019-11-20 10:33:03 +0900 JST > local=0001-01-01 00:00:00 +0000 UTC
     ...
```

## 記事の投稿 (qiisync post)

```bash
$ qiisync post <filepath>
```

<script id="asciicast-3Fup9AHhKtfmasgGovfVWjiBb" src="https://asciinema.org/a/3Fup9AHhKtfmasgGovfVWjiBb.js" async></script>

任意のファイルパスを指定して、Qiita に記事を投稿します。とても簡単です。
投稿に成功するとメタデータが付与されたファイルが `base_dir` で指定したディレクトリ配下にダウンロードされます。以降はダウンロードされたファイルを更新し、`qiisync update` を実行することで Qiita に変更内容を反映することができます。

`qiisync post` を実行したときの実行例を記載します。投稿時に、タイトル、タグ、限定公開にするかどうかを入力します。

```
$ ./qiisync post ./testdata/qiita/post/test_article.md

Please enter the "title" of the article you want to post.
はじめてのGo

Please enter the "tag" of the article you want to post.
Tag is like "React,redux,TypeScript" or "Go" or "Python:3.7". To specify more than one, separate them with ",".
Go:1.14

Do you make the article you post private? "true" is private, "false" is public.
true
      post article ---> https://qiita.com/tutuz/items/private/1234567890abcdefghij
     store /mnt/c/Users/dramt/go/src/github.com/d-tsuji/qiisync/testdata/output/pull/20200423/はじめてのGo.md
```

## 記事の更新 (qiisync update)

```bash
$ qiisync update <filepath>
```

<script id="asciicast-1JiRSyOYGqiSbAFYGpZYa2iWq" src="https://asciinema.org/a/1JiRSyOYGqiSbAFYGpZYa2iWq.js" async></script>

ローカルにダウンロードした記事を更新して、CLI から Qiita の記事を更新できます。

```bash
$ qiisync update ./testdata/output/pull/20200423/はじめてのGo.md
      post fresh article ---> https://qiita.com/tutuz/private/1234567890abcdefghij
```

ローカルにあるファイルがリモートの記事よりも新しくない場合は、更新は行われません。ローカルファイルの更新日時と Qiita 上の記事の更新日時を比較して判定しています。

```bash
$ qiisync update ./testdata/output/pull/20200423/はじめてのGo.md
           article is not updated. remote=2020-04-23 13:34:50 +0900 JST > local=2020-04-23 13:33:10.8990083 +0900 JST
```

# 使い方

Qiisync を使うためには Qiita の API トークンが必要です。[こちら](https://qiita.com/settings/applications)から取得できます。

次に設定ファイルを書きます。ホームディレクトリ配下の `~/.config/qiisync/config` に、以下のような TOML ファイルを置いてください。

```toml
[qiita]
api_token = "1234567890abcdefghijklmnopqrstuvwxyz1234"

[local]
base_dir = "./testdata/output"
filename_mode = "title"
```

<font color="SlateGray">Windows でも一応動作するのですが、TOML ファイルに指定するディレクトリパスの `".\\testdata\\output"` というように `\` をエスケープしないといけないのがちょっと面倒です。あとは読み込むファイルの改行コードは LF しか対応していません。</font>

## インストール

各種 OS でインストールできます。詳しくは [README](https://github.com/d-tsuji/qiisync/blob/master/README.md) をご覧ください。

# おわりに

Qiita に CLI で投稿/更新するクライアントツールを作りました。Qiita のエディタを開かずとも、ローカルの使い慣れたエディタで記事を書けて、投稿できます。

開発にあたり、インターフェースなどは [blogsync](https://github.com/x-motemen/blogsync) を参考にしました。HTTP クライアントまわりのテストは [go-github](https://github.com/google/go-github) を参考にしています。

CLI から Qiita に投稿/更新したい方には便利だと思うので、使ってみて下さい！
[qiisync](https://github.com/d-tsuji/qiisync) に star もつけてくださると開発の励みになりますっ！