Perl を使用して YouTube にログインするにはどうすればよいですか?
-
03-07-2019 - |
質問
YouTube アカウントに接続するための Perl スクリプトを作成しようとしていますが、機能しないようです。基本的には自分のアカウントに接続したいだけですが、どうやら機能していないようです。これをどうやってデバッグできるのか全く分かりません。おそらくそれは 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<mpl=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 の Web 機能を学ぶことなので、仕事を成し遂げるために wwwlib または mechanize 以外のライブラリを使用したくありません。Perl スクリプトを使用して自分のアカウントに接続するにはどうすればよいですか?これが今のところ私の目的です。誰かがスクリプトを投稿したり、正しい私のものを投稿したりできることを願っています。助けてくれてありがとう。私は今 Webscarab をテストしています。
解決
どのようなデータを取得しようとしていますか?次のような既存の実装を使用しないのはなぜですか WebService::YouTube
コードに関するいくつかのコメント:いつも近道を避けていた $ua->request(GET/POST)
なぜなら、最終的には常に、 HTTP::Request
そして HTTP::Response
許可された。私もそのほうがコードがきれいだといつも感じていました。
コードが機能しないのはなぜですか?知るか。Cookiejar が発信ファイルに Cookie を追加していることを確認してください。 HTTP::Request
. 。ブラウザで実行するときにすべてのヘッダーをダンプし、ヘッダーとデータと比較することをお勧めします。 libwww
を送っています。ヒットごとに異なるチェック対象の追加フィールドがいくつかある場合があります。彼らはあなたのことをチェックしているかもしれません UserAgent
弦。ただ学びたいだけなら libwww
YouTube ではあらゆる種類のアンチスクリプトが強化されていると確信しているため、ターゲットとして別のサイトを使用することをお勧めします。
他のヒント
YouTubeの安定したドキュメント化されたAPI を使用していますか>
WebScarab などのHTTPプロキシを使用して、データフローを監視します。
メカニックに他の誰かのCPANパッケージを使用するというTreyの提案も良いアイデアです。
おおまかに言って、やりたいことは、リダイレクトログインを行うこれらのWebサイトのほとんどにcookiejarを定義することです。これはパッケージが行ったことです。また、このパッケージは、YouTubeの仕様に基づいて多くのルックアップとスクレイプを調整します。
たとえば、Ajaxのコンテンツは、スクレイピング時に存在しないためラフになります
最初にやや大まかなページを選択しました。
楽しむ
私は実際に自分でこの問題に取り組んでいます。以前は、 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の2つが揃ったら、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'));