Question

J'essaie d'écrire un script Perl pour me connecter à mon compte YouTube, mais cela ne semble pas fonctionner. En gros, je veux juste me connecter à mon compte, mais apparemment, cela ne fonctionne pas. Je n'ai même pas une idée sur la façon dont je pourrais résoudre ce problème! Peut-être que c'est quelque chose lié au protocole https?

Veuillez m'éclairer! Merci d'avance.

use HTTP::Request::Common;
use LWP::UserAgent;
use strict;

my $login="test";
my $pass = "test";
my $res = "";
my $ua = "";

# Create user agent, make it look like FireFox and store cookies
$ua = LWP::UserAgent->new;
$ua->agent("Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20051213 Firefox/1.0.7");
$ua->cookie_jar ( {} );

# Request login page 
$res = $ua->request(GET "https://www.google.com/accounts/ServiceLogin?service=youtube&hl=en_US&passive=true&ltmpl=sso&uilel=3&continue=http%3A//www.youtube.com/signup%3Fhl%3Den_US%26warned%3D%26nomobiletemp%3D1%26next%3D/index");
die("ERROR1: GET http://www.youtube.com/login\n") unless ($res->is_success);


# Now we login with our user/pass
$res = $ua->request(
        POST "https://www.google.com/accounts/ServiceLoginAuth?service=youtube",
        Referer => "http://www.youtube.com/login",
        Content_Type => "application/x-www-form-urlencoded",
        Content => [
                currentform     => "login",
                next            => "/index",
                username        => $login,
                password        => $pass,
                action_login    => "Log+In"
        ]
        );

# YouTube redirects (302) to a new page when login is success
# and returns OK (200) if the login failed.
#die("ERROR: Login Failed\n") unless ($res->is_redirect());


print $res->content;

Ce que je suis en train d’apprendre, c’est d’apprendre les fonctionnalités Web de perl. Je ne souhaite donc utiliser aucune bibliothèque, à l’exception de wwwlib ou mécanize, pour que le travail soit fait. Comment puis-je simplement me connecter à mon compte en utilisant un script Perl? c'est mon objectif pour l'instant J'espère que quelqu'un pourra poster un script ou corriger le mien. merci les gars pour votre aide. Je teste Webscarab maintenant ..

Était-ce utile?

La solution

Quelles données essayez-vous de saisir? Pourquoi ne pas utiliser simplement une implémentation existante telle que WebService :: YouTube a>

Quelques commentaires sur votre code: j’évitais toujours la méthode de raccourci $ ua- > request (GET / POST) car je finissais toujours par avoir besoin de plus de flexibilité que la seule utilisation de HTTP :: Demander et HTTP :: Réponse autorisé. J'ai toujours pensé que le code était aussi plus propre.

Pourquoi votre code ne fonctionne-t-il pas? Qui sait. Assurez-vous que votre cookiejar ajoute vos cookies au HTTP :: Request . Je suggère de vider tous vos en-têtes lorsque vous le faites dans un navigateur et de les comparer avec les en-têtes et les données que libwww est en cours d'envoi. Il se peut qu’ils vérifient certains champs supplémentaires, qui varient pour chaque résultat. Ils vérifient peut-être votre chaîne UserAgent . Si vous souhaitez simplement apprendre à libwww Je vous suggère d’utiliser un autre site comme cible, car je suis sûr que YouTube offre une sorte de durcissement anti-script.

Autres conseils

Utilisez-vous l'API documentée stable de YouTube ?

Utilisez un proxy HTTP tel que WebScarab pour surveiller le flux de données.

La suggestion de Trey d'utiliser le package CPAN de quelqu'un d'autre pour les mécaniciens est également une bonne idée.

En gros, ce que vous voulez faire est de définir un cookiejar pour la plupart de ces sites Web qui ont un identifiant de redirection. C'est ce que le paquet a fait. De plus, le paquet optimise de nombreuses recherches et améliorations en fonction de la spécification YouTube.

Le contenu Ajax, par exemple, sera approximatif car il n’est pas présent lors du raclage

.

Vous venez de choisir une page quelque peu approximative pour commencer.

Profitez

Je travaille actuellement sur ce problème moi-même. Auparavant, je vous suggèrerais de consulter le guide d'API de Google comme une bonne référence de départ. Si je le lis correctement, on commence par transmettre les informations d'identification de l'utilisateur via une interface REST pour obtenir un jeton d'authentification. Pour gérer cela, j'utilise ce qui suit:

sub getToken {
  my %parms = @_;
  my $response    = LWP::UserAgent->new->post(
                   'https://www.google.com/youtube/accounts/ClientLogin',
                   [
                         Email   => $parms{'username'},
                         Passwd  => $parms{'password'},
                         service => "youtube",
                         source  => "<<Your Value Here>>",                            
                   ]
    );


    my $content = $response->content;


    my ($auth) = $content =~ /^Auth=(.*)YouTubeUser(.*)$/msg
           or die "Unable to authenticate?\n";
    my ($user) = $content =~ /YouTubeUser=(.*)$/msg
            or die "Could not extract user name from response string. ";

    return ($auth, $user);
}

Et j'appelle cela de la partie principale de mon programme en tant que tel:

## Get $AuthToken
my ($AuthToken, $GoogleUserName) = getToken((
                          username => $email, password => $password
                          ));

Une fois que j'ai ces deux choses - $ AuthToken et $ GoogleUserName, je teste toujours la publication LWP. J'écris toujours cette unité:

sub test {

my %parms = @_;

## Copy file contents. Use, foy's three param open method. 
my $fileSize = -s $parms{'File'};
open(VideoFile, '<', "$parms{'File'}") or die "Can't open $parms{'File'}.";
binmode VideoFile;
read(VideoFile, my $fileContents, $fileSize) or die "Can't read $parms{'File'}";
close VideoFile;




my $r = LWP::UserAgent->new->post(
    "http://uploads.gdata.youtube.com/feeds/api/users/$parms{'user'}/uploads",
    [
        Host              => "uploads.gdata.youtube.com",
        'Authorization'     => "AuthSub token=\"$parms{'auth'}\"",
        'GData-Version'     => "2",
        'X-GData-Key'       => "key=$YouTubeDeveloperKey",
        'Slug'              => "$parms{'File'}",
        'Content-Type'      => "multipart/related; boundary=\"<boundary_string>\"",
        'Content-Length'    => "<content_length>",
        'video_content_type'=> "video/wmv",
        'Connection'        => "close",
        'Content'           => $fileContents
    ]

);


print Dumper(\$r->content)
}

Et cela s'appelle

&test((auth=>$Auth, user=>$user, File=>'test.wmv'));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top