3

我正在尝试编写一个 Perl 脚本来连接我的 YouTube 帐户,但它似乎不起作用。基本上我只想连接到我的帐户,但显然它不起作用。我什至不知道如何调试它!也许它与https协议有关?

请赐教!提前致谢。

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 或 mechanize 之外的任何库来完成工作。如何使用 perl 脚本连接到我的帐户?这是我现在的目标,希望有人可以发布脚本或纠正我的。谢谢你们的帮助。我现在正在测试 Webscarab..

4

4 回答 4

9

你想获取什么数据?为什么不只使用现有的实现,例如WebService::YouTube

对您的代码的一些评论:我总是避免使用快捷$ua->request(GET/POST)方法,因为我总是需要更多的灵活性,而只有使用HTTP::RequestHTTP::Response允许。我一直觉得这样的代码也更干净。

为什么你的代码不起作用?谁知道。确保您的 cookiejar 将您的 cookie 添加到传出的HTTP::Request. 我建议您在浏览器中转储所有标头并与libwww正在发送的标头和数据进行比较。他们可能会检查一些额外的字段,这些字段因每次点击而异。他们可能正在检查您的UserAgent字符串。如果您只是想学习libwww,我建议您使用不同的网站作为目标,因为我确信 YouTube 具有各种反脚本强化功能。

于 2009-04-29T19:46:39.637 回答
5

你在使用YouTube 的稳定文档 API吗?

使用WebScarab等 HTTP 代理来观察数据流。

Trey 建议使用其他人的 CPAN 包作为机制也是一个好主意。

于 2009-04-29T19:56:58.833 回答
1

总的来说,您要做的是为大多数具有重定向登录的网站定义一个 cookiejar。这就是包所做的。该软件包还根据 youtube 规范调整了许多查找和抓取。

例如,Ajax 内容会很粗糙,因为在您抓取时它不存在

您刚刚选择了一个有点粗糙的页面作为开始。

享受

于 2009-04-30T06:25:16.763 回答
1

我自己实际上正在研究这个问题。在此之前,我建议您阅读 Google 的API 指南作为一个很好的入门参考。如果我没看错的话,首先是通过 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'));
于 2009-09-28T19:18:18.670 回答