1

我正在尝试用 perl 制作一个 youtube 下载器脚本,方法是用 youtube 链接填写一个 youtube 下载器站点表单,提交它并接受要下载的文件。

我尝试了许多不同的代码,但我无法填写表格,我认为这是因为表格位于 < div > 标签中。

我怎样才能做到这一点 ?

谢谢你。

#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use WWW::Mechanize;

my $url = 'http://www.youtube-mp3.org';
my $m = WWW::Mechanize->new();
my $textbox = 'youtube-url';
my $youtubelink = "http\:\/\/www.youtube.com\/watch\?v\=lDK9QqIzhwk";
my $cgi = CGI->new();
my $form = $cgi->Vars;


$m->get($url);


$m -> form_number ('1');
$m -> field($youtubelink, $form->{$textbox});
$m -> submit();


$m->submit();


print $m -> content();

$m->follow_link(text_regex => qr/Download/i);
my $response = $m->res();
my $filename = $response->filename;

if (! open ( FOUT, ">$filename" ) ) {
    die("Could not create file: $!" );
}
print( FOUT $m->response->content() );
close( FOUT );
4

1 回答 1

0

在行

$m -> field($youtubelink, $form->{$textbox});

您正在传递一个与第一个输入的 value 属性相对应的值,但是 field 方法不需要value而是name。(除了输入没有名称属性)

我也认为您不能只填写表格上的字段然后提交。如果您看到源代码,它将在提交表单之前运行一些 javascript 代码

当我们点击提交按钮时,看看网络上发生了什么,它显示了两个 GET 方法的序列

第一个是这个

http://www.youtube-mp3.org/a/pushItem/?item=http%3A//www.youtube.com/watch%3Fv%3DKMU0tzLwhbE&el=na&bf=false&r=1377433712868 

返回

KMU0tzLwhbE

然后是第二次调用(注意 video_id 是第一次 GET 返回的值)

http://www.youtube-mp3.org/a/itemInfo/?video_id=KMU0tzLwhbE&ac=www&t=grp&r=1377433713366

返回

info = { "title" : "Developers", "image" : "http://i.ytimg.com/vi/KMU0tzLwhbE/default.jpg", "length" : "3", "status" : "serving",  "progress_speed" : "",  "progress" : "",  "ads" : "",  "pf" : "",  "h" : "c21be9b00d0ec12ea980bf828d09440c"  };

所以我的建议是准备第一个 URL,发布它,提取答案,然后发布由第一个请求的答案组成的第二个 URL。

于 2013-08-25T12:40:07.043 回答