有馬総一郎のブログ

(彼氏の事情)

2016年09月22日 00:23:00 JST - 3 minute read - PowerShell

アメブロからの引越しは思ったより困難だった… Part.1(続くか未定)

amebloから他のサイトへの引越し方法を探ってみると、

ブログのお引越し(アメーバブログからの場合) - ライブドアブログのヘルプ(PC向け)

なサイトを見つけたので、早速

アメブロ ダウンロード バックアップ エクスポート ツール Ver 0.0.13 リリース|ブログのタイトルを入力します。

から、 ame-0.0.13.zip をダウンロードして実行するも、特定のページまで来るとずっとループして終了しない。

ループになるのは、アメーバの仕様変更か何かで最後のリストページにも次のページのリンクが存在していて、またそれを押しても同じページが出るから。

だとしても、それは途中でCtrl+Cを入力して終了させればいい。にしても、downloadフォルダに一ページもダウンロードできていない…

作者のページdrunkenで実行した場合でも、古い二ページだけしかダウンロードできない…アメーバ側で引越しさせないために仕様を変更したのだろうか…

しょうがないので、 ame-0.0.15.exe をPowershellで自作してみた。

GetHtmlFromAmeblo.ps1

$username = Read-Host "Please enter your Ameba ID"
if (!$username) {
    Write-Host 'アメーバIDが未入力なので終了します。'
    Exit
}
if (Test-Path .\$username) {
    Remove-Item .\$username -Recurse -Force
}
New-Item ".\$username" -itemType Directory -Force
$listUrl = "http://ameblo.jp/$username/entrylist.html"
echo $null > .\$username\list.txt
while ($true)
{
    Invoke-WebRequest -Uri "$listUrl" -OutFile .\$username\entrylist.html
    (Get-Content -Encoding UTF8 .\$username\entrylist.html).foreach{ if ($_ -match "(?<=`"contentTitle`" href=`")(http:\/\/ameblo\.jp\/$username\/entry-.+?)(?=`">)") { $matches[1] }} >> .\$username\list.txt
    foreach ($line in Get-Content .\$username\list.txt) {
        $start = $line.IndexOf("entry-")
        $end = $line.LastIndexOf(".html")
        $filename = $line.Substring($start, $end + 5 - $start)
        Invoke-WebRequest -Uri $line -OutFile .\$username\$filename
    }
    $next = (Get-Content -Encoding UTF8 .\$username\entrylist.html).foreach{ if ($_ -match "(?<=pagingNext`" href=`")(http:\/\/ameblo.jp\/$username\/entrylist-\d{1,3}\.html)(?=`">次ページ)") { $matches[1] }}
    if ((!$next) -or ($listUrl -eq $next)) {
        break
    }
    $listUrl = $next
}
Remove-Item .\$username\list.txt -Force
Remove-Item .\$username\entrylist.html -Force

linuxでのwgetの代わりがInvoke-WebRequest。引数の$listUrlが何故かダブルコーテーションで囲まないと二回目のループの時、駄目だった。初めは取得した内容を取るために、それ以外の行を削除して、それから、その行の何番目から何番目を切り取るみたいな、書き方をしていた。

$next = (Get-Content -Encoding UTF8 .\$username\entrylist.html) -replace '^(?!.*"contentTitle" href="http:\/\/ameblo\.jp\/arimasou16\/entry-.*\.html).*$', '' | ? {$_.trim() -ne "" }

または

$next = (Get-Content -Encoding UTF8 .\$username\entrylist.html) | Select-String '"contentTitle" href="http:\/\/ameblo.jp\/arimasou16\/entry-.*\.html"' | %{$_.line}

普通に置換だけすると、空行が残る。`r`nとかでは上手く空行が削除できないので、| ? {$_.trim() -ne ""}を咬ませなければいけなかった。もしくは、| %{$_.line}

$start = $next.IndexOf("http")
$end = $next.LastIndexOf(".html")
$listUrl = $next.Substring($start, $end + 5 - $start)

それでも、行丸ごと残るので、そこから、目的の文字列だけにするために切り取ったりしてたけれども、-matchに配列を渡すと、空行は残らないし、$matchesという変数に配列で合致した内容が格納されてるで、必要な部分だけを取得、設定することができる。

ともあれ、単純に記事一覧から次ページを辿って、HTMLソースファイルを取得してくるPowershellは書けた。速度はそんな速くないけどね…

でもって、これをame_conv_mt-0.0.18.exeに咬ませば、MT形式出力にしてくれるかなーとか淡い期待をしたら、 index.html がないからか、駄目だった…HTML型式からMT型式に変換するソフトなんぞ、転がってるかなーとか思ったら、転がってなかった…めんどくせー。