ことの始まり
前々から思っていたのですが、pixivにはフォロー絵師の新着イラストを一覧で見る機能がありません。なので、毎回フォロー絵師のページに訪れて新着イラストが無いか確認しなければならないのですが、私のフォロー絵師は272人と膨大な人数で、それを全員確認するとなるとかなりの時間をかけなければいけません。それが不便だなと思っていたので、今回は「その日1日にうpされたフォロー絵師の新着イラストを一覧で教えてくれるアプリ(API)」を作成しました。
注意事項
今回このアプリを作成するにおいてとても重要な役割を担っているAPIが「pixivAPI」です。なのですがこのpixivAPIは公式のものではありません。そこらへんご留意していただき、コードを引用する際は個人範囲内でのご利用をおねがいします。
あと、あんまり安定しません。
環境
・Python 3.6.1
使用するライブラリ
・pixivpy3 (pipでインストール。頻繁にバージョンアップしているので、アップグレードするように。アップグレードするときのコマンド: pip install --upgrade PixivPy)
- 実行時に「pixivpy3の中で使ってるライブラリが足りねえよ」って怒られることがあるので、その時はそれもpipでインストール
ソースコード
# 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)
実行結果
[
{
"author_id": *******,
"author_name": "***",
"image_url": "https://www.pixiv.net/artworks/*********"
},
{
"author_id": *******,
,
,
,
}
]
応用
ここで紹介したソースコードは手動で実行しなければなりませんが、私はこれをLINEBotと組み合わせてフォロー新着イラストを通知してくれるBotを作成しました。
PixivAPIで取得できる情報はこれ以外にも豊富にあるので(タグとか)、いろいろできそうですね。
感想
実は当初、私はPixivAPIを利用せずにSeleniumで泥臭くページのclass名から要素を取得してスクレイピングするつもりでいました。しかし途中で挫折しこちらのPixivAPIに切り替えたのですが、それまで私はPythonに触れたことがありませんでした。なので他のPixivAPIの記事を参考にしながら試行錯誤で完成させたのです。めっちゃ時間かかりました(2週間ぐらいかな)。完成してみると書いてる量は大したことないんですけどね、なにぶん勉強しながらだったので。いや、でも完成して実際に思い通りに動いてくれてるのを見ると爽快ですね(API呼んでるだけだけどw)。でも楽しかった。また何か作りたいな。