概要
最近になって twitpic が終わったり終わらなかったりな状況で
今後どうなるかもわからないし、昔あげていた画像を救出するのにシェル芸でやってみた話。
結果
とりあえず、結果からのせると以下のような感じ。
(追記) png
を考慮するの漏れてたので修正しました。(追記おわり)
% cd /path/to/put_dir
% TWITPIC_URL="http://twitpic.com/photos/laugh_k"
% seq 1 $( curl -s ${TWITPIC_URL} | perl -nle 'if(/<a href="\?page=([0-9]+)">Last<\/a>/){ print $1, "\n" }' ) | while read page ; do curl -s "${TWITPIC_URL}?page=${page}" | grep '<a href="/' | tail -n +8 | head -20 | perl -nle 'if(/\/[^"]+/){ print "http://twitpic.com/$&" }' ; done | while read img_page ; do curl -sL "${img_page}" | perl -nle 'if(/<img src="(https:\/\/[^.^"]+\.cloudfront.net\/photos\/large\/[^"]+)"/){ print $1 }' ; done | while read img_url ; do img_name=$( echo "${img_url}" | grep -o -E '[^/]+\.(jpe?g|png|gif)' ) ; wget -O ${file} "${img_url}" ; done
流石にこれだとわかりづらいんでちょっと形成すると以下のような感じ
% TWITPIC_URL="http://twitpic.com/photos/laugh_k"
### さすがに長ったらしいので、最後のページ情報取得は一旦分ける
% LAST=$( curl -s ${TWITPIC_URL} | perl -nle 'if( /<a href="\?page=([0-9]+)">Last<\/a>/ ){ print $1, "\n" }' )
% seq 1 ${LAST} | while read page
> do
> curl -sL "${TWITPIC_URL}?page=${page}" |
> grep '<a href="/' |
> tail -n +8 |
> head -n 20 |
> perl -nle 'if(/\/[^"]+/){ print "http://twitpic.com/$&" }'
> done |
> while read img_page
> do
> curl -sL ${img_page} |
> perl -nle 'if(/<img src="(https:\/\/[^.^"]+\.cloudfront.net\/photos\/large\/[^"]+)"/){ print $1 }'
> done |
> while read img_url
> do
> img_name=$( echo "${img_url}" | grep -o -E '[^/]+\.(jpe?g|png)' )
> wget -O ${img_name} "${img_url}"
> done
気にした点
-
ページャーになってるんで最後のページ情報どうするか
=> ユーザーページトップにLASTのリンクがあったのでそこからひっぱった
-
各画像のページのURLをどうやってピンポイントで出すか
=> レイアウト的にどのリンクが引っかかるかわかったんで、
head
,tail
でゴリ押し -
最終的にCloudfrontのリンクが取れるが、まんまwgetするとファイル名が大変なことになるので、その辺よしなに保存したい
=>
sed
使っても良かったけどパターン的に抽出のほうが楽そうだったのでgrep -o -E
でファイル名を直接引っこ抜き
最後に
わざわざ画像取得するのにWindows起動するのも面倒だなとなって「よろしいならばシェル芸だ」とやってみたら意外にすんなり行けた。
糞長いし、ゴリ押し感半端無いし、もっとよさ気な方法あるかもだけど問題が解決できたのでよしとする。
Twitpicからの画像データ救出、他の言語の練習題材としてもよさ気な感じですね。