JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java SE 討論區 » 網路程式設計  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
作者 寫一個youtube影片下載的程式
gogo1218





發文: 6
積分: 0
於 2009-05-20 14:34 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
大家好!小弟想要用java se寫一個youtube影片下載程式
先說明:
youtube影片下載網址就是:
http://www.youtube.com/get_video?video_id=帳號&t=驗證碼
原則上我再寫這個程式時.碰到的問題就是驗證碼.因為驗證碼.用java所抓到的youtube會判斷.所以驗證碼所抓下來的都是假的.所以我目前卡住了.想請教有寫過這種程式的大大.是否能給點方向或者是可參考的範例.謝謝
程式碼如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import java.io.*;
import java.net.*;
public class happy{
  public static void main(String args[])throws IOException{
    System.out.print("網頁:");
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    String str=br.readLine();
    FileWriter fwriter;
try{
    URL url = new URL(str);
         Socket socket = new Socket(url.getHost(), 80);  // 2.
         InputStreamReader isr = new InputStreamReader(socket.getInputStream());// 2.
         BufferedReader in = new BufferedReader(isr);
         OutputStreamWriter osw = new OutputStreamWriter(socket.getOutputStream());
         PrintWriter out = new PrintWriter(osw, true);
         // 送出GET指令
         out.println("GET " + url.getFile());  // 3.
         in.readLine();  // 讀取GET指令的回應
         in.readLine();
         in.readLine();
         String line = null;
// 讀取檔案
    fwriter = new FileWriter("temp.txt");
    while((line = in.readLine()) != null){fwriter.write(line + "\n");}
    fwriter.close();   
    socket.close();
   }catch ( Exception e ){System.out.print("檔案瀏覽錯誤!"); }
 
    FileReader fr=new FileReader("temp.txt");
//temp.txt 搜尋 &t= 後面的驗證碼放到b陣列
    char[] a= new char[3]; //比對陣列
    char[] start={38,116,61}; //&t=
    int ch;
    int i=0;
    char[] b= new char[47];
    int j=0;
    while ((ch=fr.read())!=-1){
       if(i==0){
             if ((ch=fr.read())==start[0]){a[0]=(char)ch;i++;}
         }
       if(i==1){
              if ((ch=fr.read())==start[1]){a[1]=(char)ch;i++;}
        else{i=0;}
         }
       if(i==2){
              if ((ch=fr.read())==start[2]){a[2]=(char)ch;i++;}
        else{i=0;}
         }
       if(i==3&&ch!=38&&ch!=61){b[j]=(char)ch; j++;}//會多個61[=]
         else if(ch==38){break;}
             }
    if(a[0]==start[0]&&a[1]==start[1]&&a[2]==start[2])
        {String ll = new String(b);  //驗證碼
               String kk = new String(a);  //&t=            
        fr.close();
 
    
    
    String bb=str.substring(31); //抓帳號
    String aa="http://www.youtube.com/get_video?video_id="; //輸出字串
 
    System.out.println(aa+bb+kk+ll);  
  
 try {URL  url = null;
   try {url = new URL(aa+bb+kk+ll);
       }catch(Exception e) {System.out.println("URL ERROR");}
 
   FilterInputStream in=(FilterInputStream) url.openStream();
   FileOutputStream out=new FileOutputStream("move.flv");
   byte[] bytes=new byte[1024];
   int c;
   while((c=in.read(bytes))!=-1) {out.write(bytes,0,c);}
   in.close();
   out.close();
      } catch(Exception e) { System.out.println("Error!");}
 
}
}
}
 


gogo1218 edited on 2009-05-20 14:39
reply to postreply to post
作者 Re:寫一個youtube影片下載的程式 [Re:gogo1218]
gogo1218





發文: 6
積分: 0
於 2009-05-20 19:04 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
補充:之後找到的網站
顯然上面的方法不行
http://blog.ben.idv.tw/2007/12/flash-youtube.html

不過文中提到的SERVER技術
http://blog.ben.idv.tw/2007/12/flash-youtube-part-2.html
有一線希望.不過他的語法MovieClipLoader和onLoadStart 事件在JAVA SE6 該如何去實作呢?


