Как я могу войти в YouTube, используя Perl? - PullRequest
3 голосов
/ 29 апреля 2009

Я пытаюсь написать 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 или механизации, чтобы выполнить работу. Как я могу просто подключиться к своей учетной записи, используя скрипт Perl? это моя цель на данный момент надеюсь, кто-то может опубликовать сценарий или исправить мой. Спасибо, ребята, за помощь. сейчас я тестирую Webscarab ..

Ответы [ 4 ]

9 голосов
/ 29 апреля 2009

Какие данные вы пытаетесь получить? Почему бы просто не использовать существующую реализацию, такую ​​как WebService::YouTube

Некоторые комментарии к вашему коду: я всегда избегал использования ярлыка $ua->request(GET/POST), так как мне всегда требовалась большая гибкость, чем только использование HTTP::Request и HTTP::Response позволил. Я всегда чувствовал, что код и так был чище.

Почему ваш код не работает? Кто знает. Убедитесь, что ваш cookiejar добавляет ваши файлы cookie к исходящей HTTP::Request. Я бы предложил сбросить все ваши заголовки, когда вы делаете это в браузере, и сравнить их с заголовками и данными, которые отправляет libwww. Могут быть некоторые дополнительные поля, которые они проверяют, которые варьируются для каждого попадания. Возможно, они проверяют вашу строку UserAgent. Если вы просто хотите изучить libwww, я бы предложил использовать другой сайт в качестве цели, так как я уверен, что на YouTube есть все виды защиты от скриптинга.

5 голосов
/ 29 апреля 2009

Используете ли вы стабильный документированный API YouTube ?

Используйте HTTP-прокси, такой как WebScarab , чтобы наблюдать за потоком данных.

Предложение Трея использовать чей-то пакет CPAN для механики тоже хорошая идея.

1 голос
/ 28 сентября 2009

Я на самом деле работаю над этим вопросом сам. Раньше я рекомендовал бы прочитать это руководство API от Google в качестве хорошего начального справочника. Если я правильно читаю, начнем с передачи учетных данных пользователя через интерфейс 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. Я все еще пишу этот блок:

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'));
1 голос
/ 30 апреля 2009

В общем и целом, вам нужно определить cookiejar для большинства этих веб-сайтов, которые имеют имя для перенаправления. Это то, что сделал пакет. Также пакет настраивает множество поисков и сборок на основе спецификации YouTube.

Содержимое Ajax, например, будет грубым, так как его нет, когда вы чистите

Вы только что выбрали несколько грубую страницу для начала.

Наслаждайтесь

...