爱萝莉真是太好了 爱萝莉真是太好了

努力让自己变得更优秀呀!

目录
解密腾讯视频获取真实m3u8源地址(Java)
/  

解密腾讯视频获取真实m3u8源地址(Java)

以下内容仅供学习使用,请勿用于非法用途

代码是在今年三月份写的,当时候捣鼓了一天,现在也有点忘了,就直接把代码贴出来吧,今天测试了一下还是可以用的

代码中有一些包还有方法是自己的,就不都粘贴出来了,如果直接复制代码的话,会有报错,需要再手动改改

 1<!--相关依赖-->
 2	<dependency>
 3    		<groupId>org.jsoup</groupId>
 4    		<artifactId>jsoup</artifactId>
 5    		<version>1.11.3</version>
 6	</dependency>
 7	<dependency>
 8		<groupId>cn.hutool</groupId>
 9		<artifactId>hutool-all</artifactId>
10		<version>5.1.0</version>
11	</dependency>
  1package com.Yang.watermark;
  2
  3import java.net.URLDecoder;
  4import java.net.URLEncoder;
  5import java.time.LocalDate;
  6import java.util.HashMap;
  7import java.util.Map;
  8
  9import org.jsoup.Jsoup;
 10import org.jsoup.nodes.Document;
 11
 12import com.alibaba.fastjson.JSONArray;
 13import com.alibaba.fastjson.JSONObject;
 14
 15import lombok.extern.slf4j.Slf4j;
 16
 17@Slf4j
 18public class TencentVideo{
 19
 20	String url  = "";
 21	String appVersion = "1.0.143";
 22	String platform = "10201";
 23	String v = "3.5.57";
 24	String encryptVer = "9.1";
 25
 26	public TencentVideo(String url) {
 27		this.url = url;
 28	}
 29
 30	@Override
 31	public String execute() {
 32		String start = "<link rel=\"canonical\" href=";
 33		HttpResponse response = requestNoHeader(url);
 34		String body = response.body();
 35		int indexOf = body.indexOf(start);
 36		body = body.substring(indexOf + start.length() + 1);
 37		int index = body.indexOf("\" />");
 38		body = body.substring(0,index);
 39		String[] split = body.split("/");
 40		String vid = split[split.length - 1].replaceAll(".html","");
 41		String[] split2 = url.split("/");
 42		String coverid = split2[split2.length - 1].replaceAll(".html","");
 43	
 44		//这儿替换成自己的生产随机数的方法就可以
 45		String flowid = RandomCharUtil.getRandomNumberLowerLetterChar(32) + "_" + platform;
 46		String tm = String.valueOf(System.currentTimeMillis()).substring(0,10);
 47		String rfid = RandomCharUtil.getRandomNumberLowerLetterChar(32) + "_" + tm;
 48		//这儿是cKet加密字符串的获取方式,调用自己的node服务,下文中有说明
 49		String cKey = HttpUtil.get("http://Ip:port/?vid="+ vid +"&tm=" + tm);
 50	
 51		log.info("vid:{}",vid);
 52		log.info("coverid:{}",coverid);
 53		log.info("flowid:{}",flowid);
 54		log.info("tm:{}",tm);
 55		log.info("rfid:{}",rfid);
 56		log.info("url:{}",url);
 57		log.info("cKey:{}",cKey);
 58	
 59		//登录了腾讯视频之后可以拿到cookie,直接粘贴在这儿就行
 60		String cookieStr = "";
 61		String[] split3 = cookieStr.split("; ");
 62		Map<String, String> cookieMap = new HashMap<String, String>();
 63		if(cookieStr != "" && cookieStr != null) {
 64			for(String str : split3) {
 65				cookieMap.put(str.split("=")[0], str.split("=")[1]);
 66			}
 67		}
 68	
 69	
 70		HttpRequest post = HttpUtil.createPost("https://vd.l.qq.com/proxyhttp");
 71		post.header("Referer" , url);
 72		String buildParam = buildParam(coverid, flowid, url, rfid, vid, cKey, tm , cookieMap);
 73		post.body(buildParam);
 74		//执行
 75		String res = post.execute().body();
 76		log.info(res);
 77		JSONArray ul = JSONObject.parseObject(res).getJSONObject("vinfo").getJSONObject("vl").getJSONArray("vi").getJSONObject(0).getJSONObject("ul").getJSONArray("ui");
 78		//这里拿数组最后一个,清晰度最高的
 79		JSONObject ui = ul.getJSONObject(ul.size()-1);
 80		if(cookieStr == "") {
 81			//没有登录使用这种方式获取,但是如果是vip电影获取出来的只有5分钟
 82			return ui.getString("url") + ui.getJSONObject("hls").getString("pt");
 83		}
 84		//如果登录了可以使用这种方式获取
 85		return ui.getString("url");
 86	}
 87
 88	public static String get(String address) {
 89		return new TencentVideo(address).execute();
 90	}
 91
 92	public static void main(String[] args) {
 93		log.info(TencentVideo.get("https://v.qq.com/x/cover/050w2y6nen7rud1.html"));
 94//		TencentVideo.get("https://v.qq.com/x/cover/bqejbbv8mgtusrs/u00242ise58.html");
 95	
 96	}
 97
 98
 99	public String buildParam(String coverid,String flowid,String url,String rfid , String vid , String cKey , String tm , Map<String, String> cookieMap) {
100	
101		boolean haveCookie = false;
102		if(!cookieMap.isEmpty()) {
103			haveCookie = true;
104		}
105	
106	
107		StringBuffer adparam = new StringBuffer();
108		adparam.append("ad_type=LD|KB|PVL").append("&");
109		adparam.append("adaptor=2").append("&");
110		adparam.append("appversion="+ appVersion).append("&");
111		adparam.append("chid=0").append("&");
112		adparam.append("coverid=" + coverid).append("&");
113		adparam.append("dtype=1").append("&");
114		adparam.append("flowid=" + flowid).append("&");
115		adparam.append("from=0").append("&");
116		adparam.append("guid=" + "d1384f3028935f6465a473a5a07113b5").append("&");
117		adparam.append("live=0").append("&");
118		adparam.append("pf=in").append("&");
119		adparam.append("platform=" + platform).append("&");
120		adparam.append("pf_ex=pc").append("&");
121		adparam.append("plugin=1.0.0").append("&");
122		adparam.append("pt=").append("&");
123		adparam.append("pu=0").append("&");
124		adparam.append("refer=" + url).append("&");
125		adparam.append("req_type=1").append("&");
126		adparam.append("resp_type=json").append("&");
127		adparam.append("rfid=" + rfid).append("&");
128		adparam.append("tpid=1").append("&");
129		adparam.append("ty=web").append("&");
130		adparam.append("url=" + url).append("&");
131		adparam.append("v=" + v).append("&");
132		adparam.append("vid=" + vid).append("&");
133		adparam.append("vptag=www_baidu_com");
134		if(haveCookie) {
135			String uid = cookieMap.get("vqq_vuserid");
136			String tkn = cookieMap.get("vqq_vusession");
137			String opid = cookieMap.get("vqq_openid");
138			String lt = cookieMap.get("main_login");
139			String atkn = cookieMap.get("vqq_access_token");
140			String appid = cookieMap.get("vqq_appid");
141		
142			adparam.append("&");
143			adparam.append("uid=" + uid).append("&");
144			adparam.append("tkn=" + tkn).append("&");
145			adparam.append("lt=" + lt).append("&");
146			adparam.append("opid=" + opid).append("&");
147			adparam.append("atkn=" + atkn).append("&");
148			adparam.append("appid=" + appid);
149		}
150		
151	
152	
153	
154		StringBuffer vinfoparam = new StringBuffer();
155		vinfoparam.append("appVer=" + v).append("&");
156		vinfoparam.append("cKey=" + cKey).append("&");
157		vinfoparam.append("charge=0").append("&");
158		vinfoparam.append("defaultfmt=auto").append("&");
159		vinfoparam.append("defn=fhd").append("&");//取值:fhd(蓝光) shd(超清)   hd(高清)  sd(标清)
160		vinfoparam.append("defnpayver=1").append("&");
161		vinfoparam.append("defsrc=1").append("&");
162		vinfoparam.append("dlver=2").append("&");
163		vinfoparam.append("drm=32").append("&");
164		vinfoparam.append("dtype=3").append("&");
165		vinfoparam.append("ehost=" + url).append("&");
166		vinfoparam.append("encryptVer=" + encryptVer).append("&");
167		vinfoparam.append("fhdswitch=0").append("&");
168		vinfoparam.append("flowid=" + flowid).append("&");
169		vinfoparam.append("fp2p=1").append("&");
170		vinfoparam.append("guid=" + "d1384f3028935f6465a473a5a07113b5").append("&");
171		vinfoparam.append("hdcp=0").append("&");
172		vinfoparam.append("host=v.qq.com").append("&");
173		vinfoparam.append("isHLS=1").append("&");
174	
175		if(haveCookie) {
176			String uid = cookieMap.get("vqq_vuserid");
177			String tkn = cookieMap.get("vqq_vusession");
178			String opid = cookieMap.get("vqq_openid");
179			String lt = cookieMap.get("main_login");
180			String atkn = cookieMap.get("vqq_access_token");
181			String appid = cookieMap.get("vqq_appid");
182		
183			String logintoken = "{\"main_login\":\""+ lt +"\",\"openid\":\""+ opid +"\",\"appid\":\""+ appid +"\",\"access_token\":\""+atkn+"\",\"vuserid\":\""+uid+"\",\"vusession\":\""+tkn+"\"}";
184			vinfoparam.append("logintoken=" + URLEncoder.encode(logintoken)).append("&");
185		}
186	
187	
188		vinfoparam.append("otype=ojson").append("&");
189		vinfoparam.append("platform=" + platform).append("&");
190		vinfoparam.append("refer=v.qq.com").append("&");
191		vinfoparam.append("sdtfrom=v1010").append("&");
192		vinfoparam.append("show1080p=1").append("&");
193		vinfoparam.append("spadseg=1").append("&");
194		vinfoparam.append("spau=1").append("&");
195		vinfoparam.append("spaudio=15").append("&");
196		vinfoparam.append("spgzip=1").append("&");
197		vinfoparam.append("sphls=2").append("&");
198		vinfoparam.append("sphttps=1").append("&");
199		vinfoparam.append("spwm=4").append("&");
200		vinfoparam.append("tm=" + tm).append("&");
201		vinfoparam.append("unid=cdbb5f0a6aad11ea981ca042d48ad00a").append("&");
202		vinfoparam.append("vid=" + vid);
203	
204	
205		//构造参数时buid可取值
206		//1.vinfoad(包含视频信息和广告)
207		//2.onlyvinfo(只包含视频信息)
208		return "{\"buid\":\"vinfoad\",\"adparam\":\"" + adparam.toString() + "\",\"vinfoparam\":\"" + vinfoparam.toString() + "\"}";
209	}
210
211	HttpResponse requestNoHeader(String url) {
212		return HttpUtil.createGet(url).execute();
213	}
214}
215

上边的代码中预留了一个调用 node 服务的地方,这个是一堆加密的玩意儿,需要一个 node 服务,还有一个 wasm 文件

点击此处下载 node 服务的 js 代码以及 wasm 文件

下载好之后直接按照 node 命令启动服务即可

启动之后把 node 服务的 ip 和端口填写在 Java 代码中(49 行左右)

接下来就可以运行 Java 脚本执行获取结果了,最后获取到的是 m3u8 的地址

里边有一些参数是固定的值(unid)(guid)之类的,不要去修改它,代码呢,可能写的比较low,哈哈哈


标题:解密腾讯视频获取真实m3u8源地址(Java)
地址:https://www.1-love.cn/get-tencent.html