Si vous essayez de vous connecter sur https://orbit.theplanet.com/Login.aspx?url=/Default.aspx (utilisez n'importe quelle combinaison nom d'utilisateur/mot de passe), vous pouvez voir que les informations de connexion sont envoyé comme un ensemble non traditionnel de données POST: juste une chaîne JSON solitaire et pas de paire clé = valeur normale.
Plus précisément, au lieu de:
username=foo&password=bar
ou même quelque chose comme:
json={"username":"foo","password":"bar"}
Il y a simplement:
{"username":"foo","password":"bar"}
Est-il possible d'effectuer une telle requête avec LWP
ou un module alternatif? Je suis prêt à le faire avec IO::Socket
mais préférerait quelque chose de plus haut niveau si disponible.
Vous devrez construire la demande HTTP manuellement et la transmettre à LWP. Quelque chose comme ce qui suit devrait le faire:
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 );
Ensuite, vous pouvez exécuter la demande avec LWP:
my $lwp = LWP::UserAgent->new;
$lwp->request( $req );
Créez simplement une demande POST avec cela comme corps et donnez-la à 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.
La page utilise simplement une entrée "anonyme" (sans nom), qui se trouve être au format JSON.
Vous devriez pouvoir utiliser $ ua-> post ($ url, ..., Content => $ content) , qui à son tour utilise la fonction POST () de 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());
}
Alternativement, vous pouvez également utiliser un hachage pour l'entrée JSON:
use JSON::XS qw(encode_json);
...
my %json;
$json{username} = "foo";
$json{password} = "bar";
...
$response = $ua->post($url, Content => encode_json(\%json));
Si vous voulez vraiment utiliser WWW :: Mechanize, vous pouvez définir l'en-tête 'content-type' avant de poster
$mech->add_header(
'content-type' => 'application/json'
);
$mech->post($uri, Content => $json);