【问题标题】:Error upload file using Mediawiki::API使用 Mediawiki::API 上传文件时出错
【发布时间】:2012-06-02 05:17:15
【问题描述】:

我正在尝试使用 Mediawiki::API->upload 将图像上传到 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 行的字节 我不知道如何纠正它。 有什么建议吗?

谢谢。

【问题讨论】:

  • 为我工作,展示你的整个代码。
  • 你了解 git-remote-mediawiki 吗?我正在尝试通过 Mediawiki::API 上传文件。我没有展示的部分是创建 mediawiki 实例和 login 的部分。我可以只上传文本文件,但不能上传 .png 或 .jpg 或 .doc... perl 的版本有什么问题吗?
  • 我对 git-remote-mediawiki 一无所知。我已经使用 MediaWiki::API 上传了一个文件。 Show your whole code 和你尝试上传的文件,否则不可能reproduce your problem
  • 现在我可以上传文本文件,但不能上传 .png 或 .jpg。它总是生成错误:使用用户“nguyenki”登录。 44906 字节读取 HTTP::Message 内容必须是 /usr/share/perl5/HTTP/Request/Common.pm 第 91 行的字节
  • 对不起,我不能在这里上传文件“fl.png”,因为我只是这个论坛的新手。

标签: perl mediawiki mediawiki-api


【解决方案1】:

【讨论】:

  • 我不认为encoding 部分是这里的问题。没有它我可以重现错误。
【解决方案2】:

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";
}

显然,这应该在上游进行修补,但希望它能让你继续前进。

【讨论】:

    猜你喜欢
    • 2018-12-28
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 2012-02-04
    • 2012-01-05
    相关资源
    最近更新 更多