2012年12月16日星期日

[原创][教程] 获取YouTube 的Video下载链接的方法

这是一个比较简短的文章,略略的介绍了YouTube Video Grabber 如何获取YouTube 视频的下载地址等等。

【写在前面的话】
这篇文章,只是提出笔者用来实现YouTube Video Grabber 的思路,不提供代码,组要的原因是让读者动动脑,动动手,这样才能彻底的了解。
还有就是,这个方法不是永远可行的,如果有天YouTube 突然改版了,那这个方法就很可能失效,但是都几乎相同。

【原理解密】
0、获取视频的链接
这个不用说,这是一定要的,没有视频链接,要怎么下载?

1、获取HTML代码
获取视频的下载地址呢,首先就必须下载该网页的HTML源代码,这里就以Google Chrome 中直接显示网页的源代码。

2、获取swf变量

有了视频的HTML代码,万事好办了!
YouTube呢,它把所有的视频的链接都储存在这个变量之中,只要找到该变量,就能逐一分析出各个不同分辨率的视频下载链接
只要在HTML代码中搜索var swf = 就可以看到了:
image
var swf =  一直复制到 document.getElementById('watch7-player').innerHTML = swf;
image

复制到任何一个编辑器(笔者用Notepad++),当然里面还有很多我们不需要的东西。

4、URL解码(URLDecode)
复制后,读者们后看到很多类似%2310的字眼,YouTube可能是为了隐藏视频的下载链接,把他们给“编码(Encode)”了,但是,不用怕,这种加密的方法是“可逆”的,就是所有“编码”,就有“解码(Decode)”,就如有“加密(Encrypt)”,就有“解密(Decrypt)”般。
如何解码呢?用特定的解码器!
而解码器,笔者已经为大家准备了!
笔者为了大家的方便,做了个比较容易记的域名:http://urlendecoder.tk/
打开上述网页,然后将复制过来的贴到该框框上,然后点击“Decode” 3次
image
过后,再次将已经解码了的内容复制到编辑器。

5、分析下载地址
解码后,就可以开始分析下载链接啦!
其实,我们之前复制的代码之中,还掺杂着很多与该视频不相关的资料,我们主要的目的是分析出下载链接。
首先,所有的下载链接都是在url_encoded_fmt_stream_map 后面的,所以我们要做的是:在文本编辑器中搜索url_encoded_fmt_stream_map,然后去掉之前的部分。
image

各位读者,应该看出什么了吧?之中,所有的视频链接都是以&url= 分开的,所以我们只要分辨每个&url=,然后把它们分开,视频的下载链接就出来了!
image

把他们一个个复制出来:
image

注意:最后一个下载链接一直到\u0026为止(就是说,下载链接不包括\u0026\u0026以后的字串)

image

6、替换sig
最后一个步骤了,YouTube 很“顽皮”地把最重要的signature换成了sig,所以如果不直接替换回去的话,就不能下载视频了。
image
所以要把sig 替换成 signature
image

过后,就完成了!

【附加信息】
这里来略略解释下视频下载链接的几个比较重要的参数的功能:
以这个链接为例子:
http://r2---sn-uh-30ar.c.youtube.com/videoplayback?upn=NPuqK12Qg1c&sparams=cp,id,ip,ipbits,itag,ratebypass,source,upn,expire&fexp=900148
,928006,922401,920704,912806,925703,928001,922403,922405,929901,913605,913546,913556,908493,9
08496,920201,913302,919009,914903,911116,910221,901451,902556&key=yt1&expire=13556871
40&itag=45&ipbits=8&sver=3&ratebypass=yes&mt=1355664552&ip=115.132.
86.57&mv=m&source=youtube&ms=au&cp=U0hUSlZTVV9JSkNONF9OTVlCOlhfSGt5RWJrWTc2&a
mp;id=fae9bd59b0dcc824&newshard=yes&type=video/webm; codecs="vp8.0, 
vorbis"&fallback_host=tc.v19.cache1.c.youtube.com&signature=D33AA12FD27D75BF1D269B235
B2449FF0212E9C5.14C2A0886FF05BFB84B92F08EDBB09146448F191&quality=hd720,itag=22

