使用mediawiki api获取mediawiki链接的https链接

时间:2012-12-10 22:33:43

标签: perl https mediawiki mediawiki-api

我正在尝试处理用户输入,例如

  • FOO
  • wikt:FOO
  • Bar#hi there

获取输入的https链接,例如

我试图以最少的手动,最干净的方式做到这一点,所以我可以将我的脚本上传到某个地方并向人们展示,而不会因为它的低质量而感到羞耻。这意味着:

  • 如果我获取http链接而不是https,我宁愿不对s/^http/^https/替换进行硬编码。
  • 如果我获得了不完整的链接,我宁愿不使用正则表达式来添加缺失的内容。

到目前为止,我找到了两个解决方案,但每个解决方案都有缺陷。

解析查询

使用canonicalurl magic word在{{canonicalurl:user_input_here}}上运行解析查询。它只提供http,而不是https链接。

#!/usr/bin/perl
use strict;
use warnings;
use MediaWiki::API;
use Data::Dumper;

my $mw = MediaWiki::API->new();
$mw->{config}->{api_url} = 'https://en.wikipedia.org/w/api.php';

my $info_ref = $mw->api ( {
    action      => 'parse',
    prop        => 'text',
    text        => '{{canonicalurl:Hello}}',
} ) or die $mw->{error}->{code} . ': ' . $mw->{error}->{details};
my $html = $info_ref->{parse}{text}{'*'};
print Dumper $html;

信息查询

使用信息查询。但它不适用于部分,即“Foo#bar”输入将获得链接到“Foo”的输出。

#!/usr/bin/perl
use strict;
use warnings;
use MediaWiki::API;

my $mw = MediaWiki::API->new();
$mw->{config}->{api_url} = 'https://en.wikipedia.org/w/api.php';

sub get_url_by_title(){
  my $title = shift;

  my $info_ref = $mw->api ( {
    action      => 'query',
    prop        => 'info',
    inprop      => 'url',
    iwurl       => 1,
    titles     => $title,
  } ) or die $mw->{error}->{code} . ': ' . $mw->{error}->{details};

    if (exists $info_ref->{query}{pages}){
      return (values $info_ref->{query}{pages})[0]{'fullurl'};
    }
    elsif (exists $info_ref->{query}{interwiki}){
      return (values  $info_ref->{query}{interwiki})[0]{'url'};
    }
}

1 个答案:

答案 0 :(得分:2)

Canonical url指的是wiki规范的url类型。在Wikimedia的当前配置中,这是http。 (如果有一天改变,我不会感到惊讶)。您可以看到的是{{fullurl:Pagename}}。如果http和https都有效,它将以“//”开头的URL响应。否则它将以正常的URL响应。

信息查询(你的第二种方法)可能会更好,因为它不会调用解析器(这对服务器的工作要少一些,尽管这无关紧要)。它总是可以只是将目标(或#符号被称为无日期之后的任何部分)放到网址的末尾。