Archive

TwitPicに上げてる画像をシェル芸で救出してみた

概要

最近になって 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からの画像データ救出、他の言語の練習題材としてもよさ気な感じですね。