書いた記事を見てもらうためにQiitaの自動投稿をする

## はじめに

せっかく記事を書いたのだから自分のモチベーションのためにも、できればたくさんの人に見てほしいし、強欲なのでいいねも欲しい!!!
けれどもタイトルのセンスや需要、内容の面白さには自信がないので、小手先でなんとかしようと思いました。
とりあえず見てくれる人を増やすために

* 固定で見てくれる人(フォロワー)を増やす
* 人がたくさん見てる時間に投稿して人目に触れる機会を増やす
ここらへんの対策をします。

フォロワーを増やすには、定期的に同じような話題を投稿するのがいいそうです。
私はやりたいことがコロコロ変わるので同じような話題は難しいですが、定期的に投稿するのはめちゃくちゃ頑張ればできなくもなさそうなので、ストックためて、ストックから投稿するようにします。
人がたくさん見てくれる時間は[Qiitaの全記事分析｜バズる投稿を考察する](https://qiita.com/mtitg/items/25e3d0d75429dcfeb199)によると月曜朝7~8時がいいそうです。
しかしこれは多分月曜ではなく週の最初の営業日だと思うので、週の最初の営業日に投稿してくれるようにします。


つまり作る機能は

* ストックしている記事を
* 週の最初の営業日に投稿してくれる

この記事もこれで作ったプログラムで投稿しています。
なのでこの記事を読んでいるということはうまく自動で投稿できたのでしょう。


## 使うもの
Python
[Qiita API](https://qiita.com/api/v2/docs)

## 前準備
QiitaのToken取得してください

## 方針
投稿内容などはjsonファイルに書いておきます。
動かす時間は毎日朝8時にクーロンで起動します

1. 今日が週の一番最初の営業日であるか判定する
    1. 週の一番最初の営業日でなかったら終わる
1. ディレクトリからjsonファイルを選んできて読む
1. QiitaにPOSTする
1. POSTできたら投稿した記事をバックアップディレクトリに移動する

## 実装


``` Python
import jpbizday
import datetime
import json
import glob
import requests
import shutil


FILE_PATH = "./"
BK_FILE_PATH = FILE_PATH+"bk"
URL = "https://qiita.com/api/v2/items"


def main():
    d_today = datetime.date.today()
    result = check_business_day_start_week(d_today)
    if not result:
        return
    # 記事取得
    file_list = sorted(glob.glob(FILE_PATH+"*.json"))
    if len(file_list) == 0:
        return
    file = file_list[0]
    contents = load_file(d_today, file)
    if len(contents[0]) < 1 or len(contents[1]) < 1 or len(contents[2]) < 1:
        return
    item = {"title": contents[0],
                        "body": contents[1],
            "private": True,
            "tags": contents[2],
            "gist": False, "tweet": False
            }
                                # 投げる
    res = post(item)
    http_status = res.status_code
    # 記事の移動
    if http_status == 201:
                                    shutil.move(file, BK_FILE_PATH)


# 週初めの営業日か判定する Trueの時週初めの営業日
# 月:0,火:1,水:2,木:3,金:4,土:5,日:6
def check_business_day_start_week(d_today):
    week = d_today.weekday()
    if week == 5 or week == 6:
        return False
    for num in range(week, -1, -1):
        check_date = d_today - datetime.timedelta(days=num)
        is_biz_day = jpbizday.is_bizday(check_date)
        if is_biz_day:
            if check_date == d_today:
                return True
            else:
                # 今日よりも前に営業日がある場合
                return False
    return False

# ファイル読む
def load_file(d_today, file):
    json_open = open(file, 'r',  encoding="utf-8")
    json_load = json.load(json_open)
    json_open.close()
    title = str(d_today.year)+"-"+str(d_today.month)+"-"+str(d_today.day)
    body = ""
    tags = []
    if "title" in json_load:
        if json_load["title"] != None:
            title = json_load["title"]
    if "body" in json_load:
        if json_load["body"] != None:
            body = json_load["body"]
    if "tags" in json_load:
        if json_load["tags"] != None:
            tags = json_load["tags"]
    return title, body, tags

# ポストする
def post(item):
    token = '発行したQiitaのトークン'
    headers = {'Authorization': 'Bearer {}'.format(token)}
    res = requests.post(URL, headers=headers, json=item)

    return res


if __name__ == "__main__":
    main()

```

* jsonファイル例

``` json
{
    "title": "てすと",
    "body": "# テスト投稿 
 * 今日もネコはかわいい",
    "tags": [
        {
            "name": "Python"
        },
        {
            "name": "QiitaAPI"
        },
        {
            "name": "Qiita"
        }
    ]
}
```

## ねこ
tagsですが
`[{"name":"Ruby", "versions":["0.0.1"]}]`
公式の例には上記のように指定するよう書いてました。
versionsとは…？という感じですが、この場合普通に`Ruby`のタグがつきます。
`[{"name":"Ruby"}]`　これでも投稿してみましたが、これも`Ruby`のタグが付いて、上記との違いはありませんでした。
なので読み込むjsonファイルもnameだけ指定してます。
知ってる人いたら教えてください。

## 感想
QiitaAPIでは画像の投稿ができないです。
自分でどこかに画像置いてリンク貼る必要があるのでこのままだとちょっと使いづらいです。
余裕があったらエディタかなにか作りたい…