reply to postreply to post
作者 Re:寫一個youtube影片下載的程式 [Re:gogo1218]
Duncan

還隱隱作痛

版主

發文: 7814
積分: 39
於 2009-05-20 20:17 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
gogo1218 wrote:
補充:之後找到的網站
顯然上面的方法不行
http://blog.ben.idv.tw/2007/12/flash-youtube.html

不過文中提到的SERVER技術
http://blog.ben.idv.tw/2007/12/flash-youtube-part-2.html
有一線希望.不過他的語法MovieClipLoader和onLoadStart 事件在JAVA SE6 該如何去實作呢?


他描述要做的事情不一定要使用 server site 程式來做(使用 server site 程式應該也沒有比較簡單)。

你使用 HttpURLConnection 連接 http://www.youtube.com/v/bttuWxdLCGY,你可以從 response header 裡得到 redirect 網址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.List;
import java.util.Map;
 
public class GetRedirectAddress {
  public static void main(String[] args) throws MalformedURLException {
    String url = "http://www.youtube.com/v/bttuWxdLCGY";
    if (args.length > 0)
      url = args[0];
    
    URL u = new URL(url);
    HttpURLConnection conn = null;
    HttpURLConnection.setFollowRedirects(false);
    
    try {
      conn = (HttpURLConnection) u.openConnection();
      System.out.println("Response Code: " + conn.getResponseCode());
      String loc = conn.getHeaderField("Location");
      if (loc != null)
        System.out.println("Redirect: " + URLDecoder.decode(loc, "UTF-8"));
      
      System.out.println();
      System.out.println("************** Response Headers **************");
      Map<String, List<String>> headers = conn.getHeaderFields();
      for (String key : headers.keySet()) {
        System.out.printf("[%s] %s%n", key, headers.get(key));
      }
    }
    catch (IOException e) {
      e.printStackTrace();
    }
    finally {
      if (conn != null)
        conn.disconnect();
    }
  }
}


Duncan edited on 2009-05-20 20:32
reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:寫一個youtube影片下載的程式 [Re:gogo1218]
UndeadJ

UX & UI Design



發文: 384
積分: 3
於 2009-05-20 22:39 user profilesend a private message to usersend email to UndeadJreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
你先說你是怎麼取得你所謂的驗證碼的

reply to postreply to post
我們是懷抱各自的夢想,買了車票的乘客,不過就像列車一定會有終點,人生有時會碰到必須換車的時候...

我們站在名為「今天」的車站,在名為「昨天」的列車下車,轉搭為「明天」的列車

不過,若沒及時搭上的話....
作者 Re:寫一個youtube影片下載的程式 [Re:UndeadJ]
gogo1218





發文: 6
積分: 0
於 2009-05-21 17:22 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
UndeadJ wrote:
你先說你是怎麼取得你所謂的驗證碼的

請參考
http://only79220.world.edoors.com/CjQKyhIBbUVk
問題卡在於如何取得 &t= 後面的驗證碼
我使用我程式碼去把HTML的原始碼下載寫入一個文字檔.但是所下載回來的驗證碼是假的.目前要解決的部分在此


reply to postreply to post
作者 Re:寫一個youtube影片下載的程式 [Re:Duncan]
gogo1218





發文: 6
積分: 0
於 2009-05-21 17:43 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Duncan wrote:
他描述要做的事情不一定要使用 server site 程式來做(使用 server site 程式應該也沒有比較簡單)。

你使用 HttpURLConnection 連接 http://www.youtube.com/v/bttuWxdLCGY,你可以從 response header 裡得到 redirect 網址。

程式恕刪..


你的寫法看起來跟這個網站的寫法有些相似.但我程度不高.所以看不太懂
http://kej.tw/flvretriever/

請統一用這個影片網站來做範例好了!
http://www.youtube.com/watch?v=vJL2-WSow4c&feature=fvhl
我在執行你的程式得到結果