参数:
itag : 辨认该下载链接说对应的视频分辨率(YouTube @ Wikipedia 那里有个很详细的itag表http://en.wikipedia.org/wiki/YouTube#Quality_and_codecs

type: 这就是视频的格式(有flv、webm、3gp、mp4等等)

quality:这就是视频的质量啦,分为hd1080、hd720、large、medium、small ,分别对应1080p、720p、480p、360p、240p

[原创][开源][C#] YouTube Video Grabber(YouTube 视频下载器) 回来啦!

更新:
笔者建了个简单的网站:http://youtubesniffer.tk/笔者所有更新都会放在该网站上!


用手指头算算,Video Grabber 这个很大很大的 project 也大概有1年了,当初初学VB6,加入了个团队,一时其兴,就胡乱写了个YouTube Video Grabber(当然,当初不是这个名字的),起初被队员强力反对,为什么呢?因为没看头!管他呢!俺继续写!写着写着,1年过去了,只发布了3个向外公开的公测版本,最后就因为学业的关系,就没去更新了,放假时才抽空补充功能,解除BUG。

PS:还记得前3个版本么?他们在这里——【原创】【VB6】AG Youtube Downloader - 免费的Youtube视频下载器【原创】【VB6】AG Youtube Downloader 正式更名为 AG Youtube Video Grabber【原创】【VB6】YouTube Video Grabber 大翻新!

功能越来越多时,问题就来了——整个软件变得很复杂,操作变难了,用VB6来写越来越力不从心,代码越来越难管理(没办法啊,初学VB6的代码风格就是很烂啊),又不适合搞个稳定的多线程,队员没有一个可以看懂VB6代码,于是我有了个念头:放弃更新VB6版本的Grabber,把代码开放出来,用.net重写整个Grabber!

今年11月兴致勃勃的学了C#,为了什么?为了Grabber啊!搞了整个月,成果出来了!新版本的Grabber注重的是简洁、操作方便。在这之前,我有个想法,那就是Hook WebBrowser的send API,然后揭下YouTube 的视频下载链接,于是就依照这个课题写了个教程,创建了一个名为youtubesniffer的Google Page,没想到,功力不足啊!失败了,API Hooking不是随手就能搞出来的啊!又丢下了Hook API这个念头,重拾回Grabber一直用着的方法——暴力解析视频网页的HTML代码。VB6版本的Grabber 也是一直基于这个方法运作的,但是YouTube的HTML代码常常更换,所以需要常常更新,奈何笔者外婆功课繁重,没办法一直更新,所以才有了开放源代码的念头。

但是出了刚刚所说的暴力分析视频网页的源代码,笔者又详细分析了YouTube传输video的方法,总结另外4个方法——2个是基于请求头(request header),另外一个是基于YouTube 自带的get_video_info方法,各有各的优点,get_video_info这个方法虽好,但是碰到有版权的视频,YouTube 什么资料都不给了!所以到头来,还是暴力的分析HTML代码好啊!

想看看那些教程在那里么?来这里——YouTube Video Downloading Tutorial
PS:笔者的英文很差的啊!

先说开源的事,youtubesniffer的Google Page 包括了VB6和C#版本的Grabber的源代码,VB6的代码相对的比较乱些,C#的就比较有规划(毕竟搞编程也有一年多了,没有良好的代码风格会给人家笑的啊!)

【Google Page网址】:YouTubeSniffer’s Google Page: http://code.google.com/p/youtubesniffer/

源代码的版本是用SVN管理的,要下载源代码呢,就必须用SVN下载,于是又写了个教程,教导大家如何用TortoiseSVN(GUI版本的SVN)来下载youtubesniffer的代码。

教程网址(Google Page):How To Use TortoiseSVN To Download YouTubeSniffer’s SVN thrunk?
TortoiseSVN来这里下载:http://tortoisesvn.net/downloads.html

这里也有相同的视频教程:

How to use SVN?


这里来查看有没有新版本:http://code.google.com/p/youtubesniffer/wiki/LatestRelease
【YouTube Video Grabber .net】
写了一大堆东东,来正题吧!这个新版本的是以C#重写,任何看懂C#代码的大大都可以到Google Page去下载源代码!
这些是一些截图:
image
主界面
新版本的主界面分为3大区,分别是 视频截图显示区、资料显示区和下载选项区,是不是与之前的版本简洁多了?

image
下载器
这个版本的下载器支持多线程下载,也就是说能一次性的下载多个视频,当然了,下载速度也会随着下载的数量而改变,越多,下载速度就相对的比较慢。

image
About窗体
还是之前那个图片,哈哈!
image
Oppa Gangnam Style!
运作中的Grabber!

有时候会遇到这种情况:
image
没关系,只要才重试一次就好了!笔者不知道为什么,有时候会下载到不同的HTML代码,带着解析HTML代码的模块会出现错误。

【Youtube Video Grabber .net 下载地址】:Youtube Video Grabber

这里是C# 版本的Grabber 的思路图,用FreeMind(这里下载:http://freemind.sourceforge.net/wiki/index.php/Main_Page) 做的
YouTube Video Grabber

2012年12月10日星期一

[原创][数学] 步步推导不用计算机算平方根的公式(笔算开平方)

笔者有段时间很疯迷于数学,12岁那段时间是高峰期,曾经出国比赛,但是最近“转行”到电脑了,数学也很少去理它了。
今天在整理书橱的时候,找到了一篇蛮有意义的手稿,应该是笔者12岁那年写的,里面是一些关于“笔算开平方”的一些研究与公式推导。由于那个时候不太成熟、学的东西也不会很多,研究的那些资料遇到很多的困难,只是初步的推了一些公式,花了一整天来重新整理,才明白里一些原理与推导的方法,于是就步步研究,写了起来,然后又怕忘记,所以特此写了这篇文章,就当作备份吧。
温馨提醒:如果你很讨厌数学,请不要在看下去了,这篇文章会把你的头脑炸晕的!
“笔算开平方”是什么呢?举个例子来说,比如有天开始,你忘了带计算机,考题要你算一个数的平方根(square root),况且你不能与人家借计算机的情况下,要怎么样开平方呢?另一种情况就是,你有计算机,但是却没有带开平方根的功能,只有简单的加减乘除,要如何算平方根呢?
你有两种方法:1、就是一点一点的试 2、投机取巧,根据一些恒等式,将复杂的开方转换成简单的加减乘除。
其实这个方法在网上已经有了,比如较出名的“牛顿法”,这种方法巧妙与:就算你取的初始值是个错误的值,这个公式的输出会知道调整到正确的值(也就是说该数的平方根)
笔者的方法是根据与恒等式:
image
而我们设image  b为一个数的最后一位数,a则是整个数除了最后一位数之外的数
举例来说,我们的数为123456,则image
所以我们有image ,而image
现在我们知道image (也就是说,我们知道image 的值,我们要找a和b的值)是什么了,我们要倒推回去,我们要知道image的值,这就是开平方(square root..)
在笔算开平方时,a是我们已经计算出来的结果,而b是当前需要计算的为上的数,而r为相减剩下来的数(当r=0时,就代表该数是个完全平方数),如图下所示:

image


每次估算下一位数时,image 中的image 会被减掉,剩下image
设我们现在需要估算的位数为image ,而image 必须满足以下不等式:
image
当中,r为相减后剩下来的“余数”
image 的值,可以以以下公式估算出:
image
如上图所示,有时候估算出的image ,会大于9,所以我们让image 等于9就是了。
好吧,然我们举个例子来更详细的表达出笔算开平方的具体步骤
首先我们选一个数,这里就然他为200吧
然后以2位为一组分开:
image
先来估算第一位数,很显然的image ,所以第一位就是1了
image
image ,然后脱下两个0,和之前的1合并起来,成为100
这一步,我们要用到我们的估算公式来估算下一位的位数image
现在,image
image
但是image ,所以让image ,不等式就会成立:image

下一位就是4,我们可以补上多余的0:
image
我们可以一直重复上述步骤,以求得接下来一位:
image
image
image

image
image
image
image
image
image
image
image
image

一直继续下去,就会得到:
image
之前我说过image 有时候会大于9,距离来说,我们以899为例子:
image
image
image
image
image
image
继续下去就可以得到:
image
这个笔算开平方可以以不同次方的恒等式来推导出笔算开n次方的方法,笔者试过推导开立方的方法,但是估算下一位的数有点麻烦(功力不好啊)