من الأسهل أن نفهم بمثال. على سبيل المثال، أريد تنزيل الفيديو http://v.youku.com/v_show/id_XNDM2Mjc0MzAw.html. ما نريد الحصول عليه هنا هو معرف الفيديو، وهو جزء XNDM2Mjc0MzAw وهذا فريد بالنسبة للفيديو، لذلك سيتم استخدامه بالتأكيد عند التحليل.
من أجل رؤية عملية تشغيل مقاطع فيديو Youku بوضوح، يمكنك استخدام برنامج Firefox الإضافي لتتبع صفحة الويب، كما هو موضح أدناه.
يمكنك أن ترى أن هناك العديد من GETs، ما نبحث عنه يجب أن يكون GET مع هذا المعرف كمعلمة
http://v.youku.com/player/getPlayList/VideoIDS/XNDM2Mjc0MzAw/timezone/+08/version/5/source/video?ran=3545&password=&n=3
هذا هو GET الخاص بـ youku للحصول على قائمة التشغيل وفتح استجابتها. هذا هو المحتوى الذي نحتاجه هو البذور وملفات التدفق والمقاطع. تحتوي Segs على مفتاح تجزئة الفيديو، أما ملفات التدفق فهي عبارة عن سلسلة من الأحرف المشوشة، ويجب فك تشفيرها باستخدام البذور. لقد اعترضت أدناه جزءًا من أداة التنزيل لتوضيح عملية فك التشفير. يتم استخدام json-lib-2.4-jdk15 لتحليل json.
انسخ رمز الكود كما يلي:
List<Video> videos = new ArrayList<Video>();
بيانات JSONObject؛
//json هو الرد الذي تم الحصول عليه للتو، والنوع هو سلسلة.
data = JSONObject.fromObject(json).getJSONArray("data").getJSONObject(0);
doubleseed = Double.valueOf(data.getString("seed"));
عنوان السلسلة = data.getString("title");
String fileid = data.getJSONObject("streamfileids").getString("flv");// إذا كنت تريد التنزيل بتنسيق mp4
String realFileid = getFileID(fileid,seed); // تغيير flv إلى mp4 (شريطة وجود هذه العقدة)
String fileid1 = realFileid.substring(0, 8);// ينقسم المعرف الذي تم فك ترميزه إلى جزأين، ويجب إدراج مقطع الفيديو في المنتصف
String fileid2 = realFileid.substring(10);
JSONArray segs = data.getJSONObject("segs").getJSONArray("flv");// التحليل الجزئي للقطع
for (Iterator iterator = segs.iterator(); iterator.hasNext();) {
كائن JSONObject = (JSONObject) iterator.next();
int order = object.getInt("no");
حجم السلسلة = object.getString("الحجم");
int ثواني = object.getInt("ثواني");
مفتاح السلسلة = object.getString("k");
String no = String.format("%1$02x", order);
سلسلة youUrl = "http://f.youku.com/player/getFlvPath/sid/" + "00_"
+ no + "/st/flv/fileid/" + fileid1 + no + fileid2 + "?K="
+ مفتاح؛
videos.add(new Video(order, Seconds, youUrl, size, key, title));
}
youUrl هو عنوان الفيديو الذي نريده، على سبيل المثال، الفقرة الأولى من الفيديو أعلاه هي:
http://f.youku.com/player/getFlvPath/sid/134434081131213125530_00/st/flv/fileid/030001 090050201D77EDBC04650AC2DD6027D5-ED5F-27F6-8E73-DEF478121887&K=b499f3d5df944cfc2827e2ec
يتم إنشاء الألوان الزرقاء بشكل عشوائي ويمكن استبدالها بالرقم 00.
يشير flv إلى تنسيق الفيديو الذي سيتم تنزيله، ويمكنك أيضًا اختيار mp4، إذا كان ذلك متاحًا.
الرقمان الأصفران هما رموز مقطعية، سداسي عشري، على سبيل المثال، المقطع الأول هو 00، والجزء الثاني هو 01، والجزء الخامس عشر هو 0f.
ما يلي هو fileid، الذي يجب اختراقه من خلال ملفات البذور والملفات المتدفقة، وهو نفسه بالنسبة لكل مقطع فيديو.
يتم الحصول على آخر K في مقاطع، ولا داعي للكسر، كل فيديو مختلف.
وظيفتا فك التشفير هما:
انسخ رمز الكود كما يلي:
سلسلة خاصة getFileID (سلسلة ملف، بذرة مزدوجة) {
String mix = getFileIDMixString(seed);
String[] ids = fileid.split("//*");
StringBuilder realId = new StringBuilder();
إنت إدكس؛
لـ (int i = 0; i < ids.length; i++) {
idx = Integer.parseInt(ids[i]);
realId.append(mixed.charAt(idx));
}
إرجاع realId.toString();
}
سلسلة خاصة getFileIDMixString (بذرة مزدوجة) {
StringBuilder mix = new StringBuilder();
مصدر StringBuilder = StringBuilder الجديد (
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ///:._-1234567890");
مؤشر int، len = source. length();
لـ (int i = 0; i < len; ++i) {
البذور = (البذور * 211 + 30031) % 65536؛
الفهرس = (int) Math.floor(seed / 65536 * source.length());
mix.append(source.charAt(index));
source.deleteCharAt(index);
}
إرجاع mix.toString();
}
سيحصل الكود أخيرًا على قائمة بنوع الفيديو، والترتيب في الفيديو هو رقم الفيديو، والثواني هي طول الوقت، والحجم هو طول البايت، وyouUrl هو عنوان الفيديو الحقيقي، وعنوان الفيديو. هناك بعض المحتويات الأخرى التي يمكن الحصول عليها من json.