java获取优酷视频真实地址

引入第三方包

  1. commons-lang.jar
  2. commons-beanutils.jar
  3. commons-collections.jar
  4. commons-logging.jar
  5. ezmorph.jar
  6. json-lib-2.2.2-jdk15.jar


 

import java.io.BufferedReader;
 import java.io.InputStreamReader;
 import java.net.URL;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
import net.sf.json.JSONArray;
 import net.sf.json.JSONException;
 import net.sf.json.JSONObject;
 
 
 public class VideoTools
 {
  public static void main(String[] args) throws Exception
  {
   VideoTools manager = new VideoTools();
   String jsonUrl = manager.getVideoUrl("http://v.youku.com/v_show/id_XMTgzNDA5OTMy.html");
   System.out.println(jsonUrl.split("#").length);
  }
  
  public String getVideoUrl(String htmlUrl) throws JSONException{
   //正则表达式解析地址,取id
   Pattern p = Pattern.compile(".*id_(\\w+)\\.html");
   String u = htmlUrl;
   Matcher m = p.matcher(u);
   String id = "";
   if (m.find()) {
    id = m.group(1);
   }
   System.out.println(id);
   
 //  String id="XMTgzNDA5OTMy";
   String s = getContent("http://v.youku.com/player/getPlayList/VideoIDS/"+id);
   JSONObject jsobj = new JSONObject();
   jsobj =jsobj.fromObject(s);
   JSONArray jsonarr = jsobj.getJSONArray("data");
   System.out.println(jsobj);
   JSONObject obj1 = jsonarr.getJSONObject(0);
   String title= obj1.getString("title");
   double seed = obj1.getDouble("seed");
   JSONObject obj2 = obj1.getJSONObject("streamfileids");
   String mp4id = null;
   String flvid = null;
   String format = null;
   try
   {
    mp4id = obj2.getString("mp4");
    format = "mp4";
   } catch (JSONException e)
   {
    System.out.println("没有MP4格式");
    try
    {
     flvid = obj2.getString("flv");
     format = "flv";
    } catch (JSONException e1)
    {
     System.out.println("没有FLV格式");
     return "";
    }
   }
   String realfileid = null;
   if (format.equals("mp4"))
   {
    realfileid = getFileID(mp4id, seed);
   } else
   {
    realfileid = getFileID(flvid, seed);
   }
   
   String idLeft = realfileid.substring(0, 8);
   String idRight = realfileid.substring(10);
  
   String sid = genSid();
   JSONObject obj3 = obj1.getJSONObject("segs");
   JSONArray mp4arr = obj3.getJSONArray(format);
   String VideoUrl="";
   for (int i = 0; i < mp4arr.size(); i++)
   {
    JSONObject o = mp4arr.getJSONObject(i);
    String k = o.getString("k");
    String url = "http://f.youku.com/player/getFlvPath/sid/" + sid + "_" + String.format("%1$02X", i) + "/st/" + format
      + "/fileid/" + idLeft + String.format("%1$02X", i) + idRight + "?K=" + k;
    System.out.println(url);
    VideoUrl+=url+"#";
   }
   return VideoUrl;
  }
  
  private static String getFileID(String fileid, double seed)
  {
   String mixed = getFileIDMixString(seed);
   String[] ids = fileid.split("\\*");
   StringBuilder realId = new StringBuilder();
   int idx;
   for (int i = 0; i < ids.length; i++)
   {
    idx = Integer.parseInt(ids[i]);
    realId.append(mixed.charAt(idx));
   }
   return realId.toString();
  }
  
  public static String genSid()
  {
   int i1 = (int) (1000 + Math.floor(Math.random() * 999));
   int i2 = (int) (1000 + Math.floor(Math.random() * 9000));
   return System.currentTimeMillis() + "" + i1 + "" + i2;
  }
  
  private static String getFileIDMixString(double seed)
  {
   StringBuilder mixed = new StringBuilder();
   StringBuilder source = new StringBuilder("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\\:._-1234567890");
   int index, len = source.length();
   for (int i = 0; i < len; ++i)
   {
    seed = (seed * 211 + 30031) % 65536;
    index = (int) Math.floor(seed / 65536 * source.length());
    mixed.append(source.charAt(index));
    source.deleteCharAt(index);
   }
   return mixed.toString();
  }
  
  public static String getContent(String strUrl) {
   try {
 
   URL url = new URL(strUrl);
    BufferedReader br = new BufferedReader(new InputStreamReader(
      url.openStream()));
    String s = "";
    StringBuffer sb = new StringBuffer("");
    while ((s = br.readLine()) != null) {
     sb.append(s);
    }
    br.close();
    return sb.toString();
   } catch (Exception e) {
    return "error open url:" + strUrl;
   }
 
 }
 }


 

你可能感兴趣的:(java获取优酷视频真实地址)