本文仅仅用于编程学习研究,不做其他用途。
不知道怎么回事 总审核不过
首先,对输入的短链接进行URL解码,并将解码后的字符串存储在"decodeUrl"变量中。
接着,创建一个HashMap类型的数据"data",用于存储从哔哩哔哩网站中获取的视频信息。
调用HttpUtil类中的"getGetLocationtoutiao"方法,获取短链接对应的重定向链接,并将其存储在"location"变量中。
判断"location"变量中是否包含键名为"location"的键值对,如果存在,则说明获取重定向链接成功,将重定向链接存储在"redirctUrl"变量中。
创建一个HashMap类型的数据"headers",用于存储HTTP请求的头信息,并设置一些常见的头信息,如User-Agent、Accept等。
调用HttpUtil类中的"doGetAndHead"方法,发送GET请求并获取响应内容,将响应内容存储在"body"变量中。
对响应内容进行处理,将其中的";(function())"替换为"@",方便后续使用正则表达式匹配。
使用正则表达式匹配响应内容中"window.INITIAL_STATE="和";(function())"之间的内容,并将其存储在"initialStr"变量中。
public Map bilibili(String shortUrl) throws Exception { byte[] decode = URLDecoder.decode(shortUrl.getBytes()); String decodeUrl = new String(decode); HashMap<String, String> data = new HashMap<>(); Map<String, String> location = HttpUtil.getGetLocationtoutiao(decodeUrl); if (location.containsKey("location")) { String redirctUrl = location.get("location"); HashMap<String, String> headers = new HashMap<>(); //headers.put("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.46"); headers.put("user-agent", "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36"); headers.put("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"); headers.put("accept-encoding", "gzip, deflate, br"); String body = HttpUtil.doGetAndHead(redirctUrl, headers); String s = body.replaceAll(";\\(function\\(\\)", "@"); String initialReg = "window.__INITIAL_STATE__=([^@]+)"; Pattern initialP = Pattern.compile(initialReg); Matcher initialM = initialP.matcher(s); if (initialM.find()) { String initialStr = initialM.group(1); JSONObject jo = JSONObject.parseObject(initialStr); if (jo.containsKey("video")) { jo = jo.getJSONObject("video"); if(jo.containsKey("viewInfo")){ jo = jo.getJSONObject("viewInfo"); if (jo.containsKey("title")) { String title = jo.getString("title"); data.put("desc", title); } if (jo.containsKey("pic")) { String pic = jo.getString("pic"); String cover = URLDecoder.decodeForPath(pic, Charset.defaultCharset()); data.put("cover", toHttps(cover)); } } } } String playInfoReg = "var options = ([^;]+)"; Pattern p = Pattern.compile(playInfoReg); Matcher m = p.matcher(s); if(m.find()){ String group = m.group(1); JSONObject jo = JSONObject.parseObject(group); if(jo.containsKey("readyVideoUrl")){ String videoUrl = jo.getString("readyVideoUrl"); data.put("videoUrl",toHttps(videoUrl)); } } String playInfoReg = "window.__playinfo__=([^<]+)"; Pattern p = Pattern.compile(playInfoReg); Matcher m = p.matcher(s); if (m.find()) { String videoInfo = m.group(1); JSONObject jo = JSONObject.parseObject(videoInfo); if (jo.containsKey("data")) { jo = jo.getJSONObject("data"); if (jo.containsKey("dash")) { jo = jo.getJSONObject("dash"); if (jo.containsKey("video")) { JSONArray videos = jo.getJSONArray("video"); if (videos.size() > 0) { JSONObject videoJo = videos.getJSONObject(0); String baseUrl = videoJo.getString("baseUrl"); data.put("videoUrl", baseUrl); data.put("referer", redirctUrl); } } } } } } if (StringUtils.isNotBlank(data.get("videoUrl"))) { return data; } return null; }
更多平台源码的网盘地址:
链接:https://pan.baidu.com/s/1S-I6Pvv31iwNgzVTZVSLwA
提取码:rwtk 欢迎大家一起交流