[Python] PixivAPIを利用した半自動フォロー新着イラスト通知アプリ

# ことの始まり
前々から思っていたのですが、pixivにはフォロー絵師の新着イラストを一覧で見る機能がありません。なので、毎回フォロー絵師のページに訪れて新着イラストが無いか確認しなければならないのですが、私のフォロー絵師は272人と膨大な人数で、それを全員確認するとなるとかなりの時間をかけなければいけません。それが不便だなと思っていたので、今回は「その日1日にうpされたフォロー絵師の新着イラストを一覧で教えてくれるアプリ(API)」を作成しました。

# 注意事項
今回このアプリを作成するにおいてとても重要な役割を担っているAPIが「pixivAPI」です。なのですがこのpixivAPIは公式のものではありません。そこらへんご留意していただき、コードを引用する際は個人範囲内でのご利用をおねがいします。
あと、あんまり安定しません。

# 環境
・Python 3.6.1

# 使用するライブラリ
・pixivpy3 (pipでインストール。頻繁にバージョンアップしているので、アップグレードするように。アップグレードするときのコマンド: pip install --upgrade PixivPy)
* 実行時に「pixivpy3の中で使ってるライブラリが足りねえよ」って怒られることがあるので、その時はそれもpipでインストール

# ソースコード
```pixiv.py
# coding: cp932

import datetime

from pixivpy3 import *
import json
from time import sleep
import os
from collections import OrderedDict

try:
    # 垢情報。user_idは自分のホーム画面のURLから取得できます
    my_id = '*******'
    my_password = '**********'
    my_user_id = 0000000000

    api = PixivAPI()
    api.login(my_id, my_password)
    aapi = AppPixivAPI()
    aapi.login(my_id, my_password)

    my_follow_artist_ids = []
    json_list = []

    str_date = str(datetime.date.today() - datetime.timedelta(days=1))

    # 自分の垢情報
    self_info = aapi.user_detail(user_id=my_user_id)
    following_users_num = self_info.profile.total_follow_users

    # offsetの最大値が30なので処理
    for i in range(0, int((following_users_num-1)/30)+1):
        off = aapi.user_following(user_id=my_user_id, offset=i * 30).user_previews
        for j in range(0, len(off)):
            my_follow_artist_ids.append(off[j].user.id)

    # 絵師ごと
    for artist_id in my_follow_artist_ids:
        works = api.users_works(artist_id)
        if len(works.response) == 0:
            continue

        # 作品ごと
        for work in range(0, len(works)):
            image = works.response[work]
            if image.created_time[0:10] == str_date:

                image_url = str(image.image_urls.large)
                total_page_count = image.page_count
                for sequence in range(0, total_page_count):
                    image_url = image_url.replace("_p" + str(sequence), "_p" + str(sequence + 1))

                json_list.append(OrderedDict(author_id=image.user.id, author_name=image.user.name, image_url="https://www.pixiv.net/artworks/" + str(image.id)))
                sleep(1)
            else:
                break

    file = open('./' + str_date + '.json', 'w', encoding='utf-8')
    file.write(json.dumps(json_list, indent=2, ensure_ascii=False))
    file.close()

    print('\n終了')

except Exception as e:
    print(e.args)
```

# 実行結果
```2019-12-03.json
[
  {
    "author_id": *******,
    "author_name": "***",
    "image_url": "https://www.pixiv.net/artworks/*********"
  },
  {
    "author_id": *******,
         ,
         ,
         ,
  }
]
```
# 応用
ここで紹介したソースコードは手動で実行しなければなりませんが、私はこれをLINEBotと組み合わせてフォロー新着イラストを通知してくれるBotを作成しました。
<img width="400" alt="EFywinUVAAE4PyL.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351239/8b40421e-a96e-7e75-8dfa-a587fb700224.jpeg">

PixivAPIで取得できる情報はこれ以外にも豊富にあるので(タグとか)、いろいろできそうですね。
# 感想
実は当初、私はPixivAPIを利用せずにSeleniumで泥臭くページのclass名から要素を取得してスクレイピングするつもりでいました。しかし途中で挫折しこちらのPixivAPIに切り替えたのですが、それまで私はPythonに触れたことがありませんでした。なので他のPixivAPIの記事を参考にしながら試行錯誤で完成させたのです。めっちゃ時間かかりました(2週間ぐらいかな)。完成してみると書いてる量は大したことないんですけどね、なにぶん勉強しながらだったので。いや、でも完成して実際に思い通りに動いてくれてるのを見ると爽快ですね(API呼んでるだけだけどw)。でも楽しかった。また何か作りたいな。