Ich lese jeden Morgen in der Frühstückspause ein paar Webcomics. Einer meiner Favoriten ist Cyanide and Happiness (oder auch explosm). Leider bin ich erst vor Kurzem auf diese Seite gestoßen und daher habe ich viele Comics nicht gelesen. Wenn ich zwischendurch mal extreme Langeweile habe (Nein, das kommt nicht vor. Ich will mich nur vorm Lernen drücken.), möchte ich dies nun nachholen. Leider hat die Seite manchmal eine recht lange Ladezeit und sooo viel Zeit habe ich ja nun auch nicht 🙂
Daher habe ich mir mal schnell ein kleines Download-Script für die PowerShell gebastelt, das die Comics für mich herunterlädt, sodass ich sie später lesen kann. Das ganze funktioniert mit Regular Expressions, da bei explosm die Comics (also die tatsächlichen Bilddateien) nicht etwa durchnummeriert sind, sondern frei vergebene Namen haben und in verschiedenen Ordnern liegen.
Das folgende Script öffnet nach Übergabe von 2 Parametern (Start- und Endnummer) die entsprechenden Comics von explosm und versucht, die URL der Bilddatei zu ermitteln. Sollte das nicht klappen, kann es sein, dass es das Comic mit der Nummer nicht gibt (nicht schlimm), oder dass die URL nicht ausgelesen werden konnte (dann muss der RegEx angepasst werden). Bei letzterem Fall wird die Nummer in die Datei errors.txt gespeichert. Ansonsten lädt das Script die Bilddatei herunter und speichert sie mit der Nummer zu Beginn des Dateinamens ab.
if ($args.Count -ne 2)
{
Write-Host "Start and end number needed" -foregroundcolor "red";
exit;
}
#
$start = $args[0];
$end = $args[1];
#
$path = Split-Path -Parent $MyInvocation.MyCommand.Path;
$pattern = [regex] 'img alt="Cyanide and Happiness, a daily webcomic" src="(?<url>http:\/\/www\.explosm\.net\/db\/files\/(Comics\/)?(?<author>[a-zA-Z0-9]*\/)?(?<file>[\(\) a-zA-Z0-9_-]*\.[a-zA-Z]{3,4}))"';
$errPattern = [regex] "WAHT YOU DOEN";
$clnt = New-Object System.Net.WebClient
#
for ($i = $start; $i -le $end; $i++)
{
Write-Host "Comic No" $i.ToString("0000");
$url = "http://www.explosm.net/comics/" + $i + "/";
$html = Get-Url $url;
$m = $pattern.Match($html);
if ($m.Success)
{
$pic = $m.Groups['url'].Value;
$filename = Join-Path $path ($i.ToString("0000") + "_" + $m.Groups['file'].Value);
Write-Host " Saving" $i.ToString("0000") -foregroundcolor "green";
$clnt.DownloadFile($pic, $filename);
}
else
{
$m = $errPattern.Match($html);
if ($m.Success)
{
Write-Host " does not exist" -foregroundcolor "yellow";
}
else
{
Write-Host " error" -foregroundcolor "red";
Add-Content "errors.txt" $i;
}
}
}
Feed ist platt.
Mhh… bei mir geht’s!?