知人から、ファンティアのファンクラブの投稿画像を一括でダウンロードしたいと言われた。
ちょっと見てみると、どうも投稿されたページから一括でファイルをダウンロードできず、また投稿ページの画像をクリックして「オリジナルサイズを表示」リンクをクリックしないと、原寸大画像がダウンロードできない模様。
確かに面倒なので、ダウンローダーがないかと調べてみたが、なさそうだったのでPythonで書いてみた。
使い方はREADME参照。
工夫したところ
「オリジナルサイズを表示」したときの画像ファイル名がUUIDになっていたため、画像ファイルURLから連番を取得して連番で保存するようにした。
これでダウンロードした画像ファイルを、投稿順で閲覧できる。
ただ、どうも投稿内でセクション? が分かれている場合、下のセクションのほうから画像ファイルURLの番号が振られる模様。
単純に投稿ページ内で連番を振るようにしたほうがよかったかも。
残念なところ
Python書きなれていないのと、知人のOKが出た段階で完成としてしまったので、いろいろと残念。
- コメントやREADMEなど、もろもろ日本語
- せめてREADMEくらいはなんちゃって英語にしたい
- スクリプト分割など一切なし
setup.py
書いて階層切っておきたい
- ユニットテストなし。Pythonのテストの書きかたよくわかってない
- セッションIDをiniファイルに保存しているのは、セキュリティ的にどうなんだ
- コマンドライン引数にしようとも思ったが、複数回実行を効率化するために目をつぶった
- 画像ファイル以外、音声ファイルや動画ファイルには未対応、というか未確認
- 途中でエラーが出た場合の再実行、ページ指定、投稿指定、画像ダウンロード済みの場合のスキップなど未実装
- 最初にページや投稿を確認し、結果をファイル出力して、そこから画像ダウンロードするようにすればよかった
- 1ページ目の先頭から実行されるので、途中で止めてしまえばいいといえばいい
- 投稿のトップ絵をダウンロードしていない
- 免責事項の書き方
懸念点
現時点でのファンティア利用規約には違反していないと思うが、実際のところどうだろう。
スクリプト内で参照するURLは、すべて公開情報のため、リバースエンジニアリングにはあたらないと思うが...
振り返り
書き終わった後に調べてみたら、同じようなことをPHPでしている人がいらっしゃった...
プロセス的には、セッションIDやファンクラブIDをコマンドライン引数で取っていて、ほとんど同じ感じ。
試していないけど、こちらのほうが --downloadExisting
という、やりたかった true/false
で再ダウンロードする/しないを調整できそう。
もうちょいきちんと調べればよかった...