我正在尝试使用Mediawiki :: API->上传图片到mediawiki。为此,我正在使用此代码:
use strict;
use MediaWiki::API;
use DateTime::Format::ISO8601;
use encoding 'utf8';
binmode STDERR, ":utf8";
use URI::Escape;
use warnings;
use MediaWiki::API;
my $url="http://localhost/mediawiki";
my $wiki_login="nguyenki";
my $wiki_passwd="linh";
my $wiki_domain="";
chomp($wiki_login);
chomp($wiki_passwd);
chomp($wiki_domain);
my $mediawiki;
mw_connect_maybe();
# configure the special upload location.
$mediawiki->{config}->{upload_url} = "$url/index.php/Special:Upload";
my $name="fl.png"; # Name of fichier to upload
# upload a file to MediaWiki
open (my $toi, $name) or die "can't open UTF-8 encoded filename: $!";
binmode $toi;
my ($buffer, $data);
while (my $n=read($toi, $buffer, 65536) ) {
$data .= $buffer;
print STDERR "$n bytes read\n";
}
close($toi);
$mediawiki->upload( { title => $name,
summary => 'This is the summary to go on the Image:file.jpg page',
data => $data } ) || die $mediawiki->{error}->{code} . ': ' . $mediawiki->{error}->{details};
#To login to the wiki page
sub mw_connect_maybe {
if ($mediawiki) {
return;
}
$mediawiki = MediaWiki::API->new;
$mediawiki->{config}->{api_url} = "$url/api.php";
if ($wiki_login) {
if (!$mediawiki->login({
lgname => $wiki_login,
lgpassword => $wiki_passwd,
lgdomain => $wiki_domain,
})) {
print STDERR "Failed to log in mediawiki user \"$wiki_login\" on $url\n";
print STDERR "(error " .
$mediawiki->{error}->{code} . ': ' .
$mediawiki->{error}->{details} . ")\n";
exit 1;
} else {
print STDERR "Logged in with user \"$wiki_login\".\n";
}
}
}
它产生了一个错误: HTTP :: Message内容必须是/usr/share/perl5/HTTP/Request/Common.pm第91行的字节 我不知道如何纠正它。 有什么建议吗?
感谢。
答案 0 :(得分:0)
pragma encoding
会破坏您的代码,将其删除。
答案 1 :(得分:0)
Mediawiki :: API有一个错误。好吧,可能是一些错误,但至少this one(或that one?):它还没有被移植到1.22+ CSRF保护登录系统。要立即登录MediaWiki站点,您需要分两步执行:首先获取令牌,然后使用该令牌登录。这是为了保护糟糕的网络浏览器用户,但不幸的是,这对我们的机器人作家来说意味着更多的痛苦。
MediaWiki :: Bot项目遇到了同样的问题,并使用this commit解决了这个问题,这是如何修复代码的一个很好的例子。我能够构建一个简单的工作登录脚本,绕过内置的MediaWiki :: API登录机制:
#!/usr/bin/perl -w
use MediaWiki::API;
my $wiki = MediaWiki::API->new;
my $remote_url = 'http://localhost:1234/wiki';
my $username = 'WikiAdmin';
my $password = 'AdminPass';
my $wiki_domain = 'localhost';
$wiki->{config}->{api_url} = "${remote_url}/api.php";
print "getting a CSRF token\n";
my $query = {action => 'query',
meta => 'tokens',
type => 'login'};
my $ref = $wiki->api( $query );
my $token;
if ($ref) {
$token = $ref->{query}->{tokens}->{logintoken};
} else {
print 'failed: (error ' . $wiki->{error}->{code} . ': ' .
$wiki->{error}->{details} . ")\n";
}
$query = {action => 'login',
lgtoken => $token,
lgname => $username,
lgpassword => $password,
lgdomain => $wiki_domain,
};
$ref = $wiki->api( $query );
if ($ref && $ref->{login}->{result} eq "Success") {
print "login worked\n";
} else {
print 'failed: (error ' . $wiki->{error}->{code} . ': ' .
$wiki->{error}->{details} . ")\n";
}
显然,这应该在上游打补丁,但希望它能帮助你。