tumblrの画像を一括ダウンロードするスクリプト

tumblrの画像を一括ダウンロードするbash向けシェルスクリプトを書いてみました。

あまり効率的ではないですが、投稿を1ページずつ取得して、含まれる画像を抜き出しています。また、ダウンロードが完了したらZIPファイルに固めてくれます。

</p>

<h1>!/usr/bin/env bash</h1>

<p>#</p>

<h1>simple picture downloader for tumblr</h1>

<p>#</p>

<h1>written by dyama (http://dyama.org/), Feb 1 2013</h1>

<p>#</p>

<h1>usage:</h1>

<h1>gettumblr http://example.tumblr.com/</h1>

<p>function gettumblr()
{
    url=$1</p>

<pre><code># fix the url
url=${url#http://} # this pattern is not regex!
url=${url%%/*}

# check the url and get tumblr user acount
if [[ $url =~ ^([a-z0-9]+)\.tumblr\.com$ ]]; then
    USER=${BASH_REMATCH[1]}
    echo OK, Target user name is $USER. &amp;gt;&amp;amp;2
else
    echo Error: $url is not tumblr URL. &amp;gt;&amp;amp;2
    return 1
fi

# working directory
wdir=&amp;quot;/tmp/gettumblr$$&amp;quot;
if [ ! -d $wdir ]; then
    mkdir $wdir
    if [ $? -ne 0 ]; then
        echo Error: Cannot make working directory at $wdir. &amp;gt;&amp;amp;2
        return 1
    fi
fi

pushd $wdir

for i in {1..999};
do
    echo Getting posted page $i ... &amp;gt;&amp;amp;2
    wget -O - -q &amp;quot;http://$url/page/$i&amp;quot; | grep -oE 'http[^&amp;quot;]+post[^&amp;quot;]+' \
        | grep $USER &amp;gt; list
    [ $? -ne 0 ] &amp;amp;&amp;amp; break;
    echo -e '\tGetting included image ...' &amp;gt;&amp;amp;2
    grep -v frame list | wget -q -i - -O - | grep 'og:image' \
        | grep -v facebook | grep -oE 'http[^&amp;quot;]+' | wget -i - -nv
done

file=$wdir/tumblr_$USER.zip
zip $file *

popd

mv $file .
rm -rf $wdir

echo Done. &amp;gt;&amp;amp;2
</code></pre>

<p>}</p>

<p>gettumblr &quot;$*&quot;
exit $?

関数 gettumblr() の冒頭部分のパターンによる変数保持値の編集や正規表現パターンマッチ構文は、bash依存です。また、grep の -o オプション(パターンに一致した行の、パターンに一致した部分だけを標準出力に印字する)も多用しています。このオプションは古めの grep にはなかったはずなので、注意が必要です。

ターゲットのtumblrユーザが存在しない場合、ファイルが削除できなかった場合など、例外処理はまったく書いていなかったり、一回で済むような処理を分けて書いていたりと、トライアンドエラーの跡が残ったままですので、もし流用する場合には適宜書き換えてください。

投稿者:

dyama

システムエンジニアです。佐世保に住んでいます。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください