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型式に変換するソフトなんぞ、転がってるかなーとか思ったら、転がってなかった…めんどくせー。