解析腾讯视频上传视频源地址网址

        公司最近想用小程序播放腾讯视频的视频,由于小程序的微信接口只是调用视频的vid就能进行播放,但是在pc网页上进行播放就要拿到视频的真实地址,然而实际上腾讯视频上传后只是给你一个:https://v.qq.com/x/page/d0744x87gdd.html这样的网址,那么就需要我们在后台代码中进行解析,腾讯工程师非常调皮的是我们即便解析到真实地址过一段时间也会失效,所以需要随播随解

     下面上代码,笔者用的net.sf.json以及org.apache.commons    jar包,请自行查找! net.sf.json类与Gson、fastjson相似就不相应描述了!

  

package com.shop.util;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.net.ssl.HttpsURLConnection;

import org.apache.commons.collections.map.ListOrderedMap;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

/**
 * 解析腾讯视频上传地址
 * 
 * @author 艾洪凯 time:2018-12-28
 *
 */

public class JxQqVideo {
	public static String jiexi(String uri) {
		Map<String, Object> map = new HashMap<>();
		uri = uri.substring(uri.lastIndexOf("/") + 1, uri.lastIndexOf("."));
		uri = "vids=" + uri;
		String requestUrl = "http://vv.video.qq.com/getinfo?platform=101001&charge=0&otype=json&defn=shd";
		String response = "";
		try {
			response = getData(requestUrl, uri);
			response = response.replace("QZOutputJson=", "").replace(";", "");
			map = parseJSON2Map(response);
			Map<String, Object> map2 = (Map<String, Object>) map.get("vl");
			List<Map<String, Object>> list = (List<Map<String, Object>>) map2.get("vi");
			String vkey = list.get(0).get("fvkey").toString();// vkey
			String fn = list.get(0).get("fn").toString();// fn
			map2 = (Map<String, Object>) list.get(0).get("ul");
			list = (List<Map<String, Object>>) map2.get("ui");
			// 加判断
			String url1 = "";
			if (list.size() >= 2) {
				url1 = list.get(1).get("url").toString();
			} else {
				url1 = list.get(0).get("url").toString();
			}
			response = url1 + fn + "?vkey=" + vkey;
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return response;
	}

	public static Map<String, Object> parseJSON2Map(String jsonStr) {
		ListOrderedMap map = new ListOrderedMap();
		// 最外层解析
		JSONObject json = JSONObject.fromObject(jsonStr);
		for (Object k : json.keySet()) {
			Object v = json.get(k);
			// 如果内层还是数组的话,继续解析
			if (v instanceof JSONArray) {
				List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
				Iterator<JSONObject> it = ((JSONArray) v).iterator();
				while (it.hasNext()) {
					JSONObject json2 = it.next();
					list.add(parseJSON2Map(json2.toString()));
				}
				map.put(k.toString(), list);
			} else {
				if (v.toString().contains("{")) {
					map.put(k.toString(), parseJSON2Map(v.toString()));
				} else {
					map.put(k.toString(), v);
				}
			}
		}
		return map;
	}

	public static String getData(String url, String request) throws UnsupportedEncodingException, IOException {
		String charset = "UTF-8";
		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
		HttpURLConnection connect = (HttpURLConnection) (new URL(url).openConnection());
		connect.setRequestMethod("GET");
		connect.setDoOutput(true);
		connect.setConnectTimeout(1000 * 10);
		connect.setReadTimeout(1000 * 80);
		connect.setRequestProperty("ContentType", "application/x-www-form-urlencoded"); // 采用通用的URL百分号编码的数据MIME类型来传参和设置请求头
		connect.setDoInput(true);
		// 连接
		connect.connect();
		// 发送数据
		connect.getOutputStream().write(request.getBytes(charset));
		// 接收数据
		int responseCode = connect.getResponseCode();
		if (responseCode == HttpURLConnection.HTTP_OK) {
			InputStream in = connect.getInputStream();
			byte[] data = new byte[1024];
			int len = 0;
			while ((len = in.read(data, 0, data.length)) != -1) {
				outStream.write(data, 0, len);
			}
			in.close();
		}
		// 关闭连接
		connect.disconnect();
		String response = outStream.toString("UTF-8");
		return response;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(jiexi("https://v.qq.com/x/page/d0744x87gdd.html"));

	}

}

 运行结果:

浏览器浏览效果:

 

 代码写的不好,各位凑合看,还有什么好的方法,大家留言交流一下~

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
绕过腾讯会员解析视频需要模拟登录和解析腾讯视频的网页内容。以下是一个使用Python的示例,使用requests和BeautifulSoup库来实现: ```python import requests from bs4 import BeautifulSoup def get_real_video_url(url): try: # 发送请求获取网页内容 response = requests.get(url) # 解析网页内容 soup = BeautifulSoup(response.text, 'html.parser') # 查找视频真实地址的相关元素 script_tag = soup.find('script', {'type': 'text/javascript'}) video_data = script_tag.string # 提取视频真实地址 real_url_start = video_data.find('url":"') + 6 real_url_end = video_data.find('",', real_url_start) real_url = video_data[real_url_start:real_url_end] return real_url except requests.exceptions.RequestException as e: print("请求发生异常:", str(e)) return None except (KeyError, TypeError) as e: print("未找到视频真实地址:", str(e)) return None if __name__ == '__main__': target_url = 'http://v.qq.com/xxx' # 替换为腾讯视频的目标视频页面URL real_video_url = get_real_video_url(target_url) if real_video_url: print("视频真实地址:", real_video_url) ``` 请注意,上述示例中的`target_url`需要替换为您要解析视频腾讯视频页面的URL。然后,使用`requests`库发送HTTP请求获取网页内容,并使用`BeautifulSoup`库对网页进行解析。根据腾讯视频网页的结构,使用`find()`方法或其他方法定位到包含视频真实地址的相关元素,并提取出真实地址。 但需要注意的是,腾讯视频可能会对视频地址进行保护或采取防爬虫措施,这可能导致上述方法无法成功解析视频地址。此外,根据腾讯视频的使用条款,未经授权访问和解析腾讯视频的内容可能违反相关法律法规。请确保您的行为合法合规,并尊重视频提供商的权益。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值