Response Code: 303
Redirect: http://www.youtube.com/swf/l.swf?swf=http://s.ytimg.com/yt/swf/cps-vfl
98307.swf&video_id=vJL2-WSow4c&rel=1&eurl=&iurl=http://i3.ytimg.com/vi/vJL2-WSow
4c/hqdefault.jpg&sk=Zrmesa_xW78Vyra0iFORu-T1PwGr74uFC&fexp=20287,901707&feature=
fvhl&cr=US&avg_rating=4.63655965501&length_seconds=107&allow_ratings=1&allow_emb
ed=1&title=Msn Remix

************** Response Headers **************
[null] [HTTP/1.1 303 See Other]
[Expires] [Tue, 27 Apr 1971 19:44:06 EST]
[Location] [http://www.youtube.com/swf/l.swf?swf=http%3A//s.ytimg.com/yt/swf/cps
-vfl98307.swf&video_id=vJL2-WSow4c&rel=1&eurl=&iurl=http%3A//i3.ytimg.com/vi/vJL
2-WSow4c/hqdefault.jpg&sk=Zrmesa_xW78Vyra0iFORu-T1PwGr74uFC&fexp=20287%2C901707&
feature=fvhl&cr=US&avg_rating=4.63655965501&length_seconds=107&allow_ratings=1&a
llow_embed=1&title=Msn%20Remix]
[Set-Cookie] [VISITOR_INFO1_LIVE=1bB63R9npqc; path=/; domain=.youtube.com; expir
es=Sat, 16-Jan-2010 09:54:38 GMT, VISITOR_INFO1_LIVE=1bB63R9npqc; path=/; domain
=.youtube.com; expires=Sat, 16-Jan-2010 09:54:38 GMT]
[Connection] [Keep-Alive]
[Server] [Apache]
[Cache-Control] [no-cache]
[X-Content-Type-Options] [nosniff]
[Transfer-Encoding] [chunked]
[X-YouTube-MID] [WkFSZzctYUFHdmdReGs2OHRpRzFqSDU1NzA1dTl0Vkcza1NjRjVuenZwczRiWUl
2M1E1eHdR]
[Date] [Thu, 21 May 2009 09:54:38 GMT]
[Keep-Alive] [timeout=300]
[Content-Type] [text/plain]

我看不太出來驗證碼是哪一段?
而且邦邦部落格和GooTube FLV Retriever
如果同一個影片位置來說.兩個得出來的下載位置看起來是不一樣的..越看越模糊了
不好意思.麻煩你了

PS:邦邦部落格在導到另一個網址時就可以得到&t後面那一串驗證碼.


gogo1218 edited on 2009-05-21 18:00
reply to postreply to post
作者 Re:寫一個youtube影片下載的程式 [Re:gogo1218]
Duncan

還隱隱作痛

版主

發文: 7814
積分: 39
於 2009-05-21 18:13 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
gogo1218 wrote:
你的寫法看起來跟這個網站的寫法有些相似.但我程度不高.所以看不太懂
http://kej.tw/flvretriever/

請統一用這個影片網站來做範例好了!
http://www.youtube.com/watch?v=vJL2-WSow4c&feature=fvhl
我在執行你的程式得到結果

Response Code: 303
Redirect: http://www.youtube.com/swf/l.swf?swf=http://s.ytimg.com/yt/swf/cps-vfl
98307.swf&video_id=vJL2-WSow4c&rel=1&eurl=&iurl=http://i3.ytimg.com/vi/vJL2-WSow
4c/hqdefault.jpg&sk=Zrmesa_xW78Vyra0iFORu-T1PwGr74uFC&fexp=20287,901707&feature=
fvhl&cr=US&avg_rating=4.63655965501&length_seconds=107&allow_ratings=1&allow_emb
ed=1&title=Msn Remix

