#!/usr/bin/perl use strict; use warnings; use Getopt::Long; use WWW::Mechanize; use IO::Handle; # pas de tampon sur STDOUT STDOUT->autoflush(1); # options par défaut my %CONF = ( email => '', # À remplacer par vos identifiant, password => '', # mot de passe shop => '', # et magasin préféré find => '', list => 0, ); # message d'information my $USAGE = << 'USAGE'; Options disponibles: --email --password --shop --find --list USAGE GetOptions( \%CONF, "email=s", "password=s", "list!", "shop=i", "find=s", "help!" ) or die $USAGE; # divers cas d'erreur $CONF{$_} or die "$_ requis\n$USAGE" for qw( email password ); die "Au moins un paramètre --shop ou --find ou --list requis\n$USAGE" unless $CONF{shop} || $CONF{find} || $CONF{list}; die "Au moins une image requise\n$USAGE" if $CONF{shop} && @ARGV == 0; die $USAGE if $CONF{help}; # connexion à la page principale my $m = WWW::Mechanize->new; $m->get('http://www.photostation.fr/index.php'); # client HTML $m->follow_link( url_regex => qr/htmlclient/ ); # formulaire d'identification $m->set_fields( external_login_user => $CONF{email}, external_login_pwd => $CONF{password}, ); $m->click('external_login[]'); die "Échec de l'identification\n" if $m->content !~ /\Q$CONF{email}\E/; # les noms des photos sont dans @ARGV if ( $CONF{shop} ) { if ( @ARGV > 10 ) { $m->form_number(2); bless $m->current_form()->find_input('quantity'), 'HTML::Form::TextInput'; $m->field( quantity => scalar @ARGV ); $m->click; } $m->form_number(3); $m->set_fields( "file$_" => $ARGV[$_] ) for 0 .. @ARGV - 1; my $req; $|++; { no warnings; local $HTTP::Request::Common::DYNAMIC_FILE_UPLOAD = 1; $req = $m->current_form()->make_request; my $content_sub = $req->content(); my $done = 0; my $total = $req->content_length; $req->content( sub { my $data = $content_sub->(); return unless defined $data; $done += length $data; printf "\rTransfert: %2d%% (%d/%d)", $done / $total * 100, $done, $total; return $data; } ); } # envoi des photos $m->request($req); print "\n"; } else { # envoi d'une image bidon (blanc 10x10) $m->form_number(3); my $input = $m->current_form()->find_input('file0'); $input->content( pack( 'H*', '89504e470d0a1a0a0000000d494844520000000a0000000a0103000000b7' . 'fc5dfe00000006504c5445000000ffffffa5d99fdd0000000e4944415478' . 'da63f87f8001370200075211774b8b03d80000000049454e44ae426082' ) ); $input->filename('blank10x10.png'); $input->headers( content_type => 'image/png' ); $m->click; } die "Échec de l'envoi des images : " . $m->res()->status_line() unless $m->success(); # taille par défaut # force le format 10x13 $m->form_number(2); $m->set_fields( 'orderdata[4]' => 0, # 9x11 'orderdata[5]' => 1, # 10x13 'orderdata[11]' => 0, # 11x15 'orderdata[6]' => 0, # 13x17 ); $m->click('order[]'); die "Échec de validation du format : " . $m->res()->status_line() unless $m->success(); # choix de la livraison en magasin $m->form_number(2); $m->field( transfer_type => 'FC' ); $m->click('startorder[]'); die "Échec de validation de la livraison : " . $m->res()->status_line() unless $m->success(); # liste des magasins $m->form_number(2); if ( $CONF{shop} ) { # validation finale $m->current_form()->find_input( 'loc_id', 'option' )->value( $CONF{shop} ); $m->tick( 'accept', 'on' ); # accepte les conditions générales de vente $m->click('startorder[]'); # validation die "Échec de la confirmation finale : " . $m->res()->status_line() unless $m->success(); # détection d'éventuelles erreurs if( $m->content() =~ m!(.*?)! ) { die "Erreur lors de la confirmation : $1"; } # suit la redirection $m->follow_link( url_regex => qr/summary/ ); die "Échec de récupération du bilan : " . $m->res()->status_line() unless $m->success(); # affichage des informations de commande print $m->content(); my ( $commande, $client ) = $m->content() =~ /(?:commande:\ |client: )(\d+)/g; print "Numéro de client: $client\n", "Numéro de commande: $commande\n"; } else { my %cities; my $input = $m->current_form()->find_input( 'loc_id', 'option' ); @cities{ $input->possible_values() } = $input->value_names(); # recherche et affichage des éléments qui correspondent my $re = $CONF{find} ? qr/$CONF{find}/i : qr/(?=)/; print map { "$_\t$cities{$_}\n" } grep { $cities{$_} =~ $re } keys %cities; }