2016-03-29 15 views
1

http://www.audiodump.com/からmp3をダウンロードしようとしています。サイトには多くのリダイレクトがあります。しかし、私はそれの一部を稼働させることを管理しました。 これは、DLリンク、タイトル、mp3期間などのすべての情報を取得するための私の方法です。リダイレクトURLからファイルをダウンロードする

private void _InetGetHTMLSearch(string sArtist) 
{ 
    if(_AudioDumpQuery == string.Empty) 
    { 
     //return string.Empty; 
    } 
    string[] sStringArray; 
    string sResearchURL = "http://www.audiodump.biz/music.html?" + _AudioDumpQuery + sArtist.Replace(" ", "+"); 
    string aRet; 
    HttpWebRequest webReq = (HttpWebRequest)HttpWebRequest.Create(sResearchURL); 
    webReq.Referer = "http://www.audiodump.com/"; 
    try 
    { 
     webReq.CookieContainer = new CookieContainer(); 
     webReq.Method = "GET"; 
     using (WebResponse response = webReq.GetResponse()) 
     { 
      using (Stream stream = response.GetResponseStream()) 
      { 
       StreamReader reader = new StreamReader(stream); 
       aRet = reader.ReadToEnd(); 
       //Console.WriteLine(aRet); 
       string[] aTable = _StringBetween(aRet, "<BR><table", "table><BR>", RegexOptions.Singleline); 
       if (aTable != null) 
       { 
        string[] aInfos = _StringBetween(aTable[0], ". <a href=\"", "<a href=\""); 
        if (aInfos != null) 
        { 
         for(int i = 0; i < aInfos.Length; i++) 
         { 
          aInfos[i] = aInfos[i].Replace("\">", "*"); 
          aInfos[i] = aInfos[i].Replace("</a> (", "*"); 
          aInfos[i] = aInfos[i].Remove(aInfos[i].Length - 2); 

          sStringArray = aInfos[i].Split('*'); 

          aLinks.Add(sStringArray[0]); 
          aTitles.Add(sStringArray[1]); 

          sStringArray[2] = sStringArray[2].Replace("`", "'"); 
          sStringArray[2] = sStringArray[2].Replace("dont", "don't"); 
          sStringArray[2] = sStringArray[2].Replace("lets", "let's"); 
          sStringArray[2] = sStringArray[2].Replace("cant", "can't"); 
          sStringArray[2] = sStringArray[2].Replace("shes", "she's"); 
          sStringArray[2] = sStringArray[2].Replace("aint", "ain't"); 
          sStringArray[2] = sStringArray[2].Replace("didnt", "didn't"); 
          sStringArray[2] = sStringArray[2].Replace("im", "i'm"); 
          sStringArray[2] = sStringArray[2].Replace("youre", "you're"); 
          sStringArray[2] = sStringArray[2].Replace("ive", "i've"); 
          sStringArray[2] = sStringArray[2].Replace("youll", "you'll"); 
          sStringArray[2] = sStringArray[2].Replace("&#39;", "'"); 
          sStringArray[2] = sStringArray[2].Replace("'", "simplequotes"); 
          sStringArray[2] = sStringArray[2].Replace("vk.com", ""); 
          sStringArray[2] = _StringReplaceCyrillicChars(sStringArray[2]); 
          sStringArray[2] = Regex.Replace(sStringArray[2], @"<[^>]+>|&nbsp;", "").Trim(); 
          sStringArray[2] = Regex.Replace(sStringArray[2], @"\s{2,}", " "); 
          sStringArray[2] = sStringArray[2].TrimStart('\''); 
          sStringArray[2] = sStringArray[2].TrimStart('-'); 
          sStringArray[2] = sStringArray[2].TrimEnd('-'); 
          sStringArray[2] = sStringArray[2].Replace("- -", "-"); 
          sStringArray[2] = sStringArray[2].Replace("http", ""); 
          sStringArray[2] = sStringArray[2].Replace("www", ""); 
          sStringArray[2] = sStringArray[2].Replace("mp3", ""); 
          sStringArray[2] = sStringArray[2].Replace("simplequotes", "'"); 

          aDurations.Add(sStringArray[2]); 
         } 
        } 
        else 
        { 
         //Console.WriteLine("Debug"); 
        } 
       } 
       else 
       { 
        //Console.WriteLine("Debug 2"); 
       } 

       //return aRet; 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     //return null; 
     ////Console.WriteLine("Debug message: " + ex.Message); 
    } 
} 

私は単に私が、私はそれが働いて得ることができないmp3をダウンロードしたい場合しかし、リダイレクトwebReq.Referer = "http://www.audiodump.com/"; から検索することを防止するためにリファラを追加する必要がありました。 URLは正しいものであり、プログラムではなく手動でダウンロードしたときに得られるものでチェックされます。 これは私のmp3ダウンロード一部です:

private void _DoDownload(string dArtist, ref string dPath) 
{ 
    if (!Contain && skip <= 3 && !Downloading) 
    { 
     Random rnd = new Random(); 
     int Link = rnd.Next(5); 
     _InetGetHTMLSearch(dArtist); 
     Console.WriteLine("--------------------------------> " + aLinks[0]); 
     string path = mp3Path + "\\" + dArtist + ".mp3"; 
     if (DownloadOne(aLinks[Link], path, false)) 
     { 
      hTimmer.Start(); 
      Downloading = true; 
     } 
    } 
    else if (Downloading) 
    { 
     int actualBytes = strm.Read(barr, 0, arrSize); 
     fs.Write(barr, 0, actualBytes); 
     bytesCounter += actualBytes; 
     double percent = 0d; 
     if (fileLength > 0) 
      percent = 
       100.0d * bytesCounter/
       (preloadedLength + fileLength); 
     label1.Text = Math.Round(percent).ToString() + "%"; 
     if (Math.Round(percent) >= 100) 
     { 
      string path = mp3Path + "\\" + dArtist + ".mp3"; 
      label1.Text = ""; 
      dPath = path; 
      aLinks.Clear(); 
      hTimmer.Stop(); 
      hTimmer.Reset(); 
      fs.Flush(); 
      fs.Close(); 
      lastArtistName = "N/A"; 
      Downloading = false; 
     } 
     if (Math.Round(percent) <= 1) 
     { 
      if (hTimmer.ElapsedMilliseconds >= 3000) 
      { 
       string path = mp3Path + "\\" + dArtist + ".mp3"; 
       hTimmer.Stop(); 
       hTimmer.Reset(); 
       fs.Flush(); 
       fs.Close(); 
       File.Delete(path); 
       Contain = false; 
       skip += 1; 
       Downloading = false; 
      } 
     } 
    } 
} 

private static string ConvertUrlToFileName(string url) 
{ 
    string[] terms = url.Split(
     new string[] { ":", "//" }, 
     StringSplitOptions.RemoveEmptyEntries); 
    string fname = terms[terms.Length - 1]; 
    fname = fname.Replace('/', '.'); 
    return fname; 
} //ConvertUrlToFileName 

private static long GetExistingFileLength(string filename) 
{ 
    if (!File.Exists(filename)) return 0; 
    FileInfo info = new FileInfo(filename); 
    return info.Length; 
} //GetExistingFileLength 

private static bool DownloadOne(string url, string existingFilename, bool quiet) 
{ 
    ServicePointManager.DefaultConnectionLimit = 20; 
    HttpWebRequest webRequest; 
    HttpWebResponse webResponse; 
    IWebProxy proxy = null; //SA??? 
          //fmt = CreateFormat(
          //"{0}: {1:#} of {2:#} ({3:g3}%)", "#"); 
    try 
    { 
     fname = existingFilename; 
     if (fname == null) 
      fname = ConvertUrlToFileName(url); 
     if (File.Exists(existingFilename)) 
     { 
      File.Delete(existingFilename); 
     } 
     webRequest = (HttpWebRequest)WebRequest.Create(url); 
     webRequest.UserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A"; 
     webRequest.Referer = "http://www.audiodump.com/"; 
     preloadedLength = GetExistingFileLength(fname); 
     if (preloadedLength > 0) 
      webRequest.AddRange((int)preloadedLength); 
     webRequest.Proxy = proxy; //SA??? or DefineProxy 
     webResponse = (HttpWebResponse)webRequest.GetResponse(); 
     fs = new FileStream(fname, FileMode.Append, FileAccess.Write); 
     fileLength = webResponse.ContentLength; 
     strm = webResponse.GetResponseStream(); 
     if (strm != null) 
     { 
      bytesCounter = preloadedLength; 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
    catch (Exception e) 
    { 
     //Console.WriteLine(
     //"{0}: {1} '{2}'", 
     // url, e.GetType().FullName, 
     //e.Message); 
     return false; 
    } 
    //exception 
} //DownloadOne 

250ミリ秒ごとに実行し、タイマーから実行される_DoDownload()方法。この方法は他のサイトでも完全に機能します。しかし、audiodumpは私にこれらのリダイレクションに苦労しています。

私はhttprequestで天才ではありません。私は検索の問題を解決したが、ダウンロードの部分は私を驚かせている。ダウンロードの問題を管理する方法に関するアドバイスはありますか?

+0

サイトでは、明らかにあなたがそれを掻き上げることは望ましくありません。尋ねる_「どうすれば傷つけることができるか」_は広すぎます。 **あなたは**問題を分離し、そこからあなたの研究をしなければなりません。 – CodeCaster

答えて

1

あなたはダウンロードリンクがあるページの参照先を設定する必要があります。たとえば、 "http://www.audiodump.biz"だけでなく、Referrerとしてファイルセットをダウンロードするときに、ページ "http://www.audiodump.biz/music.html?q=whatever"からのファイルへのリンクを取得しました。

+0

真剣に、それは単に私が行方不明だったダンプエラーでした。ありがとうございます。 – user2530266

関連する問題