簡體   English   中英

LWP :: Simple ::在瀏覽器中工作的URL失敗

[英]LWP::Simple::get fails on a URL that works in the browser

#!/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/

它工作得很好。 奇怪的。

運行以下命令:

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。

@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對象中委派

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM