上一篇博客(这里)寻找视频地址的时候,有些细节没有弄很清楚,这两天继续弄,发现原来路径里边的sid是个随机生成数,不需要找它。对于k值,现在的是服务器直接返回来的,而里边也有通过返回的json里边的key1计算获得:

PlayListProxy.as文件里边:

param1.key1 = (Number("0x" + param2.key1) ^ Number("0xA55AA5A5")).toString(16);

而关键之处是就剩下了那个fileid,这是我从它的播放器里边找到的源码:

        private function parseMainData(param1:PlayListData, param2:Object) : void{var _loc_5:String = null;//临时变量var _loc_9:String = null;//临时变量var _loc_10:String = null;//flv\mp4分段视频信息var _loc_11:Object = null;//streamfileidsvar _loc_12:String = null;var _loc_13:Array = null;var _loc_14:RandomProxy = null;var _loc_15:Dictionary = null;//segs里边几种视频类型的数据var _loc_16:String = null;//视频类型var _loc_17:int = 0;//临时变量,长度计数用var _loc_18:String = null;var _loc_19:Array = null;//存放视频数据var _loc_20:String = null;var _loc_21:Object = null;//临时变量var _loc_22:VideoSegmentData = null;//视频数据:no,size.type,seconds,k值if (param1 == null || param2 == null){return;}param1.drm = param2.drm;param1.rtmp = param2.rtmp;param1.ct = param2.ct;param1.show = this.parseShowData(param2.show);param1.programList = this.parseProgramListData(param2.list, param2.list_pre, param2.list_next);param1.dvdinfo = this.parseDVDData(param2.dvd);param1.trial = this.pareseTrialData(param2.trial);param1.caption = this.parseCaptionData(param2.dvd);param1.threeD = this.parseThreeDData(param2.dvd);param1.tt = param2.tt;param1.ct = param2.ct;param1.cs = param2.cs;param1.logo = param2.logo;param1.seed = Number(param2.seed);param1.tags = param2.tags;param1.categories = param2.categories;param1.videoId = String(param2.videoid);param1.vidEncoded = param2.vidEncoded;param1.userName = param2.username;param1.userId = param2.userid;param1.title = unescape(param2.title);param1.key1 = (Number("0x" + param2.key1) ^ Number("0xA55AA5A5")).toString(16);param1.key2 = param2.key2;param1.seconds = Number(param2.seconds);if (param2.sourceVid != null){param1.sourceVid = Number(param2.sourceVid);}param1.streamFileIds = param2.streamfileids;param1.segs = param2.segs;param1.streamSizes = param2.streamsizes;param1.streamTypes = param2.streamtypes;param1.error = param2.error;param1.errorlink = param2.link;param1.up = param2.up;param1.down = param2.down;if (param2.lastpoint){param1.lastpoint = Number(param2.lastpoint);}param1.token = param2.ts ? (param2.ts) : ("");var _loc_3:* = new HashCash();param1.hashcash = _loc_3.getHashCash(param1.token + "o");param1.tokenup = param2.tsup ? (param2.tsup) : ("");param1.hashcashup = _loc_3.getHashCash(param1.tokenup);param1.currentLang = "";if (param1.dvdinfo && param1.dvdinfo.audioLangs.length > 1){_loc_17 = 0;while (_loc_17 < param1.dvdinfo.audioLangs.length){if (param1.vidEncoded == param1.dvdinfo.audioLangs[_loc_17].vid || param1.videoId == param1.dvdinfo.audioLangs[_loc_17].vid){param1.currentLang = param1.dvdinfo.audioLangs[_loc_17].lang;param1.currentLangID = param1.dvdinfo.audioLangs[_loc_17].langid;}_loc_17++;}}var _loc_4:Array = [];//视频类型for (_loc_5 in param2.streamfileids){if (!this.isValidType(_loc_5)){continue;}_loc_4.push(_loc_5);}param1.typeArr = _loc_4;this._playListData.fileType = _loc_4[0];if (_loc_4.length > 1){}var _loc_6:Number = 0;var _loc_7:* = Number.MAX_VALUE;var _loc_8:* = param2.segs;for (_loc_9 in _loc_8){if (_loc_9 == "flv" || _loc_9 == "mp4" || _loc_9 == "flvhd" || _loc_9 == "hd2" || _loc_9 == "hd3"){_loc_6 = 0;for (_loc_18 in _loc_8[_loc_9]){_loc_6 = _loc_6 + Number(_loc_8[_loc_9][_loc_18].seconds);}if (_loc_6 < _loc_7){_loc_7 = _loc_6;}}}param1.totalTime = _loc_7;_loc_10 = "";_loc_11 = param2.streamfileids;for (_loc_12 in _loc_11){if (_loc_12 == param1.fileType){_loc_10 = _loc_11[_loc_12];break;}}_loc_13 = [];_loc_14 = new RandomProxy(param1.seed);_loc_15 = new Dictionary();for (_loc_16 in param2.segs){if (!this.isValidType(_loc_16)){continue;}_loc_19 = [];//_loc_16   --   flv//_loc_16   --   mp4//_loc_20   --   0,1,2,3for (_loc_20 in param2.segs[_loc_16]){_loc_21 = param2.segs[_loc_16][_loc_20];_loc_22 = new VideoSegmentData();_loc_22.no = _loc_21.no;_loc_22.size = _loc_21.size;_loc_22.seconds = _loc_21.seconds;if (_loc_21.k){_loc_22.key = _loc_21.k;}//streamfileids , mp4/flv , i , RandomProxy(param1.seed)_loc_22.fileId = this.getFileId(_loc_11, _loc_16, int(_loc_20), _loc_14);_loc_22.type = _loc_16;_loc_19.push(_loc_22);}_loc_15[_loc_16] = _loc_19;}param1.videoSegmentsDic = _loc_15;param1.watermarks = param2.streamlogos;if (param2.hasOwnProperty("paike")){param1.paike = param2.paike as Boolean;}else{param1.paike = false;}if (param2.hasOwnProperty("share")){param1.share = param2.share as Boolean;}else{param1.share = false;}param1.previews = this.parsePreviews(param2.preview);return;}// end function

里边的注释是我理解的备注,目前很疑惑的是这个:

_loc_22.fileId = this.getFileId(_loc_11, _loc_16, int(_loc_20), _loc_14);

知道它是计算fileId的关键代码,但是RandomProxy是什么结构的有人知道吗?为什么怎么搜索都找不到呢?

getFileId函数代码:

//streamfileids , mp4/flv , i , RandomProxy(param1.seed)private function getFileId(param1:Object, param2:String, param3:int, param4:RandomProxy) : String{var _loc_6:String = null;//mp4/flvvar _loc_5:String = "";//"66*59*66*66*66*9*66*30*66*66*57*66*53*47*47*67*11*3..........for (_loc_6 in param1){if (_loc_6 == param2){_loc_5 = param1[_loc_6];break;}}if (_loc_5 == ""){return "";}var _loc_7:String = "";var _loc_8:* = param4.cg_fun(_loc_5);var _loc_9:* = param4.cg_fun(_loc_5).slice(0, 8);var _loc_10:* = int(param3);var _loc_11:* = int(param3).toString(16);if (int(param3).toString(16).length == 1){_loc_11 = "0" + _loc_11;}_loc_11 = _loc_11.toUpperCase();var _loc_12:* = _loc_8.slice(10, _loc_8.length);_loc_7 = _loc_9 + _loc_11 + _loc_12;return _loc_7;}// end function

关键部分就是这个随机的函数cg_fun()是干什么的。

比如fileid是:0300080400510C15B61CF004ED56DCBD905FF1-B527-63DA-87D3-6C0D90F804E1

很显然,_loc_9得到的是前边8位,_loc_11得到的是中间两位,而_loc_12是通过函数cg_fun()得到的那个字符串出去前边被替换的10位的剩余字符串。

所有的核心就剩下这个函数了,一时间找不到办法解决,之后查了一下其他人做的方法,那些几乎都是以前的早起版本,但是现在依然可以用:

最新的优酷真实下载地址解析 http://blog.csdn.net/feige2008/article/details/8198434

优酷视频真实地址解析 http://blog.csdn.net/amor2006/article/details/7055902

记录一个获取fileid的脚本代码:

import time
import random
import math
def createSid():nowTime = int(time.time() *1000)random1 = random.randint(1000,1998)random2 = random.randint(1000,9999)return "%d%d%d" %(nowTime,random1,random2)def getFileIDMixString(seed):mixed=[]source=list("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\:._-1234567890")seed=float(seed)for i in range(len(source)):seed = (seed * 211 + 30031 ) % 65536index = math.floor(seed /65536 *len(source))mixed.append(source[int(index)])source.remove(source[int(index)])#return ''.join(mixed)return mixeddef getFileId(fileId,seed):mixed=getFileIDMixString(seed)ids=fileId.split('*')realId=[]for ch in ids:realId.append(mixed[int(ch)])return ''.join(realId)
if __name__ == '__main__':#print createSid()print getFileIDMixString(4528)fileId='49*48*49*49*49*12*49*5*49*49*1*42*49*16*42*1*32*11*42*16*55*49*49*5*63*38*1*11*38*16*32*38*19*49*1*55*55*42*64*32*1*2*23*64*11*48*38*15*64*12*23*38*48*64*11*16*49*38*19*49*55*12*49*5*63*42'seed=2034print getFileId(fileId,seed)

整体的源码:

test.html  使用的时候使用IE浏览器,其他的还在研究中

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>JSON</title></head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script type="text/javascript">var xmlhttp;var message="";//本源码只能在IE浏览器或者IE模式下可以使用,因为ActiveXObject有足够的权限,而XMLHttpRequest不能跨域请求json//创建http 请求的对象function createxmlhttpRequest() {try {xmlhttp = new ActiveXObject("Msxml2.xmlhttp");} catch (e) {try {xmlhttp = new ActiveXObject("Microsoft.xmlhttp");} catch (e2) {xmlhttp = false;}}if (!xmlhttp && typeof XMLHttpRequest  != "udefined") {try {xmlhttp = new XMLHttpRequest ();} catch (e2) {xmlhttp = false;}}}//工具函数,删除一个字符串指定位置的字符function remove(str , index){if(str == null)return null;if(index < 0)return str;if(index < str.length){str=str.substring(0,index)+str.substring(index+1);return str;}else{return null;}}//通过seed计算得到解密的“种子”function getFileIDMixString(_seed){var  mixed           = [];var source            = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\\:._-1234567890";var seed           = parseFloat(_seed)+0.00;var source_length = source.length;for(var i = 0 ; i < source_length ; i ++){seed      = (seed * 211 + 30031) % 65536;var index  = Math.floor(seed /65536 * (source.length));index      = parseInt(index);mixed[i] = source.charAt(index);source = remove(source,index);}return mixed;}//通过上边的解密种子,将fileid解密function getFileId(fileId,seed){var mixed = getFileIDMixString(seed);var ids     = fileId.split('*');var realId   = [];for(var i = 0 ; i < ids.length ; i ++){if(ids[i] == "")breakrealId[i] = mixed[ids[i]];}return realId;}function getInfo(){createxmlhttpRequest();try {//实验方法://找到一个优酷视频的链接:   http://v.youku.com/v_show/id_XMjQwOTM4NDQ4.html//将id后边的XMjQwOTM4NDQ4取出,连接成字符串:   http://v.youku.com/player/getPlayList/VideoIDS/XMjQwOTM4NDQ4xmlhttp.open("get", "http://v.youku.com/player/getPlayList/VideoIDS/XMjQwOTM4NDQ4", false);xmlhttp.onreadystatechange = returnInfo;xmlhttp.send(null);}catch(e){}}//回调函数,处理传回来的jsonfunction returnInfo(){if(xmlhttp.readyState == 4){var info = xmlhttp.responseText;eval("var json= " + info);var seed          = "";var title           = "";var streamtypes     = [];var streamfileids = [];var segs          = [];var   mixed           = [];var FileId            = [];var video         = [];var videorealurl  = [];seed          = json.data[0].seed;document.getElementById("seed").innerHTML = "随机种子: "+seed;//显示此时的随机种子mixed = getFileIDMixString(seed);title         += json.data[0].title;document.getElementById("title").innerHTML = "视频名字: "+title+"<br/>";//显示当前播放视频的名字streamtypes     = json.data[0].streamtypes;document.getElementById("streamtypes").innerHTML  = "视频格式: ";document.getElementById("streamfileids").innerHTML  = "加密的stream id: <br/>";document.getElementById("FileId").innerHTML          = "解密的stream id: <br/>";document.getElementById("video").innerHTML = "视频加密的K值:<br/>";for(var i = 0 ; i < streamtypes.length ; i ++){streamfileids[i]  = json.data[0].streamfileids[""+streamtypes[i]];document.getElementById("streamtypes").innerHTML +=" "+streamtypes[i];//显示当前视频可以选择的种类document.getElementById("streamfileids").innerHTML+=streamtypes[i]+": "+streamfileids[i]+"<br/>";//显示当前视频加密后的stream idFileId[i] = getFileId(streamfileids[i],seed);var temp_fileid = "";for(var j = 0 ; j < FileId[i].length ; j ++){temp_fileid += FileId[i][j];}FileId[i] = temp_fileid;document.getElementById("FileId").innerHTML += streamtypes[i]+": FileId: "+FileId[i]+"<br/>";//显示当前播放视频的名字document.getElementById("video").innerHTML += streamtypes[i]+" :<br/>";segs = json.data[0].segs[""+streamtypes[i]];var url  = [];for(var j = 0 ; j < segs.length ; j ++){document.getElementById("video").innerHTML += segs[j].k+"<br/>";//显示当前播放视频的名字//http://f.youku.com/player/getFlvPath/sid/138846963736713671615_00/st/flv/fileid/url[j] = "http://f.youku.com/player/getFlvPath/sid/00_00/st/";//基本路径url[j]+= streamtypes[i];//视频类型temp_fileid = FileId[i];if(j < 16)temp_fileid = temp_fileid.substring(0,8)+"0"+parseInt(j).toString(16)+temp_fileid.substring(10);elsetemp_fileid = temp_fileid.substring(0,8)+parseInt(j).toString(16)+temp_fileid.substring(10);url[j]+= "/fileid/"+temp_fileid;//增加file的idurl[j]+= "?K="+segs[j].k;//增加K值验证document.getElementById("videorealurl").innerHTML += j+": <a href=\""+url[j]+"\">"+url[j]+"</a><br/>";//显示当前播放视频的名字}videorealurl[i] = url;}}}</script><body><br/><br/><h2 style="color: red;">JSON</h2><br/><input type="button" value="JSON" οnclick="getInfo()" /><table><tr><td><div id="test"></div></td></tr><tr><td><div id="seed"></div></td></tr><tr><td><span id="title"><span></td></tr><tr><td><span id="streamtypes"><span></td></tr><tr><td><span id="streamfileids"><span></td></tr><tr><td><span id="FileIDMixString"><span></td></tr><tr><td><span id="FileId"><span></td></tr><tr><td><span id="video"><span></td></tr><tr><td><span id="videorealurl"><span></td></tr></table></body>
</html>

实验结果:

挖掘视频网站【优酷】上被截断的视频的地址--002相关推荐

  1. PerfDog 测试腾讯视频、优酷、爱奇艺视频类小程序性能

    自从经朋友介绍PerfDog这款移动端测试神器后就一直在使用它测试大型游戏的流程度,前两天使用腾讯视频追剧分享到微信时发现发现的链接直接进入腾讯视频的小程序中,试了多个视频软件皆是如此,于是想要试试用 ...

  2. Pr剪切的视频在优酷上播放为绿屏的解决方案

    方法/步骤 第三步:在这里将设置中的渲染模式从D3D改为GDI,就会从绿色的图转变成正常的视频.(实际操作实现) 第四步:如果还不行呢?怎么办呢?那就要更新你的优酷. 转载于:https://www. ...

  3. php上传视频太慢,优酷上传视频教程及上传慢和时间等问题

    大家经常去优酷网站看视频,许多有爱的同学也喜欢将自己收藏的视频上传到优酷,对于许多新手朋友来说,不知道如何上传视频,另外大家在上传视频的过程中遇到一些问题,比如上传视频慢,上传视频时转码时间太长等问题 ...

  4. 腾讯视频、优酷、乐视视频纷纷品牌升级,视频网站的好戏才刚刚开始?

    美团CEO王兴提出的"下半场"现象正在互联网行业全面上演.O2O.App.电商.直播.地图.金融,诸多细分市场都进入新的竞争阶段,规则悄然生变,2016年成为一道泾渭分明的分水岭. ...

  5. 优酷上的cocos2d-x的演示视频

    优酷上居然有这些演示视频,背景音乐很不错. http://v.youku.com/v_playlist/f5000092o1p0.html

  6. 土豆网我的视频不能看了,换到了优酷上,放一个上来测试一下.呵呵!

    土豆网我的视频不能看了,换到了优酷上,放一个上来测试一下.呵呵! 吉他弹唱:痛哭的人. posted on 2008-08-07 20:43 阿牛-专注金融行业开发 阅读(...) 评论(...) 编 ...

  7. 经验分享:上传视频到优酷客户端

    分享一个和技术开发无关的经验,但是对爱奇艺会员续费不熟悉的话,这个经验还是很有作用的,尤其是自动续费这个功能,爱奇艺做的很好,很隐蔽,不刻意找的话基本找不到怎么取消自动续费会员的功能.那么,下面就来介 ...

  8. Android调用优酷SDK实现上传视频到优酷

    程序实现前我们先要到优酷开放平台下载SDK(下载地址:http://open.youku.com/down),下载好后我们将压缩包解压,下面以Eclipse为开发工具进行讲解: 首先我们要获得优酷sd ...

  9. 优酷视频下载|优酷播放器下载

    优酷网从上周开始,全站视频已经开始完美支持iPad和iPhone 4的在线视频播放服务.采用HTML5和HTTP Live Streaming技术,对苹果iOS系统实现全面的支持,并达到和PC上一样流 ...

  10. 极客日报:腾讯视频、优酷、爱奇艺取消超前点播;苹果为小学生推出编程指南;Win11会导致游戏性能下降

    一分钟速览新闻点! 中国互联网企业员工平均年龄出炉 腾讯视频.优酷.爱奇艺取消超前点播 微信官方公布9月份朋友圈十大谣言 华为不放弃起诉瑞典相关部门 小米5G机东欧市场超越苹果.三星:排名第一 贝索斯 ...

最新文章

  1. html5新布局,支持HTML5新布局 酷盘Web版全新升级
  2. 《程序是怎样跑起来的》第一章读后感
  3. android SQLite数据库的使用
  4. java安全编码指南之:声明和初始化
  5. mysql 设置宽松模式_mysql5.6 sql_mode设置为宽松模式
  6. vue中pdf预览组件_Vue+ElementUI使用vue-pdf实现预览功能
  7. Python爬虫速度很慢?并发编程了解一下吧
  8. 语音识别(1)---语音识别(ASR)评估指标-WER(字错误率)和SER(句错误率)
  9. PostMan居然要被干掉了!IDEA这款插件太实用了…
  10. MATLAB——zeros
  11. Cherno OpenGL 教程
  12. 批量给多个 Excel 工作簿文件添加文字水印或图片水印
  13. Hyper-v功能介绍和操作演示
  14. 【漏洞利用】逻辑漏洞之任意账号密码重置详解
  15. android 字体修改颜色代码,Android SearchView 修改字体颜色
  16. 三星手机动态修改分辨率信息
  17. “由于无法验证发行者,所以WINDOWS已经阻止此软件”的解决方法
  18. let’s talk in englsh P41
  19. A2DP-Link传输协议详解以及实例龙讯LT947LMT/LT948D简介
  20. CRNN端到端文本识别复现实践

热门文章

  1. 【阅读文献】单目视觉SLAM方法综述【2】~特征的检测与匹配
  2. Angular + Leaflet 实现房源数据可视化(附github源码)
  3. 银行营销方案计算机实验心得体会,浙科电子商务实验报告总结.docx
  4. 同源小鼠肿瘤模型是移植自同源小鼠自发性肿瘤的模型可以看作是PDX小鼠版本
  5. 机房搬迁数据备份方式
  6. m3u8合成视频 linux,m3u8文件什么合成便于播放的MP4的方法
  7. 查询快递,查看单号更新几条物流信息
  8. 《脱颖而出——成功网店经营之道》一1.4 网店的特点
  9. 数据错误循环冗余检查是什么意思_数据库为什么会丢失数据
  10. Gaussian几何结构优化问题解决