1

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

  • 维基:富
  • 酒吧#你好

获取输入的 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'};
    }
}
4

1 回答 1

2

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

信息查询(您的第二种方法)可能会更好,因为它不调用解析器(这对服务器来说工作量要少一些,尽管这并不重要)。之后总是可以将目标(或 # 号之后称为 no a days 的任何部分)放到 url 的末尾。

于 2012-12-10T23:22:39.947 回答