************** Response Headers **************
[null] [HTTP/1.1 303 See Other]
[Expires] [Tue, 27 Apr 1971 19:44:06 EST]
[Location] [http://www.youtube.com/swf/l.swf?swf=http%3A//s.ytimg.com/yt/swf/cps
-vfl98307.swf&video_id=vJL2-WSow4c&rel=1&eurl=&iurl=http%3A//i3.ytimg.com/vi/vJL
2-WSow4c/hqdefault.jpg&sk=Zrmesa_xW78Vyra0iFORu-T1PwGr74uFC&fexp=20287%2C901707&
feature=fvhl&cr=US&avg_rating=4.63655965501&length_seconds=107&allow_ratings=1&a
llow_embed=1&title=Msn%20Remix]
[Set-Cookie] [VISITOR_INFO1_LIVE=1bB63R9npqc; path=/; domain=.youtube.com; expir
es=Sat, 16-Jan-2010 09:54:38 GMT, VISITOR_INFO1_LIVE=1bB63R9npqc; path=/; domain
=.youtube.com; expires=Sat, 16-Jan-2010 09:54:38 GMT]
[Connection] [Keep-Alive]
[Server] [Apache]
[Cache-Control] [no-cache]
[X-Content-Type-Options] [nosniff]
[Transfer-Encoding] [chunked]
[X-YouTube-MID] [WkFSZzctYUFHdmdReGs2OHRpRzFqSDU1NzA1dTl0Vkcza1NjRjVuenZwczRiWUl
2M1E1eHdR]
[Date] [Thu, 21 May 2009 09:54:38 GMT]
[Keep-Alive] [timeout=300]
[Content-Type] [text/plain]

我看不太出來驗證碼是哪一段?
而且邦邦部落格和GooTube FLV Retriever
如果同一個影片位置來說.兩個得出來的下載位置看起來是不一樣的..越看越模糊了
不好意思.麻煩你了

PS:邦邦部落格在導到另一個網址時就可以得到&t後面那一串驗證碼.


如果你提供的說明網頁的資訊是正確的,那麼驗證碼應該會出現在 redirect 網址裡:
1
2
3
4
5
http://www.youtube.com/swf/l.swf?swf=http://s.ytimg.com/yt/swf/cps-vfl
98307.swf&video_id=vJL2-WSow4c&rel=1&eurl=&iurl=http://i3.ytimg.com/vi/vJL2-WSow
4c/hqdefault.jpg&sk=Zrmesa_xW78Vyra0iFORu-T1PwGr74uFC&fexp=20287,901707&feature=
fvhl&cr=US&avg_rating=4.63655965501&length_seconds=107&allow_ratings=1&allow_emb
ed=1&title=Msn Remix


請你先自行驗證一下你找到的資訊正不正確(有可能你看的文件是蠻久以前寫的,與現在 youtube 的現行作法已不同)。
如果你可以找到一個方法取得影片檔的 URL,再來討論怎麼用程式去下載(包括取得 URL 的手續)。

我稍微看過,你之前提供的兩篇文章提供的資訊似乎都不合時宜了,像 http://www.youtube.com/watch?v=vJL2-WSow4c&feature=fvhl 頁面裡似乎沒有文內所說的長度為 32 的驗證碼。

如果你其實只是想要抓 youtube 上的影音內容,你可以考慮使用現成的軟體來抓,比如 JDownloader,別人已經寫好針對許多網站的解碼獲取重要 content 的網址的功能。


Duncan edited on 2009-05-21 18:19
reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:寫一個youtube影片下載的程式 [Re:gogo1218]
UndeadJ

UX & UI Design



發文: 384
積分: 3
於 2009-05-21 23:36 user profilesend a private message to usersend email to UndeadJreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
gogo1218 wrote:
請參考
http://only79220.world.edoors.com/CjQKyhIBbUVk
問題卡在於如何取得 &t= 後面的驗證碼
我使用我程式碼去把HTML的原始碼下載寫入一個文字檔.但是所下載回來的驗證碼是假的.目前要解決的部分在此

我可能沒說清楚,我是要問你【你的分析方法】是如何做的(如何去分析網頁得到驗證碼),我想應該是這邊出錯,不然基本上是不會有問題的


reply to postreply to post
我們是懷抱各自的夢想,買了車票的乘客,不過就像列車一定會有終點,人生有時會碰到必須換車的時候...

我們站在名為「今天」的車站,在名為「昨天」的列車下車,轉搭為「明天」的列車

不過,若沒及時搭上的話....
作者 Re:寫一個youtube影片下載的程式 [Re:gogo1218]
UndeadJ

UX & UI Design



