Der Bot verwendet - wie in der Signatur und im Benutzertitel erwähnt - Perl und LWP, müsste also auf jedem beliebigen unixoiden Betriebssystem laufen. Auf der Kommandozeile wird ein URI eines Threads erwartet, als Standardeingabe eine Liste mit zu ersetzenden URIs im Format
http://i.imagebanana.com/img/123456/foo.jpg = http://abload.de/img/foo00bar.jpg
Der Bot benutzt keine explizit moderativen Funktionen (abgehen von der Tatsache, dass er fremde Beiträge ebenso zu bearbeiten versucht wie die eigenen), ist allerdings in dieser Form spezifisch für das Ersetzen von ImageBanana- durch Abload-Links im ngb gedacht. Insbesondere leitet er aus den eingegebenen Deep-Links automatisch Thumbnail-Links ab und ersetzt auch diese, und er nutzt nicht die Suchfunktion, sondern die Thread-Ansicht. Das liesse sich allerdings relativ leicht anpassen. Auch eine Nachfrage könnte man nach der ohnehin bereits vorhandenen Ausgabe des neuen BBCodes (
print "================\n$bbcode\n================\n";) integrieren.
[src=perl]#!/usr/bin/perl
use LWP::UserAgent;
use HTTP::Cookies;
use HTML::Entities;
$ua = new LWP::UserAgent;
$cookie_jar = new HTTP::Cookies;
$cookie_jar->set_cookie(0,'bb_userid', '3088', '/', 'ngb.to', '443', 0, 0, 99999,0);
$cookie_jar->set_cookie(0,'bb_password', '****', '/', 'ngb.to', '443', 0, 0, 99999,0);
$ua->cookie_jar($cookie_jar);
$ngburl = $ARGV[0];
print "URL: '$ngburl'\n";
while(<STDIN>) {
chomp;
($ib,$ab) = /^(.*) = (.*)$/i;
$ab_thumb = $ab; $ab_thumb =~ s!/img/!/thumb/!;
($ibid,$ibname) = $ib =~ /\/([^\/]*)\/([^\/]*)$/;
# deep uri
$replace{$ib} = $ab;
print "'$ib' => '$ab'\n";
# 'view' uri
$ib_view = "http://www.imagebanana.com/view/$ibid/$ibname";
$replace{$ib_view} = $ab;
print "'$ib_view' => '$ab'\n";
# thumb uri
$ib_thumb = "http://i.imagebanana.com/img/$ibid/thumb/$ibname";
$replace{$ib_thumb} = $ab_thumb;
print "'$ib_thumb' => '$ab_thumb'\n";
}
do {
$page = $ua->get($ngburl)->content();
print "**** PROCESSING $ngburl ****\n";
($ngburl) = $page=~m!<link rel="next" href="(.*?)" />!i;
while($page =~ m!<div id="post_message_(\d+)">\s*<blockquote[^>]*>\s*(.*?)\s*</blockquote>\s*</div>!sig) {
$pid = $1; $txt = $2;
print "Processing post $pid ...\n";
for $ib(keys %replace) {
if(index($txt,$ib) != -1) {
print "Editing post $pid\n";
$ed = $ua->get('https://ngb.to/editpost.php?do=editpost&postid='.$pid)->content();
($bbcode) = $ed =~ /<textarea id="vB_Editor_001_editor" name="message"[^>]*>(.*?)<\/textarea>/si;
($title) = $ed =~ /id="titlefield" maxlength="85" value="(.*?)"/si;
($sectoken) = $ed =~ /name="securitytoken" value="(.*?)"/s;
($posthash) = $ed =~ /name="posthash" value="(.*?)"/s;
($poststarttime) = $ed =~ /name="poststarttime" value="(.*?)"/s;
$bbcode = decode_entities($bbcode); $title = decode_entities($title);
for $ibreplace(keys %replace) {
$pos = index($bbcode, $ibreplace);
while($pos > -1) {
substr($bbcode, $pos, length($ibreplace), $replace{$ibreplace});
$pos = index($bbcode, $ibreplace, $pos + length($replace{$ibreplace}));
}
}
print "================\n$bbcode\n================\n";
$ua->post('https://ngb.to/editpost.php?do=updatepost&p='.$pid, {
'reason' => 'ImageBanana-Bilder ersetzt.',
'title' => $title,
'message_backup' => $bbcode,
'message' => $bbcode,
'wysiwyg' => 0,
'iconid' => 0,
'sbutton' => 'Submit',
'signature' => 1,
'parseurl' => 0,
's' => '',
'securitytoken' => $sectoken,
'do' => 'updatepost',
'p' => $pid,
'posthash' => $posthash,
'poststarttime' => $poststarttime
});
last;
}
}
}
} while($ngburl ne '');[/src]