ファンティア(Fantia)からファンクラブに投稿された画像を一括ダウンロードするスクリプトを書いた

知人から、ファンティアのファンクラブの投稿画像を一括でダウンロードしたいと言われた。

ちょっと見てみると、どうも投稿されたページから一括でファイルをダウンロードできず、また投稿ページの画像をクリックして「オリジナルサイズを表示」リンクをクリックしないと、原寸大画像がダウンロードできない模様。

確かに面倒なので、ダウンローダーがないかと調べてみたが、なさそうだったのでPythonで書いてみた。

github.com

ダウンロードはこちら。

使い方はREADME参照。

工夫したところ

「オリジナルサイズを表示」したときの画像ファイル名がUUIDになっていたため、画像ファイルURLから連番を取得して連番で保存するようにした。

これでダウンロードした画像ファイルを、投稿順で閲覧できる。

ただ、どうも投稿内でセクション? が分かれている場合、下のセクションのほうから画像ファイルURLの番号が振られる模様。

単純に投稿ページ内で連番を振るようにしたほうがよかったかも。

残念なところ

Python書きなれていないのと、知人のOKが出た段階で完成としてしまったので、いろいろと残念。

  • コメントやREADMEなど、もろもろ日本語
    • せめてREADMEくらいはなんちゃって英語にしたい
  • スクリプト分割など一切なし
    • setup.py 書いて階層切っておきたい
  • ユニットテストなし。Pythonのテストの書きかたよくわかってない
  • セッションIDをiniファイルに保存しているのは、セキュリティ的にどうなんだ
    • コマンドライン引数にしようとも思ったが、複数回実行を効率化するために目をつぶった
  • 画像ファイル以外、音声ファイルや動画ファイルには未対応、というか未確認
  • 途中でエラーが出た場合の再実行、ページ指定、投稿指定、画像ダウンロード済みの場合のスキップなど未実装
    • 最初にページや投稿を確認し、結果をファイル出力して、そこから画像ダウンロードするようにすればよかった
    • 1ページ目の先頭から実行されるので、途中で止めてしまえばいいといえばいい
  • 投稿のトップ絵をダウンロードしていない
  • 免責事項の書き方

懸念点

現時点でのファンティア利用規約には違反していないと思うが、実際のところどうだろう。

スクリプト内で参照するURLは、すべて公開情報のため、リバースエンジニアリングにはあたらないと思うが...

振り返り

書き終わった後に調べてみたら、同じようなことをPHPでしている人がいらっしゃった...

github.com

プロセス的には、セッションIDやファンクラブIDをコマンドライン引数で取っていて、ほとんど同じ感じ。

試していないけど、こちらのほうが --downloadExisting という、やりたかった true/false で再ダウンロードする/しないを調整できそう。

もうちょいきちんと調べればよかった...