Node.js 自分のブログのはてなフォトライフなどの画像を一括ダウンロードする方法

こんにちは。レモンティーです。

今回は過去にはてなブログに貼った画像を一括ダウンロードする方法です。
普通に「写真を投稿」で張り付けていれば画像は全てはてなフォトライフにあるので今回の方法で手直しなくいけると思います。

準備

まずは自分のブログのデータをエクスポートします。
続いて適当なフォルダをつくります。ここではblogpicとします。その中にdataフォルダをつくり、先ほどエクスポートしたファイルをdata.txtと改名して入れます。
ダウンロードした写真用にimagesフォルダをつくります。
こんな感じです。あとはindex.jsにnode.jsで実行するコードを書きます。(Node.js入門)

blogpic
    index.js
    images
    data
        data.txt

コード

index.js

const fs = require('fs');
const request = require('request');

(async () => {
    const data = fs.readFileSync("data/data.txt","utf-8");
    const urls = data.match(/<img.*?src="https.*?.png".*?>/g);
    let num = 0;
    for(const url of urls){
        const link = url.match(/src="(.*?)"/)[1];
        const filename = link.split("/").slice(-1)[0];
        try{
            const body = await requestAsync({url:link,encoding:null,timeout:9000});
            num += 1;
            fs.writeFileSync("images/"+filename,body);
            console.log(`${num} save : ${link}`);
        }catch(err){
            console.log(`skip : ${link} because : ${err}`);
        }
        await waitTime(300);
    }
})();

async function requestAsync(options){
    return new Promise((resolve,reject) => {
        request(options, (err,res,body) => {
            if(err)reject(err);
            resolve(body);
        });
    });
}

async function waitTime(time){
    return new Promise((resolve,reject) => {
        setTimeout(() => {
            resolve();
        }, time);
    });
}

出力

こんな感じでずらーっとでます。終わったらimagesフォルダ内に保存されています。

1 save : https://cdn-ak.f.st-hatena.com/images/fotolife/s/sawalemontea/20190528/20190528183137.png
2 save : https://cdn-ak.f.st-hatena.com/images/fotolife/s/sawalemontea/20190528/20190528183502.png
3 save : https://cdn-ak.f.st-hatena.com/images/fotolife/s/sawalemontea/20190528/20190528183752.png
4 save : https://cdn-ak.f.st-hatena.com/images/fotolife/s/sawalemontea/20190528/20190528184052.png
...
431 save : https://cdn-ak.f.st-hatena.com/images/fotolife/s/sawalemontea/20170723/20170723230835.png

おしまい

今回はこれでおしまいです。
www.sawalemontea.com