無題
X-Mouse Button Control と Pixivutil2、そして自作スクリプトによって日々増え続けるPixivの新着チェックを何とか乗り切る日々が続いていましたが、Pixivにログインすると見慣れないメッセージの新着が。
見てみるとなんと過剰なログインによる警告で、このまま改善が見られないようならばアカウントを削除するとのこと。
それは非常に困るので、スクリプトを変更しウェイトを入れてみましたが、再度警告を受けました。
Pixiv 運営に何とかならないかと問い合わせしてみましたが、機械的なアクセスが好ましくないという返事のみ。
これは万事休すか?

問題なのは「不要なログイン処理」

しかし返事をよく見ると、「不要なログイン処理を停止してください」という文面。
私の使っていたスクリプトが生成するバッチファイルは確かに一行ごとにログイン処理が行われるものでした。
なぜそんなことをしているかというと、Pxivutil2 で複数の画像の ID を指定してダウンロードする方法がわからなかったからです。
list.txt に画像の ID を列挙すればダウンロードできるのかと思って調べても、もっと複雑な処理を行うのに使うようで良くわからず諦めた過去があります。
しかし今回はアカウント削除の危機ですので、再度調べることにしました。

Pixivutil2 で複数の画像 ID を指定する方法

答えはちゃんと readme.txt に書いてありました。
  -s STARTACTION, --startaction=STARTACTION
                        Action you want to load your program with:
                        1 - Download by member_id
                            (required: followed by member_ids separated by space)
                        2 - Download by image_id
                            (required: followed by image_ids separated by space)
ずっと私はこれを『「image_id」は2の後にスペースを入れて指定してください。』だと勘違いしていたのですが、「image_ids」と書いてあるので、『複数の画像 ID を指定する場合はスペースを入れて繋げてください』だったんですね。
英語ができない弊害ですね。(自動翻訳では微妙にわかり辛いことになってました)
つまり、ダウンロードしたい画像の ID が xxx と yyy と zzz だった場合、
python C:\Python27\PixivUtil2\pixivutil2.py -s 2 xxx yyy zzz
とすれば連続してダウンロードしてくれるんですね。
連続してダウンロードすることでまた警告を受ける可能性もありますが、今回警告を受けたのは「連続ログイン」であると解釈してしばらくこれで様子見します。

PixivイラストページのURLをコピーするとスペースで繋げた画像 ID を書き出すスクリプト

以前公開したスクリプトを改造し、画像 ID を連結して書き出すスクリプトを以下に記します。
このスクリプト単体では動かないので、過去の記事を参照してください。
例外処理をしているはずなんですが、たまに例外吐いて落ちるので PowerShell 叩いて実行するのが再実行が簡単なので良いと思います。
結果のlist.txtの中身を Pxivutil2 を実行し、コマンド 2 の後にコピペして貼り付けて実行すればダウンロードが始まりますが、指定できるID の数は 455 辺りが限度のようで、そこでダウンロードが終わってしまうので分割して実行してください。
# -*- coding: utf-8 -*-
import win32api
import win32com.client
import win32clipboard as CB

win32api.Sleep(500)
shell = win32com.client.Dispatch("WScript.Shell")

url = "https://www.pixiv.net/member_illust.php?mode=medium&illust_id="
output = 'C:\temp\list.txt'

print "Start Clipbord check"

CB.OpenClipboard()
text1 = CB.GetClipboardData(1) #1 -> CF_TEXT
CB.CloseClipboard()

count = 1

while 1:
  win32api.Sleep(200)
  CB.OpenClipboard()
  text2 = CB.GetClipboardData(1) #1 -> CF_TEXT
  CB.CloseClipboard()
  if text1 != text2:
    text1 = text2.replace( url,'' )
    if text1 != text2:
      text = '%s ' % text1
      while 1:
        try:
          with open ( output, 'a' ) as f:
            try:
              f.write ( text )
              break
            except IOError as e:
              print ('except: Cannot write')
        except IOError as e:
          print ('except: Cannot open')
        win32api.Sleep(200)
      print("\007")
      text = '{0} : {1}'.format( count, text1 )
      print text
      count+=1
    text1 = text2
これで警告を受けないことを祈ります。 今度こそ良い Pixiv 巡回ライフを!