【问题】
想要模拟优酷视频播放,刷新视频播放次数。
以此为例:
视频:燕山大讲堂 中国如何走向公民社会 4-3
http://v.youku.com/v_show/id_XMjIxMjUzNjQ0.html
想要通过C#程序模拟刷新其播放次数。
【解决过程】
通过IE9的F12,很容易抓取出一些记录,下面就一个个分析分析:
================================================================================
http://v.youku.com/v_show/id_XMjIxMjUzNjQ0.html
resp html:
分析:
可以获得对应的网页的源码,其中可以搜索到:
var videoId = ‘55313411’;
var videoId2= ‘XMjIxMjUzNjQ0’;
其中
(1)videoId为视频的id,后面都会用到此id。
(2)videoId2是该视频编码后的标识符,对应着网页地址:
http://v.youku.com/v_show/id_XMjIxMjUzNjQ0.html
中的XMjIxMjUzNjQ0。
================================================================================
http://static.youku.com/v1.0.0252/v/swf/player.swf
IE9会去获得对应的swf播放器。
尝试了下通过网页直接访问此地址,得到的结果是:
抱歉,数据异常,您可以尝试刷新操作。
如果问题仍未解决,请反馈给我们。
错误代码 2002
很明显,是没有指定对应的需要播放的视频,导致此种错误的。
当然,普通用户,偶尔也是会遇到此错误的:
================================================================================
http://v.youku.com/QVideo/~ajax/getVideoPlayInfo?__rt=1&__ro=&id=55313411&type=vv
resp json:
{"vv":1434,"ss":"hokHVjEl2go76xECZzS8sw"}
分析:返回vv的值是播放次数。
================================================================================
http://comments.youku.com/comments/~ajax/getStatus.html?__ap=%7B%22videoid%22%3A%2255313411%22%2C%22userid%22%3A%2234988573%22%2C%22oldSid%22%3A-1%7D&__ai=&__callback=commentInfoCallback
resp json:
commentInfoCallback({"total":0,"new_count":0,"last_sid":"-1","create_at":0,"last_modify":null,"last_hot_modify":0,"owner_count":0})
分析:此url访问,对过程分析,好像没太大作用。
================================================================================
http://notice.youku.com/notice/js_nova_notify.json?__ap=%7B%22uid%22%3A%2234988573%22%2C%22rand%22%3A0.005304480005637213%7D&__ai=&__callback=NoticeBox.noticeCallback
resp json:
NoticeBox.noticeCallback({"error":1,"cost":0.0007631778717041,"notice":[]})
分析:此url访问,对过程分析,好像没太大作用。
================================================================================
http://v.youku.com/player/getPlayList/VideoIDS/XMjIxMjUzNjQ0/timezone/+08/version/5/source/video?ran=8020&password=&n=3
resp json:
{"data":[{"ct":"t","cs":"251","logo":"http:\/\/g4.ykimg.com\/1100641F464CD949A7B0830215E21DD881BB46-83CB-79E2-115A-DA9190635C92","seed":3234,"tags":["\u71d5\u5c71\u5927\u8bb2\u5802","\u516c\u6c11\u793e\u4f1a"],"categories":"87","videoid":"55313411","vidEncoded":"XMjIxMjUzNjQ0","username":"crifan","userid":"34988573","title":"\u71d5\u5c71\u5927\u8bb2\u5802 \u4e2d\u56fd\u5982\u4f55\u8d70\u5411\u516c\u6c11\u793e\u4f1a 4-3","up":20,"down":0,"ts":"hvnSfjIl2g086xEBT*HMsw","tsup":"hvnaFDEl2g086xECJenMsw","lastpoint":184611,"key1":"b14bb146","key2":"f6f7f5c2491abd05","tt":"0","videoSource":"2","seconds":"1817.54","streamfileids":{"flv":"53*52*53*53*53*0*53*28*53*53*2*17*14*58*2*58*59*54*17*43*17*28*53*0*9*28*25*0*9*14*59*59*57*50*9*9*25*17*56*9*9*14*22*56*52*50*53*14*56*59*57*52*43*56*22*54*50*53*25*53*9*14*22*2*22*58*"},"segs":{"flv":[{"no":"0","size":"13142375","seconds":"426","k":"a12dc5281298552b261c7826","k2":"147110d485936ae7c"},{"no":"1","size":"13141099","seconds":"426","k":"1983148b0f4cd5982827db68","k2":"12b8b9f91f7a34d60"},{"no":"2","size":"13170209","seconds":"426","k":"6bdc272596007b9c241114e3","k2":"17c9b67018cb670cf"},{"no":"3","size":"12973481","seconds":"426","k":"8b86c8c8ac75d182261c7826","k2":"1fc63fef2c22ad43c"},{"no":"4","size":"3649755","seconds":"113","k":"bb7075e3deebc905261c7826","k2":"1001462b4cd9cb0b1"}]},"streamsizes":{"flv":"56076919"},"stream_ids":{"flv":"24718343"},"streamlogos":{"flv":"1"},"streamtypes":["flv"],"streamtypes_o":["flvhd"]}],"user":{"id":"34988573"},"controller":{"search_count":true,"mp4_restrict":1,"stream_mode":2,"share_disabled":false,"download_disabled":false,"video_capture":true,"area_code":320500,"dma_code":4837,"continuous":0,"playmode":"normal"}}
formated json:
{
"data": [{
"ct": "t",
"cs": "251",
"logo": "http:\/\/g4.ykimg.com\/1100641F464CD949A7B0830215E21DD881BB46-83CB-79E2-115A-DA9190635C92",
"seed": 3234,
"tags": ["\u71d5\u5c71\u5927\u8bb2\u5802", "\u516c\u6c11\u793e\u4f1a"],
"categories": "87",
"videoid": "55313411",
"vidEncoded": "XMjIxMjUzNjQ0",
"username": "crifan",
"userid": "34988573",
"title": "\u71d5\u5c71\u5927\u8bb2\u5802 \u4e2d\u56fd\u5982\u4f55\u8d70\u5411\u516c\u6c11\u793e\u4f1a 4-3",
"up": 20,
"down": 0,
"ts": "hvnSfjIl2g086xEBT*HMsw",
"tsup": "hvnaFDEl2g086xECJenMsw",
"lastpoint": 184611,
"key1": "b14bb146",
"key2": "f6f7f5c2491abd05",
"tt": "0",
"videoSource": "2",
"seconds": "1817.54",
"streamfileids": {
"flv": "53*52*53*53*53*0*53*28*53*53*2*17*14*58*2*58*59*54*17*43*17*28*53*0*9*28*25*0*9*14*59*59*57*50*9*9*25*17*56*9*9*14*22*56*52*50*53*14*56*59*57*52*43*56*22*54*50*53*25*53*9*14*22*2*22*58*"
},
"segs": {
"flv": [{
"no": "0",
"size": "13142375",
"seconds": "426",
"k": "a12dc5281298552b261c7826",
"k2": "147110d485936ae7c"
}, {
"no": "1",
"size": "13141099",
"seconds": "426",
"k": "1983148b0f4cd5982827db68",
"k2": "12b8b9f91f7a34d60"
}, {
"no": "2",
"size": "13170209",
"seconds": "426",
"k": "6bdc272596007b9c241114e3",
"k2": "17c9b67018cb670cf"
}, {
"no": "3",
"size": "12973481",
"seconds": "426",
"k": "8b86c8c8ac75d182261c7826",
"k2": "1fc63fef2c22ad43c"
}, {
"no": "4",
"size": "3649755",
"seconds": "113",
"k": "bb7075e3deebc905261c7826",
"k2": "1001462b4cd9cb0b1"
}]
},
"streamsizes": {
"flv": "56076919"
},
"stream_ids": {
"flv": "24718343"
},
"streamlogos": {
"flv": "1"
},
"streamtypes": ["flv"],
"streamtypes_o": ["flvhd"]
}],
"user": {
"id": "34988573"
},
"controller": {
"search_count": true,
"mp4_restrict": 1,
"stream_mode": 2,
"share_disabled": false,
"download_disabled": false,
"video_capture": true,
"area_code": 320500,
"dma_code": 4837,
"continuous": 0,
"playmode": "normal"
}
}
分析:此处很明显,是获得了一堆的后续所需要的值。
================================================================================
http://stat.youku.com/player/addPlayerStaticReport
post data:
videoid=55313411&sid=134335160910211021209&source=video&h=F8MvIZ074GBOIagk&referer=null&t=hvnSfjIl2g086xEBT%2AHMsw&uid=34988573&totalseg=5&url=http%3A%2F%2Fv%2Eyouku%2Ecom%2Fv%5Fshow%2Fid%5FXMjIxMjUzNjQ0%2Ehtml&fullflag=0&ikuflag=n1&totalsec=1817
关于这个地址,网上找了一推,找到这里了:
(1)http://v.sogou.com/playevent.pat
中有关于优酷的地址:
http://stat.youku.com/player/addPlayerDurationReport
http://stat.youku.com/player/addPlayerStaticReport
http://stat.youku.com/player/addPlayerDynamicReport
(2)http://topic.csdn.net/u/20090314/17/1cb4e6a8-c73e-4cac-a167-34e37d25220a.html
里面的获取flv地址,我这里已经可以搞定。
不过其中里面有referer是对应的swf,倒是可以借鉴。
(3)apache日志异常
其也贴出了一些相关的POST。
================================================================================
http://stat.youku.com/player/addPlayerDurationReport?viewUserId=34988573&number=59&Tid=0&sid=134335160910211021209&format=0×tamp=1343351610229&playComplete=0&url=http%3A%2F%2Fv%2Eyouku%2Ecom%2Fv%5Fshow%2Fid%5FXMjIxMjUzNjQ0%2Ehtml&referUrl=null&rnd=2003&emb=AjU1MzEzNDExAnYueW91a3UuY29tAnZfc2hvdy9pZF9YTWpJeE1qVXpOalEwLmh0bWw%3D&ct=t¤tPlayTime=218%2E891&cs=251&continuationPlay=1&source=video&winType=1&hd=0&videoid=55313411&topHdVideo=0&videoOwnerId=34988573&totalsec=1817&Type=0&starttime=0&fullflag=0&guid=5d174bc8%2Daac4%2D9053%2Dd8b3%2D0553E6F794e3&ikuflag=n&showid%5Fv2=
================================================================================
http://valf.atm.youku.com/valf?ct=t&cs=251&v=55313411&t=1817&u=34988573&fileid=03000205004CD949A7CBC50215E21DAA6811EC-11DF-380D-A63B-F780E01DF4F9&winType=interior&partnerid=null&paid=0&fullflag=0&s=&td=0&k=%u71D5%u5C71%u5927%u8BB2%u5802%7C%u516C%u6C11%u793E%u4F1A
================================================================================
http://h.irs01.com/irt?_iwt_id=TBJBcAtbTE/a82uiR1UStAA=&_iwt_UA=UA-youku-200001&jsonp=SetIDA0&_iwt_p1=A-0-0&_iwt_p2=XMjIxMjUzNjQ0&_iwt_p3=1817-0-0-0&r=1040
resp html:
SetIDA0(‘TBJBcAtbTE/a82uiR1UStAA=’)
================================================================================
http://lstat.youku.com/log.php?&utmn=1266478904&yact=0&yrefer=&ikuIns=0&vcate=ct251_B&device=Win32
resp info:
Key Value
Response HTTP/1.1 200 OK
Via 1.1 SC-SZ-06
Connection Keep-Alive
Proxy-Connection Keep-Alive
Transfer-Encoding chunked
Date Fri, 27 Jul 2012 01:13:33 GMT
Content-Type text/html
Server nginx/0.5.33
Set-Cookie __ysuid=1334896463088bUC; expires=Tue, 19-Jan-2038 03:14:07 GMT; path=/; domain=youku.com
P3P CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
Set-Cookie _l_s_c_=a%3A2%3A%7Bs%3A9%3A%22_l_t_last%22%3Bi%3A1343351613%3Bs%3A12%3A%22_l_p_session%22%3Bi%3A1%3B%7D; path=/; domain=lstat.youku.com
Set-Cookie _l_f_c_=a%3A19%3A%7Bs%3A19%3A%22_l_t_first_gbrowser%22%3Bi%3A1336729295%3Bs%3A16%3A%22_l_t_first_gself%22%3Bi%3A1336729295%3Bs%3A15%3A%22_l_t_last_gcoop%22%3Bs%3A5%3A%22ct251%22%3Bs%3A13%3A%22_l_c_s_domain%22%3Bs%3A1%3A%22-%22%3Bs%3A13%3A%22_l_p_gbrowser%22%3Bi%3A24%3Bs%3A10%3A%22_l_p_gself%22%3Bi%3A24%3Bs%3A10%3A%22_l_p_gcoop%22%3Bi%3A24%3Bs%3A13%3A%22_l_n_gbrowser%22%3Bi%3A6%3Bs%3A10%3A%22_l_n_gself%22%3Bi%3A6%3Bs%3A10%3A%22_l_n_gcoop%22%3Bi%3A6%3Bs%3A9%3A%22_l_g_self%22%3Bs%3A16%3A%221334896463088bUC%22%3Bs%3A9%3A%22_l_g_coop%22%3Bi%3A-2%3Bs%3A12%3A%22_l_t_last_nv%22%3Bi%3A1343351613%3Bs%3A12%3A%22_l_p_session%22%3Bi%3A1%3Bs%3A13%3A%22_l_b_r_string%22%3Bs%3A1%3A%22-%22%3Bs%3A6%3A%22_l_bru%22%3Bs%3A1%3A%22-%22%3Bs%3A12%3A%22_l_g_browser%22%3Bs%3A1%3A%22-%22%3Bs%3A16%3A%22_l_t_first_gcoop%22%3Bs%3A1%3A%22B%22%3Bs%3A13%3A%22_l_t_r_string%22%3Bs%3A26%3A%222012-07-26%2Cwww.baidu.com%2C0%22%3B%7D; expires=Tue, 19-Jan-2038 03:14:07 GMT; path=/; domain=lstat.youku.com
================================================================================
http://irs01.com/irt?_iwt_id=TBJBcAtbTE/a82uiR1UStAA=&_iwt_UA=UA-youku-000001&jsonp=MTH54KV4G81IVS1K&_iwt_p1=&_iwt_p2=&_iwt_p3=&
resp html:
MTH54KV4G81IVS1K(‘TBJBcAtbTE/a82uiR1UStAA=’)
================================================================================
http://f.youku.com/player/getFlvPath/fileid/030002010050063AB75BF2003E88037FF9318A-6CFC-235D-70CF-8CE77E6D0353?K=30cac45ca1d253a9261c7825&yad=1&ts=15
resp info:
Key Value
Response HTTP/1.1 302 Found
Via 1.1 SC-SZ-06
Connection Keep-Alive
Proxy-Connection Keep-Alive
Content-Length 0
Expires -1
Date Fri, 27 Jul 2012 01:13:33 GMT
Location http://60.217.253.13/youku/69738D184A84C841882D0A5339/030002010050063AB75BF2003E88037FF9318A-6CFC-235D-70CF-8CE77E6D0353.flv
Content-type text/html
Server F_LIGHTY_TJ1
Cache-Control private, max-age=0
Pragma no-cache
================================================================================
http://60.217.253.13/youku/69738D184A84C841882D0A5339/030002010050063AB75BF2003E88037FF9318A-6CFC-235D-70CF-8CE77E6D0353.flv
================================================================================
http://f.youku.com/player/getFlvPath/fileid/0300020100500CBF5ED2E9003E88032FBC3EA9-6D29-A7E9-DC07-B84073A851C0?K=cf5b62c0af9bff152827db67&yad=1&ts=15
================================================================================
http://60.217.253.11/youku/65737194A814D84267DB2139A6/0300020100500CBF5ED2E9003E88032FBC3EA9-6D29-A7E9-DC07-B84073A851C0.flv
================================================================================
http://f.youku.com/player/getFlvPath/sid/134335160910211021209_00/st/flv/fileid/03000205004CD949A7CBC50215E21DAA6811EC-11DF-380D-A63B-F780E01DF4F9?start=218&K=a12dc5281298552b261c7826&hd=0&myp=0&ts=426
resp info:
Key Value
Response HTTP/1.1 302 Found
Via 1.1 SC-SZ-06
Connection Keep-Alive
Proxy-Connection Keep-Alive
Content-Length 0
Expires -1
Date Fri, 27 Jul 2012 01:13:35 GMT
Location http://119.167.128.77/youku/697706F04E03882535BA2E2A4D/03000205004CD949A7CBC50215E21DAA6811EC-11DF-380D-A63B-F780E01DF4F9.flv?start=218
Content-type text/html
Server F_LIGHTY_TJ1
Cache-Control private, max-age=0
Pragma no-cache
================================================================================
http://119.167.128.77/youku/697706F04E03882535BA2E2A4D/03000205004CD949A7CBC50215E21DAA6811EC-11DF-380D-A63B-F780E01DF4F9.flv?start=218
================================================================================
================================================================================
================================================================================
http://stat.youku.com/player/addPlayerDynamicReport
post data:
videoid=55313411&speed=0&sid=134335160910211021209&time=1343351609&segid=1&starttime=218&ikuflag=n1&code=3001
================================================================================
================================================================================
================================================================================
================================================================================
================================================================================
================================================================================
有空再分别搜索:
http://stat.youku.com/player/addPlayerDurationReport
http://stat.youku.com/player/addPlayerStaticReport
http://stat.youku.com/player/addPlayerDynamicReport
去找相关帖子看看。
【总结】
上面的一堆分析内容,懒得详细解释了。
总结目前的最新的结果是:
目前已经实现的是对于上述的各个url的访问,其中包括:
http://stat.youku.com/player/addPlayerDurationReport
http://stat.youku.com/player/addPlayerStaticReport
http://stat.youku.com/player/addPlayerDynamicReport
但是其中很多url的的访问过程中的有些参数,还是无法模拟。
其中觉得想要模拟视频播放的话,最核心的应该是addPlayerDurationReport,addPlayerStaticReport,addPlayerDynamicReport这三者。
但是问题就在于,对这三个url的模拟,其中部分参数还无法正确获得。
不过倒是有点奇怪的是,好像在部分参数不完全正确的情况下,对应模拟访问url所返回的response的内容,倒是很正常,感觉像是模拟成功了。
但是很郁闷的是,最终的视频播放次数,始终却没有变,所以目前的结果还是无法成功模拟刷新视频播放。
值得一提的是,网上很多人讨论的,其花很多精力才能何获得的,优酷视频的flv地址,此处倒是很容易就搞定的。
下面列举目前仍有疑问的地方:
1. http://stat.youku.com/player/addPlayerStaticReport
的post data是:
url=http%3A%2F%2Fv%2Eyouku%2Ecom%2Fv%5Fshow%2Fid%5FXMjIxMjUzNjQ0%2Ehtml
&videoid=55313411
&referer=null
&uid=0
&source=video
&totalseg=5
&totalsec=1817
&h=IklqiXnhemaZCw9H
&fullflag=0
&ikuflag=n1
&t=AQ7NejIjUnJDYxcBS%2D47NA
&sid=134371001777317737738
其中不清楚的是:
(1)h=IklqiXnhemaZCw9H
此h值,应该是swf播放器内部代码用某种算法算出来的,至今无从获得,所以没办法模拟。
基本清楚的是
(1)sid的值
网上有相关讨论:
http://www.pocketdigi.com/20111108/572.html
http://3shi.net/analyze-youku-video-address/
其中介绍了如何计算sid,但是发现,目前该算法不是很正确,经过研究,目前自己所推测的算法,用C#实现如下:
private string genSid() { string sidStr = ""; //134330543 0 489 1 489 9547 //134370055 5 121 1 121 5917 //134371001 7 773 1 773 7738 //134371040 7 721 1 721 8303 double curSecDouble = crl.getCurTimeInSec(); //1343740056.0327244 double curSecDoubleFloor = Math.Floor(curSecDouble); //1343740056.0 string curSecDoubleFloorStr = curSecDoubleFloor.ToString(); //1343740056 string lastThreeChars = curSecDoubleFloorStr.Substring(curSecDoubleFloorStr.Length - 3);//056 Random rdm = new Random(); int randFourDigitInt = rdm.Next(10000);//4420 string randomFourDigitStr = randFourDigitInt.ToString();//4420 sidStr = curSecDoubleFloorStr + "1" + lastThreeChars + randomFourDigitStr; return sidStr; }
剩下的参数,都是很容易从前面相关内容中提取出来,不多细说。
2.addPlayerDurationReport中的一些参数
可分割为:
http://stat.youku.com/player/addPlayerDurationReport
?format=0
&winType=1
&url=http%3A%2F%2Fv%2Eyouku%2Ecom%2Fv%5Fshow%2Fid%5FXMjIxMjUzNjQ0%2Ehtml
&rnd=2938
&playComplete=0
&ct=t
&referUrl=null
&source=video
&cs=251
&emb=AjU1MzEzNDExAnYueW91a3UuY29tAnZfc2hvdy9pZF9YTWpJeE1qVXpOalEwLmh0bWw%3D
¤tPlayTime=550%2E267
&hd=0
&continuationPlay=1
&topHdVideo=0
&videoid=55313411
&videoOwnerId=34988573
&viewUserId=0
&guid=5d174bc8%2Daac4%2D9053%2Dd8b3%2D0553E6F794e3
&Type=0
&showid%5Fv2=
&totalsec=1817
&Tid=0
&fullflag=0
&ikuflag=n
&starttime=0
&number=59
×tamp=1343710019932
&sid=134371001777317737738
其中,不清楚的是:
(1)emb
对于emb的值,经多次测试,同一视频的emb的值是固定的,
但是却不知道算法。看起来是从swf播放器中,用某算法所算出来的。
(2)guid
guid也类似于emb,同一视频都是固定的值,但是不知道算法。
(2)number
对于同一视频,多次播放,都是59
所以看起来是对统一视频,此值是固定的,但是不值得如何算出来的。
其他的都是清楚的,其中:
(1)currentPlayTim
表示当前播放时间,
经过修改后,下次再通过浏览器打开优酷视频后,会提示
优酷记忆您上次播放到 XX:XX
对应的XX:XX 就是上述值对对应的时间和秒的值。
(2)sid
此sid的值,要和之前addPlayerStaticReport中的一致。
(3)timestamp
timestamp的值是当前时间,正常的话,也是应该比sid中的前半段的时间戳要大的。因为sid是之前生成的,timestamp是现在生成的。
3.http://stat.youku.com/player/addPlayerDynamicReport
多次的post data分别为:
starttime=124&segid=2&videoid=55313411&time=1343710407&ikuflag=n1&speed=0&sid=134371040772117218303&code=3001
starttime=0&segid=3&videoid=55313411&time=1343710407&ikuflag=n1&speed=0&sid=134371040772117218303&code=3001
starttime=124&segid=2&videoid=55313411&time=1343710407&ikuflag=n1&speed=545667&sid=134371040772117218303&code=3002
第一次的,分割为:
starttime=124
&segid=2
&videoid=55313411
&time=1343710407
&ikuflag=n1
&speed=0
&sid=134371040772117218303
&code=3001
其中不清楚的是:
(1)starttime和segid
只是猜测是,指定某段中然后对应的起始时间。
具体关系,没深入研究。
(2)code
一般为3001,有的是3002
(3)speed
一般为0,有时候非0。不知道如何计算。
其他参数都基本清楚含义。
终上所述,虽然可以模拟访问这三个核心的http的GET和POST,但是个别参数,(可能是核心参数,也可能无关紧要)不清楚算法,但是呢,却也可以获得服务器正确的响应,response看起来都很正常。
但是的但是,最后结果却是,无法让播放次数正增加,无法刷新优酷视频的播放次数。
(虽然额外收获是,可以通过后续http访问去获得对应的flv真实地址并且可以下载)
总之,期待高手来解决:
1.如何计算上述那些不清楚的参数?(相关算法是啥?)
2.到底对于刷新播放次数,哪些http的请求,才是最核心最关键的,到底是不是上述所猜测的addPlayerStaticReport,addPlayerDurationReport,addPlayerDynamicReport?
【题外话】
无意中找到有高手写的两个python脚本:
有空可以去试试:
【后记 2012-11-12】
虽然没有完成最终目的,不过也还是可以提供已实现的代码的下载的:
完整的VS2010的C#项目源码下载:accessYouku_2012-07-31.7z