LWP :: Simple ::在浏览器中工作的URL失败

时间:2014-08-05 02:42:03

标签: json perl get

#!/usr/bin/perl

use strict;
use warnings;
use JSON qw( decode_json );
use LWP::Simple;

my $cavirtex = get('https://www.cavirtex.com/api2/orderbook.json?currencypair=BTCCAD');
print $cavirtex;

编译时,我得到......

  

在cavirtex.pl第9行打印时使用未初始化的值$ cavirtex。

更多信息: https://www.cavirtex.com/api_information#orderbook

感谢。

编辑/更多信息: 在我的程序中,当我替换...

https://www.cavirtex.com/api2/orderbook.json?currencypair=BTCCAD

...与

https://www.bitstamp.net/api/ticker/

它运作得很好。怪异。

2 个答案:

答案 0 :(得分:7)

运行以下命令:

perl -MLWP::Simple -e 'getprint "https://www.cavirtex.com/api2/orderbook.json?currencypair=BTCCAD"'

产生以下结果:

403 Forbidden <URL:https://www.cavirtex.com/api2/orderbook.json?currencypair=BTCCAD>

但是,在浏览器中访问URL似乎工作正常。这让我预感到正在检查用户代理或需要cookie。

我决定在我的请求中手动指定一个已知良好的用户代理。如果这不起作用,我会玩弄生成饼干。

使用以下代码我得到了预期的结果:

require LWP::UserAgent;

my $ua = LWP::UserAgent->new;
$ua->timeout(10);
$ua->agent("Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like    Gecko) Chrome/37.0.2049.0 Safari/537.36");
my $response = $ua->get('https://www.cavirtex.com/api2/orderbook.json?currencypair=BTCCAD');

if ($response->is_success) {
    print $response->decoded_content;  # or whatever
}
else {
   die $response->status_line;
}

希望有所帮助(TL; DR看起来您需要为此特定API调用设置用户代理)

编辑:为什么它对你尝试的第二个URL工作正常的原因是因为它击中了一个似乎不关心用户代理的不同API。

答案 1 :(得分:2)

@Dave Cooper回答很棒。您也可以通过以下方式更改LWP :: Simple用户代理:

use strict;
use warnings;
use JSON qw( decode_json );
use LWP::Simple qw/$ua get/;

$ua->agent('Mozilla/5.0');
my $cavirtex = get('https://www.cavirtex.com/api2/orderbook.json?currencypair=BTCCAD');
print $cavirtex;

注意$ua导出变量是LWP::UserAgent的实例。 LWP::Simple对象

委托$ua次操作