腾讯视频下载地址解析

有半年多没写过CSDN博客了,其实我仍然觉得CSDN不是一个最称心如意的写博客的地方,平时的一些笔记,我都零散地记在为知笔记或者是mac的备忘录里。不过这两天有一些编程方面的东西要记录,就简单写一下吧。


前段时间在电视上看到一个喜欢的广告,然后去百度找,只有腾讯视频上有完整版,画质也不错,但是像硕鼠之类的网站都不支持腾讯视频解析,并且我是mac系统,又不可能装“维棠”之类的老古董。直觉告诉我,只要是可以播放的东西,十有八九都能找到下载地址,我以前也做过这方面的事情,并且对现在网站常用的异步加载等技术也有一点了解,现在的视频地址都不会直接放在HTML里了,一般是通过js、json之类的技术加载出来的,如果按照这个思路来做(半年前用异步加载做过百度贴吧相册下载器),那么解析量会很大,效率也很低。


正好在百度上搜到了这样两篇文章:http://blog.csdn.net/iloveyin/article/details/39998651  http://blog.csdn.net/mmm333zzz/article/details/8766423 给了我启发,经测试之后确实可以弄到腾讯视频的真实源地址,并且腾讯视频是不分段的,可以直接一次性下下来(收费视频除外)。


我使用的接口是http://vv.video.qq.com/getinfo?vids=XXXXXXXX&otype=json&defaultfmt=fhd

其中otype=json使得返回的是一段JSON数据,如果不加这个参数打开的是XML格式的文件。defaultfmt=fhd指的是默认按全高清打开,腾讯有几种画质选择,sd=标清,hd=高清,shd=超清,fhd=全高清。经过我的实际测试,不管你要下载的视频最高支持什么分辨率,接口处写fhs,都可以保证返回的数据里是最高画质的那个版本。比如一个视频最高支持高清,就返回高清的视频信息,如果最高支持超清,就返回超清,所以我在接口地址里用fhd。

红字标注的是视频ID,比如你打开的视频页面是http://v.qq.com/page/e/2/c/e01475xnl2c.html,那么视频ID就是e01475xnl2c


上述接口打开后得到这样一段文字:

QZJSONOUTPUT={……};大括号包围的范围是JSON数据,我们得把头部的QZJSONOUTPUT=和尾部的分号去掉,剩下的部分才能被JSON解析器所识别。


废话不多说,上代码。我用的Python,很省事。

#-*- coding: utf-8 -*-

import urllib
from json import *

def qqvideoparse(url):

	if "page" in url:
		vid = url.split("/")[-1].split(".")[0]
	elif "cover" in url:
		vid = url.split("=")[-1]
	else:
		print "网址错误,请检查!"
		exit()

	jsurl = "http://vv.video.qq.com/getinfo?vids="+vid+"&otype=json&defaultfmt=fhd"
	jspage = urllib.urlopen(jsurl)
	data = jspage.read()[13:-1]

	jsdata = JSONDecoder().decode(data)

	fvkey =  jsdata['vl']['vi'][0]['fvkey']
	keyid =  jsdata['vl']['vi'][0]['cl']['ci'][0]['keyid'].split(".")
	fn = keyid[0] + ".p" + keyid[1][2:] + "." + keyid[2] + ".mp4"
	server = jsdata['vl']['vi'][0]['ul']['ui'][3]['url']

	downurl = server + fn + "?vkey=" + fvkey + "?type=mp4"
	return downurl

url = raw_input("腾讯视频页面地址:")
downurl = qqvideoparse(url)
print "视频下载地址:"
print downurl

第一部分,if else用于判断视频页面地址的类型,目前我发现的有两种类型,分别是http://v.qq.com/page/e/m/k/e0147nl00mk.html,http://v.qq.com/cover/n/nvch2mx5yvdb8e0.html?vid=l0016hf9v44

这两种类型需要用不同的字符串分割来获得视频ID。


第二部分就是打开接口页,解析JSON数据。顺便说一句,JSON数据是一个嵌套格式,解析过后一般是dict类型内部包含list类型,list里面又包含dict,这样。具体的可以百度。这也决定了接下来的几行分别用哪些下标来获得所需的键值,在此就不详述键值位置了,感兴趣的可以自己解析一下试试。


fn = keyid[0] + ".p" + keyid[1][2:] + "." + keyid[2] + ".mp4"
这一句是要把JSON数据中的fn(文件名)替换一下,把其中的.10替换成.p,这样才能得到真实的文件名。


最后的下载地址形如 http://服务器地址/文件名?vkey=xxxxxxxxxx?type=mp4,所以关键是获取服务器地址和vkey,文件名很简单,就是视频ID+分辨率标识。另外,vkey是有有效期的,解析了地址之后要马上下载才行。

你可能感兴趣的:(腾讯,视频,解析,下载地址,json,Python)