有馬総一郎のブログ

(彼氏の事情)

アメブロ(ameblo.jp)の画像をバックアップする(引っ込抜く)

で、まずはameblo.jpからの引っ越し方法。

htmlごと引っこ抜くのは割かしすぐできたけど(アメブロからの引越しは思ったより困難だった… Part.1(続くか未定))、htmlから画像、MT(Movable Type)形式の作成で難儀した。

画像についてはほぼほぼ諦めかけていたのだけど、このような神ブログ記事を発見できた。

アメブロ記事内の縮小画像ではなく元画像(縮小前)のURLを知る方法 - 自由ネコ

これを参考に作成

htmlToMarkdown.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# バックアップしたhtmlを格納したフォルダに移動
cd "C:\Users\system76\Documents\arimasou16"
# やりなおした時のために配下のimagesフォルダ削除
if (Test-Path .\images) {
    Remove-Item .\images -Recurse -Force
}
# バックアップimagesフォルダ作成
New-Item ".\images" -itemType Directory -Force
$files = Get-ChildItem -File *.html
$index = 0
foreach($file in $files) {
    # 記事の日付を取得
    $date = (Get-Content -Encoding UTF8 $file).foreach{ if ($_ -match "(?<=pubdate=`"pubdate`">)(\d{4})-(\d{2})-(\d{2}) (\d{2}:\d{2})(:\d{2})(?=<\/time><\/span>)") { $matches[1] + "-" + $matches[2] + "-" + $matches[3] + " " + $matches[4] }}
    $year = $date.Substring(0, 4)
    if (!(Test-Path .\images\$year)) {
        New-Item ".\images\$year" -itemType Directory -Force
    }
    $regex = [regex]("(?<=src=`")(http://stat.ameba.jp/user_images/\d{8}/\d{2}/\w+/\w{2}/\w{2}/\w/)(\w{9}_)(\w{19}\.(jpg|png|gif))(?!.*class=`"articleImage`")")
    # オリジナル画像のurlを作成
    $urls = (Get-Content -Encoding UTF8 $file).foreach{ $regex.Matches($_) | ForEach { $_.Groups[1].Value + "o" + $_.Groups[3].Value }}
    foreach($url in $urls) {
        $imagefilename = $date.Substring(0, 10) + "-" + (++$index).toString("00000") + $url.Substring($url.Length -4, 4)
        # オリジナル画像を取得
        Invoke-WebRequest -Uri $url -OutFile .\images\$year\$imagefilename
    }
    $regex = [regex]("(?<=src=`")(http://stat.ameba.jp/user_images/\d{8}/\d{2}/\w+/\w{2}/\w{2}/\w/o\w{19}\.(jpg|png|gif))")
    # 縮小されていない画像のurlを作成
    $urls = (Get-Content -Encoding UTF8 $file).foreach{ $regex.Matches($_) | ForEach { $_.Groups[1].Value }}
    foreach($url in $urls) {
        $imagefilename = $date.Substring(0, 10) + "-" + (++$index).toString("00000") + $url.Substring($url.Length -4, 4)
        # オリジナル画像を取得
        Invoke-WebRequest -Uri $url -OutFile .\images\$year\$imagefilename
    }
}

コメントにもあるとおり、アメブロからの引越しは思ったより困難だった… Part.1(続くか未定)で取得したhtmlを元に画像ファイルを取得してくるので、まずはそれから。

自分が移行がしやすいように、画像はの年フォルダ毎に、1からの5桁のゼロ埋め連番にファイル名に変更して取得している。

(?!.*class=`"articleImage`")

と否定的先読みしているのは、htmlから縮小画像のオリジナルを全部取ろうとすると、 最近の画像つき記事に掲載している画像まで取ってきてダブりが生じるから。それから、画像埋め込みの設定によっては縮小せずに掲載しているパターンも考慮している。

もし、他の方が上記PowerShellスクリプトを使われるのであれば、直すところは、cd "C:\Users\arimasou16\Documents\html"のhtmlを格納したフォルダパスだけかと。


追記: 2017-01-18
一行に取得する画像が複数あると一つ目の画像しか取得できないバグがあったので修正

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
--- getImageFromAmbeba.ps1  2017-01-11 02:11:03.177589230 +0900
+++ getImageFromAmbeba.ps2  2017-01-18 02:27:08.925205734 +0900
@@ -15,15 +15,17 @@
   if (!(Test-Path .\images\$year)) {
       New-Item ".\images\$year" -itemType Directory -Force
   }
+    $regex = [regex]("(?<=src=`")(http://stat.ameba.jp/user_images/\d{8}/\d{2}/\w+/\w{2}/\w{2}/\w/)(\w{9}_)(\w{19}\.(jpg|png|gif))(?!.*class=`"articleImage`")")
   # オリジナル画像のurlを作成
-    $urls = (Get-Content -Encoding UTF8 $file).foreach{ if ($_ -match "(?<=src=`")(http://stat.ameba.jp/user_images/\d{8}/\d{2}/\w+/\w{2}/\w{2}/\w/)(\w{9}_)(\w{19}\.(jpg|png|gif))(?!.*class=`"articleImage`")") { $matches[1] + "o" + $matches[3] }}
+    $urls = (Get-Content -Encoding UTF8 $file).foreach{ $regex.Matches($_) | ForEach { $_.Groups[1].Value + "o" + $_.Groups[3].Value }}
   foreach($url in $urls) {
       $imagefilename = $date.Substring(0, 10) + "-" + (++$index).toString("00000") + $url.Substring($url.Length -4, 4)
       # オリジナル画像を取得
       Invoke-WebRequest -Uri $url -OutFile .\images\$year\$imagefilename
   }
+    $regex = [regex]("(?<=src=`")(http://stat.ameba.jp/user_images/\d{8}/\d{2}/\w+/\w{2}/\w{2}/\w/o\w{19}\.(jpg|png|gif))")
   # 縮小されていない画像のurlを作成
-    $urls = (Get-Content -Encoding UTF8 $file).foreach{ if ($_ -match "(?<=src=`")(http://stat.ameba.jp/user_images/\d{8}/\d{2}/\w+/\w{2}/\w{2}/\w/o\w{19}\.(jpg|png|gif))") { $matches[1] }}
+    $urls = (Get-Content -Encoding UTF8 $file).foreach{ $regex.Matches($_) | ForEach { $_.Groups[1].Value }}
   foreach($url in $urls) {
       $imagefilename = $date.Substring(0, 10) + "-" + (++$index).toString("00000") + $url.Substring($url.Length -4, 4)
       # オリジナル画像を取得

追記ここまで

Comments