5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PLISEAdvent Calendar 2019

Day 3

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

Last updated at Posted at 2019-12-02

ことの始まり

前々から思っていたのですが、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を作成しました。
EFywinUVAAE4PyL.jpeg

PixivAPIで取得できる情報はこれ以外にも豊富にあるので(タグとか)、いろいろできそうですね。

感想

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

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?