1

http://www.filehippo.com/download_google_talk/から Google トークなど、一部のソフトウェアの最後の 5 リリースをダウンロードする必要があるタスクの 1 つを自動化しようとしています。

私はそのようなタイプのプログラミング、つまり、perl を介して Web と対話することを行ったことはありません。CGI モジュールを使用してこのことを実装できることを読んで知ったので、このモジュールを試してみました。

誰かが私にもっと良いアドバイスをくれるなら、どういたしまして:)

私のコード:

#!/usr/bin/perl 

use strict;
use warnings;
use CGI; 
use CGI::Carp qw/fatalsToBrowser/;

my $path_to_files =   'http://www.filehippo.com/download_google_talk/download/298ba15362f425c3ac48ffbda96a6156';

my $q = CGI->new;

my $file = $q->param('file') or error('Error: No file selected.');
print "$file\n";

if ($file =~ /^(\w+[\w.-]+\.\w+)$/) {
   $file = $1;
}
else {
   error('Error: Unexpected characters in filename.');
}   

if ($file) {
  download($file) or error('Error: an unknown error has occured. Try again.');
}  

sub download 
{

open(DLFILE, '<', "$path_to_files/$file") or return(0);
print $q->header(-type            => 'application/x-download',
                 -attachment      => $file,
                  'Content-length' => -s "$path_to_files/$file",
   );
  binmode DLFILE;
   print while <DLFILE>;
   close (DLFILE);
   return(1);
}

sub error {
   print $q->header(),
         $q->start_html(-title=>'Error'),
         $q->h1($_[0]),
         $q->end_html;
   exit(0);
}

上記のコードで、ダウンロードしたいファイル名を出力しようとしていますが、エラー メッセージが表示されています。このエラー「エラー: ファイルが選択されていません」の理由がわかりません。来ています。

4

1 に答える 1

2

申し訳ありませんが、あなたは間違った方向に進んでいます。あなたの最善の策は、このモジュールです: http://metacpan.org/pod/WWW::Mechanize

このページには、開始するための多くの例が含まれています: http://metacpan.org/pod/WWW::Mechanize::Examples

もっとエレガントかもしれませんが、このコードの方が理解しやすいと思います。

use strict;
use warnings;

my $path_to_files =   'http://www.filehippo.com/download_google_talk/download/298ba15362f425c3ac48ffbda96a6156';
my $mech = WWW::Mechanize->new();
$mech->get( $path_to_files );
$mech->save_content( "download_google_talk.html" );#save the base to see how it looks  like
foreach my $link ( $mech->links() ){ #walk all links
    print "link: $link\n";
    if ($link =~ m!what_you_want!i){ #if it match
        my $fname = $link;
        $fname =~ s!\A.*/!! if $link =~ m!/!;
        $fname .= ".zip"; #add extension
        print "Download $link to $fname\n";
        $mech->get($link,":content_file" => "$fname" );#download the file and stoore it in a fname.     
    }
}
于 2013-01-31T09:16:03.600 に答える