2013-09-28 3 views
1

Im пытается загрузить видео автоматически в Youtube с помощью Perl, Ну, я читал это: https://developers.google.com/youtube/2.0/developers_guide_protocol_resumable_uploadsPerl Загрузить на Youtube

и выяснил, что возобновляемая загрузка легче сделать руку об руке, как я не использовать какую-либо библиотеку, я не могу найти один на Perl, которые позволяют мне использовать прямую загрузку ..

все равно Ive сделана аутентификация, но моя основная проблемой является частью загрузки,

до сих пор это то, что я имеют:

#!/usr/bin/perl 

use 5.010; 
use strict; 
use warnings; 
use LWP::Simple; 
use Data::Dumper; 
use XML::XPath; 
my $token; 


my $post_body ; 


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; 
    # print $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); 
} 

## Get $AuthToken 
($token) = 
    getToken(
      (
       username => 'xxxx', 
       password => 'xxxx' 
      ) 
); 


##upload part 

#xml 
my $xml = <<'XML'; 
<?xml version="1.0"?> 
<entry xmlns="http://www.w3.org/2005/Atom" 
    xmlns:media="http://search.yahoo.com/mrss/" 
    xmlns:yt="http://gdata.youtube.com/schemas/2007"> 
    <media:group> 
    <media:title type="plain">Bad Wedding Toast</media:title> 
    <media:description type="plain"> 
     I gave a bad toast at my friend's wedding. 
    </media:description> 
    <media:category 
     scheme="http://gdata.youtube.com/schemas/2007/categories.cat">People 
    </media:category> 
    <media:keywords>toast, wedding</media:keywords> 
    </media:group> 
</entry> 
XML 



my $r = LWP::UserAgent->new->post(
    'http://uploads.gdata.youtube.com/resumable/feeds/api/users/xxxx/uploads', 
    [ 
     Host    => 'uploads.gdata.youtube.com', 
     'Authorization'  => "Bearer $token", 
     'GData-Version'  => '2', 
     'X-GData-Key'  => 'key=xxxxxxxxxxxxxx',  
     'Content-Length' => '0', 
     'Slug'    => 'C:\x\x.wmv', 
     'Content-Type' => 'application/atom+xml; charset=UTF-8' 
    ], 

    $xml, 

); 


    print Dumper(\$r->content); 

Результаты:

$VAR1 = \'Content-Type application/x-www-form-urlencoded is not a valid input type.'; 

и ..

$VAR1 = \'<!DOCTYPE html> 
<html lang=en> 
    <meta charset=utf-8> 
    <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-wi 
dth"> 
    <title>Error 400 (Bad Request)!!1</title> 
    <style> 
    *{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{backgrou 
nd:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height 
:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/error 
s/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflo 
w:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (m 
ax-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0 
}} 
    </style> 
    <a href=//www.google.com/><img src=//www.google.com/images/errors/logo_sm.gif 
alt=Google></a> 
    <p><b>400.</b> <ins>ThatΓÇÖs an error.</ins> 
    <p>Your client has issued a malformed or illegal request. <ins>ThatΓÇÖs all w 
e know.</ins> 
'; 
Press any key to continue . . . 
+1

Вам следует рассмотреть возможность использования [Version 3.0 API] (https://developers.google.com/youtube/v3/ направляющие/using_resumable_upload_protocol). – nwellnhof

ответ

0

Аргументы во втором вызове метода post кажется неправильным (my $r = ...). См. API for LWP::UserAgent->post. Ссылки на массив или хэш должны использоваться для данных формы, но вы используете его для заголовков HTTP. Попробуйте выполнить следующее:

  • удалите квадратные скобки (чтобы заголовки были интерполированы как массив, а не ссылка на массив);
  • заменить $xml на 'Content' => $xml. (На самом деле это не обязательно, но при буквальном чтении API это необходимо.)
Смежные вопросы