Подтвердить что ты не робот

Как я могу сделать запрос JSON POST с LWP?

Если вы попытаетесь войти в систему https://orbit.theplanet.com/Login.aspx?url=/Default.aspx (используйте комбинацию имени пользователя и пароля), вы увидите, что учетные данные для входа отправляются как нетрадиционный набор данных POST: просто одиночная строка JSON и пара нормальных ключей = значение.

В частности, вместо:

username=foo&password=bar

или даже что-то вроде:

json={"username":"foo","password":"bar"}

Просто:

{"username":"foo","password":"bar"}

Возможно ли выполнить такой запрос с помощью LWP или альтернативного модуля? Я готов сделать это с помощью IO::Socket, но предпочитаю что-то более высокоуровневое, если оно доступно.

4b9b3361

Ответ 1

Вам нужно будет сконструировать HTTP-запрос вручную и передать его в LWP. Это должно сделать следующее:

my $uri = 'https://orbit.theplanet.com/Login.aspx?url=/Default.aspx';
my $json = '{"username":"foo","password":"bar"}';
my $req = HTTP::Request->new( 'POST', $uri );
$req->header( 'Content-Type' => 'application/json' );
$req->content( $json );

Затем вы можете выполнить запрос с помощью LWP:

my $lwp = LWP::UserAgent->new;
$lwp->request( $req );

Ответ 2

Просто создайте запрос POST с этим как тело и передайте его LWP.

my $req = HTTP::Request->new(POST => $url);
$req->content_type('application/json');
$req->content($json);

my $ua = LWP::UserAgent->new; # You might want some options here
my $res = $ua->request($req);
# $res is an HTTP::Response, see the usual LWP docs.

Ответ 3

На странице используется только "анонимный" (без имени) вход, который находится в формате JSON.

Вы должны иметь возможность использовать $ua- > post ($ url,..., Content = > $content), который в используйте функцию POST() из HTTP:: Request:: Common.

use LWP::UserAgent;

my $url = 'https://orbit.theplanet.com/Login.aspx?url=/Default.aspx';
my $json = '{"username": "foo", "password": "bar"}';

my $ua = new LWP::UserAgent();
$response = $ua->post($url, Content => $json);

if ( $response->is_success() ) {
    print("SUCCESSFUL LOGIN!\n");
}
else {
    print("ERROR: " . $response->status_line());
}

В качестве альтернативы вы также можете использовать хэш для входа JSON:

use JSON::XS qw(encode_json);

...

my %json;
$json{username} = "foo";
$json{password} = "bar";

...

$response = $ua->post($url, Content => encode_json(\%json));

Ответ 4

Если вы действительно хотите использовать WWW:: Mechanize, вы можете установить заголовок 'content-type' перед публикацией

$mech->add_header( 
'content-type' => 'application/json'
);

$mech->post($uri, Content => $json);