2009-04-29 12 views
3

Ich versuche ein Perl-Skript zu schreiben, um eine Verbindung zu mir YouTube-Konto herzustellen, aber es scheint nicht zu funktionieren. Grundsätzlich möchte ich nur mit meinem Konto verbinden, aber anscheinend funktioniert es nicht. Ich habe nicht mal eine Idee, wie ich das debuggen könnte! Vielleicht ist es etwas mit https-Protokoll verwandt?Wie kann ich mich mit Perl bei YouTube anmelden?

Bitte erleuchten Sie mich! Danke im Voraus.

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; 

, was ich tue, um die Web-Features von Perl ist das Lernen, so ich nicht jede Bibliothek außer wwwlib verwenden möchte oder mechanisieren den Job zu erledigen. Wie kann ich nur mit einem Perl-Skript eine Verbindung zu meinem Konto herstellen? Das ist mein Ziel für jetzt hoffe jemand kann ein Skript posten oder meins korrigieren. danke Jungs für Sie helfen. Ich teste Webscarab jetzt ..

Antwort

9

Welche Daten versuchen Sie zu greifen? Warum nicht einfach eine bestehende Implementierung wie WebService::YouTube

einige Kommentare auf Ihrem Code verwenden: Ich habe immer die Verknüpfung $ua->request(GET/POST) Verfahren vermieden, da ich immer mehr Flexibilität am Ende benötigen, das nur die Verwendung von HTTP::Request und HTTP::Response erlaubt. Ich fühlte immer, dass der Code auch sauberer war.

Warum funktioniert Ihr Code nicht? Wer weiß. Stellen Sie sicher, dass Ihr cookiejar Ihre Cookies zum ausgehenden HTTP::Request hinzufügt. Ich würde vorschlagen, alle Ihre Header zu verwerfen, wenn Sie es in einem Browser tun und mit den Headern und Daten vergleichen, die libwww sendet. Es kann einige zusätzliche Felder geben, nach denen sie suchen, die für jeden Treffer variieren. Sie können nach Ihrer UserAgent Zeichenfolge suchen. Wenn Sie nur versuchen, libwww zu lernen, würde ich vorschlagen, eine andere Seite als Ziel zu verwenden, da ich sicher bin, dass YouTube alle Arten von Anti-Scripting-Verhärtungen hat.

5

Verwenden Sie YouTube's stable documented API?

Verwenden Sie einen HTTP-Proxy wie WebScarab, um den Datenfluss zu überwachen.

Treys Vorschlag, das CPAN-Paket von jemand anderem für die Mechanik zu verwenden, ist ebenfalls eine gute Idee.

1

Ganz rechts im Großen und Ganzen, was Sie tun möchten, ist ein Cookie-Jar für die meisten dieser Websites, die eine Umleitung Login haben. Dies ist, was das Paket getan hat. Auch das Paket stimmt viele Lookups und Scrapes ab, die auf der Youtube-Spezifikation basieren.

Ajax Inhalt zum Beispiel wird seit seiner dort nicht rau sein, wenn Ihr

Schaben

Sie nahm nur eine etwas grobe Seite mit zu beginnen.

Enjoy

1

Ich arbeite tatsächlich an diesem Thema selbst. Vorher würde ich vorschlagen, lesen Sie diese API guide von Google als eine gute Referenz Start. Wenn ich es richtig lese, beginnt man mit der Übergabe von Benutzerdaten über eine REST-Schnittstelle, um ein Authentifizierungs-Token zu erhalten.Zu handhaben, dass ich verwende die folgenden:

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); 
} 

Und ich nenne das von dem Hauptteil meines Programms als solche:

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

Einmal habe ich diese beiden Dinge - $ authToken und $ GoogleUserName, ich teste immer noch den LWP Post. Ich schreibe immer noch dieses Gerät:

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) 
} 

Und das heißt als

&test((auth=>$Auth, user=>$user, File=>'test.wmv')); 
Verwandte Themen