2009-04-29 7 views
3

私はYouTubeアカウントに接続するためのPerlスクリプトを作成しようとしていますが、うまくいかないようです。基本的に私は自分のアカウントに接続したいだけですが、明らかに動作していません。私はこれをどのようにデバッグすることができるか考えていません!おそらくhttpsプロトコルに関連するものでしょうか?Perlを使ってYouTubeにログインするにはどうすればよいですか?

私を教えてください!前もって感謝します。

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; 

私は何をやっていることのperlのウェブ機能を学習したので、私はwwwlib以外の任意のライブラリを使用する場合、または仕事を得るために機械化されてはいけません。 どうすれば私のアカウントにperlスクリプトを使って接続できますか?これは今私の目的です 誰かがスクリプトを投稿したり、正しい鉱山を願っています。 お世話になりました。 私は現在Webscarabをテスト中です..

答えて

9

あなたはどのデータを取得しようとしていますか?ちょうどあなたのコードにWebService::YouTube

いくつかのコメントのような既存の実装を使用していない理由:私はいつも、私はいつもHTTP::RequestHTTP::Responseの使用のみが許可され、より多くの柔軟性を必要とすることになったので、ショートカット$ua->request(GET/POST)方法を避け。私はいつもそのコードがそのようにきれいだと感じました。

コードが機能しないのはなぜですか?知るか。 クッキージャーがあなたのクッキーを発信するHTTP::Requestに追加していることを確認してください。私はあなたがブラウザでそれを行うと、libwwwが送信しているヘッダーとデータと比較するときにすべてのあなたのヘッダーをダンプすることをお勧めします。彼らがチェックするいくつかの追加のフィールドが、ヒットごとに異なるかもしれません。あなたのUserAgent文字列をチェックしている可能性があります。 libwwwを覚えているのであれば、別のサイトをターゲットとして使用することをお勧めします.YouTubeにはあらゆる種類のスクリプト防止機能があります。

5

YouTube's stable documented APIをお使いですか?

WebScarabなどのHTTPプロキシを使用して、データフローを監視します。

機械のために他の人のCPANパッケージを使用するというTreyの提案も良い考えです。

1

右のように、リダイレクトログインしているこれらのウェブサイトのほとんどにcookiejarを定義するだけです。これはパッケージが行ったことです。また、パッケージは、YouTubeの仕様に基づいて、ルックアップやスクラップの多くを調整します。あなたが

をこするときにはないそこにあなただけでアウトを開始する、ややラフなページを選んだので、例えば

のAjaxコンテンツが粗くなります。

お楽しみください

1

私は実際に自分自身でこの問題に取り組んでいます。これまでは、GoogleからのAPI guideを読んでおくことをお勧めします。私が正しくそれを読んでいる場合は、認証トークンを取得するためにRESTインタフェースを通してユーザーの資格情報を渡すことから始まります。それを処理するために、私が使用している以下:

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

そして、私は呼んでいる私のプログラムの主要部分からのような:私はこれら二つたら

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

- 持つAuthToken $をし、 $ GoogleUserName、私はまだLWP Postをテストしています。私はまだ、このユニットを書いている:

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

そして、それは

&test((auth=>$Auth, user=>$user, File=>'test.wmv')); 
と呼ばれている