Chinaunix

标题: 微软网络广播下载程序 [打印本页]

作者: vulgate    时间: 2006-02-07 19:50
标题: 微软网络广播下载程序
#  auto_mb_download.pl
#      written by vulgatecn@msn.com
#              2006.2.07
#  自动下载微软网络广播的东东
#
#  流程介绍
#  先访问 http://www.microsoft.com/china/technet/webcasts/download.mspx
#     获取下载列表
#  然后访问http://www.mswebcast.com.cn/technet/alogin.aspx
#      登陆后,获得session,
#  用session访问http://www.mswebcast.com.cn/technet/dload.aspx?id
#      获得实际下载地址
#   产生批处理文件,然后用wget下载
#
#  要求安装wget,并且在path指明wget的路径
#  执行批处理时,每个教学内容,会建立一个文件夹,该文件夹保存下载课程录像
#  程序中需要自己添加微软网络广播的帐号
#  使用方法
#   auto_mb_download.pl > download.bat
#   download.bat
#

require HTTP::Request;# load http module
require HTTP::Response;
require LWP::UserAgent;
use HTTP::Cookies;
use HTTP::Request::Common;
use LWP::Simple;
use HTTP::Cookies
$|=1;
use Socket;
use Getopt::Std;
$host="www.mswebcast.com.cn";
$port=80;
$base_dir="d:\\mswebcast";
$account='';
$pass='';


$list_url="http://www.microsoft.com/china/technet/webcasts/download.mspx";
         
$login_url="http://www.mswebcast.com.cn/technet/alogin.aspx";

$ua = LWP::UserAgent->new;
$cookie='__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=dDwtMTY2ODcwMjM2O3Q8O2w8aTwwPjs%2BO2w8dDw7bDxpPDk%2BOz47bDx0PHA8O3A8bDxvbmNsaWNrOz47bDxyZXR1cm4gQ2hlY2t0aGlzbG9naW5hbG9naW4oKTs%2BPj47Oz47Pj47Pj47bDxCdXR0b24xOz4%2BdLCLxKcmSbg6mKxAn8cpqxq7ENo%3D&View=zh-cn&charset=gb2312&qu=&TextBox1='.$account.'&Textbox2='.$pass.'&Button1.x=24&Button1.y=8';
$req0 =
"POST /technet/alogin.aspx?id=down&tid=msft011306vxpm HTTP/1.1\n".
"Host: www.mswebcast.com.cn\n".
"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1\n".
"Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\n".
"Accept-Language: en-us,en;q=0.5\n".
"Accept-Encoding: gzip,deflate\n".
"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\n".
"Keep-Alive: 300\n".
"Connection: keep-alive\n".
"Referer: http://www.mswebcast.com.cn/tech ... ;tid=msft011306vxpm\n".
"Content-Type: application/x-www-form-urlencoded\n".
"Content-Length: ".length($cookie)."\n\n".

$cookie."HTTP/1.1 302 Found";

print "\n";

@tts=sendraw($req0);
$content=@tts;
foreach(@tts){
        $content=$content.$_;
}
$content=~/(ASP.NET_SessionId=.+);/;
$cookie=$1;
#print "Get cookie $cookie \n";

####################################
#
#   ËùÓÐÐèÒªÏÂÔØµÄÁбí,ÏÂÔØ±àºÅºÍÄÚÈÝÃû³Æ
#
####################################

my $req = HTTP::Request->new('GET' => $list_url);
my $res = $ua->request($req);
$content=$res->as_string;  

#$filter='href="http://www.mswebcast.com.cn/technet/alogin.aspx?id=down&tid=(*.)" target="_blank">(.*)</a>';
#" target="_blank">

#·&Ouml;&cedil;&icirc;
@con_list = split(/tid=/, $content);
foreach (@con_list) {
        if($_=~/([^".]+).+_blank">([^\/.]+)<\/a>/){
                $file_url=$1;
                #print $file_url."\n";
                $name=$2;
                #&sup3;&yacute;&Egrave;&yen;&para;à&Oacute;à&micro;&Auml;&iquest;&Otilde;&cedil;&ntilde;;
                $name=~s/^\s+//;
                $name=~s/\s+$//;
                #print $name."\n";
                #·&Aring;&Egrave;&euml;hash&Ouml;&ETH;
                $all_list{$file_url}=$name;

        }
}
while ( ($k,$v) = each %all_list ) {
    #print "$k => $v\n";
        $request = (POST   'http://www.mswebcast.com.cn/technet/dload.aspx?id='.$k,

                        Host  => 'www.mswebcast.com.cn',
                        cookie => $cookie,
                        Connection => 'Keep-Alive',
        );
        $response = $ua->request($request);
        $content=$response->content;
        $content=~m/(http:\/\/download.microsoft.com\/.+zip)">http/;
        $file_url=$1;
        print "mkdir \"$base_dir\\$v\"\n";
        print "wget $file_url -O \"$base_dir\\$v\\$k.zip\"\n";

}






#&ordm;&Uuml;&Ocirc;&shy;&Ecirc;&frac14;&micro;&Auml;·&cent;&Euml;&Iacute;quest&sup3;&Igrave;&ETH;ò
sub sendraw {
    my ($req) = @_;
    my $target;

    $target = inet_aton($host) || die("inet_aton problems\n");

    socket(S,PF_INET,SOCK_STREAM,getprotobyname('tcp')||0) || die("Socket problems\n");
    if(connect(S,pack "SnA4x8",2,$port,$target)){
        select(S);
                $| = 1;
        print $req;
            my @res = <S>;
        select(STDOUT);
                close(S);
        return @res;
    }
    else {
                die("Can't connect...\n");
    }
}
作者: forrest.w    时间: 2006-02-09 13:27
强啊

我以前都是手工倒到flashget里面,然后晚上定时下载的。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2