node.jsのpixivクライアント

pixivのAPIが変わった。 で、解析してる人がいて、pythonのライブラリを公開している。

Sniffer for iOS 6.x Common API · upbit/pixivpy Wiki

APIの出来は前のAPIが最悪だったのを考えると、異常によくなった。 ただ、残念なことにr-18フラグがなくなった。 これはまじで残念だ。 アカウントでr-18を許可してても気分によってr-18画像見たくないことも多分にあるのに。

で、node.js用にAPIクライアントを書いた。 pythonとライブラリと同じことができる。

akameco/pixiv-app-api: Promise base pixiv API client

インストール

$ npm install --save pixiv-app-api

pixiv-imgとセットで使うと20行ぐらいでダウンローダーが書ける。

const PixivAppApi = require('pixiv-app-api');
const pixivImg = require('pixiv-img');
const pixiv = new PixivAppApi('your username', 'your password');

const word = '艦これ10000users入り';

pixiv.searchIllust(word)
    .then(json => {
        console.log(json);
        return pixiv.next();
    })
    .then(json => {
        console.log(`downloading ${json.illusts[0].title}`);
        return pixivImg(json.illusts[0].image_urls.large);
    }).then(() => {
        console.log('finish');
    });

使えるクエリとか、できることはreadmeに書いたのみ見てほしい。

akameco/pixiv-app-api: Promise base pixiv API client

面白いのはnext_urlパラメータで、次のリクエストのurlが入っている。 pixiv-app-apiでは、next()で次のAPIが叩ける。

あと、おそらくAPIのバグなんだけど、次のURL情報が入っていてもoffsetというパラメータが5000を超えるとエラーが変える。 このエラーが400で返ってきて他のエラーと区別がつかなくてやっかい。 サーバサイドでnext_urlパラメータを渡さないようにすればいいと思うのだけど。

pixivダウンローダ

で、APIライブラリ書いたのでダウンローダーを書いた。

akameco/pixiv-dl: pixiv image downloader

タグ検索もしくはランキング情報から画像をダウンロードする。

最近CUIの描画にはまってるのでオシャンティな感じにした。 残り時間やダウンロードしてるイラスト情報を表示する。

画像のファイル名をユーザ名-タイトルとかにリネームする機能付き。 デフォルトはイラストID。

名前とパスワードは最初の一回でキャッシュされるの、2回目からは必要ない。 リクエスト間隔は5秒にしてある。 が、サブ垢つくってやるのが吉。

$ npm install -g pixiv-dl

f:id:akameco:20160824053939g:plain

$ pixiv-dl --help


  pixiv image downloader

  Usage
    $ pixiv-dl [input]

  Options
    --uername, -u   pixiv username (use cache)↲
    --password, -p  pixiv password (use cache)↲
    --output, -o    output directory [Default: curret dir]
    --name, -n      custom filename
    ranking         ranking mode
      day | week | month | day_male | day_female | week_original | week_rookie | day_mang
      day_r18 | day_male_r18 | day_female_r18 | week_r18 | week_r18g

  Examples
    $ pixiv-dl リゼロ10000users入り --username hoge --password fuga
    $ pixiv-dl リゼロ10000users入り --output rezero --name user.account-title
    $ pixiv-dl ranking day --output rezero --name user.account-title

ダウンローダープレビュー

どんな画像が保存されたかをリアルタイムでみたいので、ダウンロードのプレビューライブラリ書いた。 まあこれはディレクトリ監視して新しい画像を表示させてるだけで、すごい雑。

基本は上記のpixiv-dlと同じ。プレビューだけがついてる。

akameco/pixiv-dl-preview: pixivイラストダウンローダー + 画像プレビュー

$ npm install -g pixiv-dl-preview

f:id:akameco:20160824055538g:plain

アカウントBAN

今はリクエスト間隔を変えてBANされなくなったけど、一度BANされた。

f:id:akameco:20160824055018p:plain

BANされたアカウントと同じアカウントでつくってほぼ復元できたので、論理削除じゃないっぽい。

余談だけど、全画像ダウンロードして、完全なpixivのコピーをつくるなら pixivのオリジナルサイズの画像は認証してなくてもとれるので、 APIを使わずにillust_idをひとつずつ増やしてダウンロードすればいい。 ログインしてなくてもいいので、適当に串をさしてしまえばアカウントBANとかipのアクセス制限とか何も考えずにすべてを画像をもってこれる。 僕はしてないしする気もないけど。