你的分享就是我们的动力 ---﹥

解析优酷地址获取视频真实地址

时间:2013-05-22 14:55来源:www.chengxuyuans.com 点击:

代码简介

解析优酷视频页,得到视频真实地址,可以下载,网上的看到的源码,修改了下,能得到结果

代码片段

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;
		}

	}
}

转载注明地址http://www.chengxuyuans.com/code/java/61597.html