發文: 384
積分: 3
於 2009-05-21 23:56 user profilesend a private message to usersend email to UndeadJreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
gogo1218 wrote:
補充:之後找到的網站
顯然上面的方法不行
http://blog.ben.idv.tw/2007/12/flash-youtube.html

不過文中提到的SERVER技術
http://blog.ben.idv.tw/2007/12/flash-youtube-part-2.html
有一線希望.不過他的語法MovieClipLoader和onLoadStart 事件在JAVA SE6 該如何去實作呢?


沒有不行,是你分析t的過程出錯

第二個網頁的onLoadStart就是說明它是如何做到的,onloadStart是解析原Youtube的網址變成可以下載的網址

你只要把分析做對就是了,不用去管什麼MovieClipLoader和onLoadStart,另外網頁分析在JAVA SE6可以做的方法很多


reply to postreply to post
我們是懷抱各自的夢想,買了車票的乘客,不過就像列車一定會有終點,人生有時會碰到必須換車的時候...

我們站在名為「今天」的車站,在名為「昨天」的列車下車,轉搭為「明天」的列車

不過,若沒及時搭上的話....
作者 Re:寫一個youtube影片下載的程式 [Re:Duncan]
UndeadJ

UX & UI Design



發文: 384
積分: 3
於 2009-05-22 00:15 user profilesend a private message to usersend email to UndeadJreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Duncan wrote:
如果你提供的說明網頁的資訊是正確的,那麼驗證碼應該會出現在 redirect 網址裡:
1
2
3
4
5
http://www.youtube.com/swf/l.swf?swf=http://s.ytimg.com/yt/swf/cps-vfl
98307.swf&video_id=vJL2-WSow4c&rel=1&eurl=&iurl=http://i3.ytimg.com/vi/vJL2-WSow
4c/hqdefault.jpg&sk=Zrmesa_xW78Vyra0iFORu-T1PwGr74uFC&fexp=20287,901707&feature=
fvhl&cr=US&avg_rating=4.63655965501&length_seconds=107&allow_ratings=1&allow_emb
ed=1&title=Msn Remix


Duncan,我試了一下,裡面沒有包含所謂的驗證碼
它只顯示出可以直接觀看.swf檔的路徑,但這個直接downloa的話是不行的


reply to postreply to post
我們是懷抱各自的夢想,買了車票的乘客,不過就像列車一定會有終點,人生有時會碰到必須換車的時候...

我們站在名為「今天」的車站,在名為「昨天」的列車下車,轉搭為「明天」的列車

不過,若沒及時搭上的話....
作者 Re:寫一個youtube影片下載的程式 [Re:UndeadJ]
gogo1218





發文: 6
積分: 0
於 2009-05-23 12:42 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
UndeadJ wrote:
沒有不行,是你分析t的過程出錯

第二個網頁的onLoadStart就是說明它是如何做到的,onloadStart是解析原Youtube的網址變成可以下載的網址

你只要把分析做對就是了,不用去管什麼MovieClipLoader和onLoadStart,另外網頁分析在JAVA SE6可以做的方法很多


恩~謝謝大大.的確問題在我分析T的地方出錯.上面的抓的網頁原始碼.都是錯誤的
我已經把程式給寫出來了.不過有些問題請教.像是版主的程式碼寫法.他可以實做在哪裡呢?


reply to postreply to post
作者 Re:寫一個youtube影片下載的程式 [Re:UndeadJ]
gogo1218





發文: 6
積分: 0
於 2009-05-23 12:44 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
UndeadJ wrote:
沒有不行,是你分析t的過程出錯

第二個網頁的onLoadStart就是說明它是如何做到的,onloadStart是解析原Youtube的網址變成可以下載的網址

你只要把分析做對就是了,不用去管什麼MovieClipLoader和onLoadStart,另外網頁分析在JAVA SE6可以做的方法很多


恩~謝謝大大.的確問題在我分析T的地方出錯.之前寫法.在抓的網頁原始碼都是錯誤的.>.<
我已經把程式給寫出來了.不過有些問題請教.像是版主的程式碼寫法.他可以實做在哪裡呢?


reply to postreply to post
» JWorld@TW »  Java SE 討論區 » 網路程式設計

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8