我正在尝试处理用户输入,例如
获取输入的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'};
}
}
答案 0 :(得分:2)
Canonical url指的是wiki规范的url类型。在Wikimedia的当前配置中,这是http。 (如果有一天改变,我不会感到惊讶)。您可以看到的是{{fullurl:Pagename}}。如果http和https都有效,它将以“//”开头的URL响应。否则它将以正常的URL响应。
信息查询(你的第二种方法)可能会更好,因为它不会调用解析器(这对服务器的工作要少一些,尽管这无关紧要)。它总是可以只是将目标(或#符号被称为无日期之后的任何部分)放到网址的末尾。