用java解析皮皮虾视频实现无水印下载

  为什么会有这篇文章的诞生呢?或许是因为我闲的,想找点东西练练手吧!

  段友出征,寸草不生,这是属于曾经每一位段友的暗号。不过现在也一去不复返了,取而代之的就是这个皮皮虾了,还是原来的样子,但是已经没有了原来的味道。

  话不多说,进入今天的主题。每当刷着皮皮虾的时候,遇到好看的视频想保存,但是保存下来都会有水印,虽然不影响整体视频观看效果,但是看着就是碍眼,感觉像贴了一块牛皮癣一样。

  以前在网上找的无水印解析工具也都经常失灵。作为开发人员的我,怎么能忍,所以想着自己做个工具,毕竟自己动手才能丰衣足食嘛!

  首先打开皮皮虾随便找了个视频,复制分享链接到电脑chrome浏览器中打开。

  啥?为什么随便找的视频小姐姐都那么漂亮?我反手就是一个巴掌,皮友发的视频哪有不好看的。(是不是该给点广告费!)

  常规操作F12也打开,刷新一下,观察所有请求的链接。

  通过上图可以观察到,软件内复制的链接是一个短链接,相当于一个短网址一样,哎!说到短网址,欢迎查看的另一篇文章《一小时快速撸出一个短网址生成项目》 ,我滴娘来,偏了,跑题了。回过来继续看,请求这个短网址会看到有一个302重定向的过程,重定向到哪呢?就是Response中location的参数,这个参数就是再次请求的一个地址。继续查看这个地址会返回什么。

  不难发现这个地址响应的就是一个页面,content-type: text/html; charset=utf-8,也就是整个页面,那好吧,你返回一整个页面,那我就看看页面源代码中能不能找到真实无水印的视频地址吧。

  不看不知道,一看一懵逼,这他娘的谁能找得到有用信息,得,还是继续往下看看其他请求都是干什么的吧!

  选中XHR查看所有的接口请求,发现第一个接口返回的json中包含了所有想要的信息,发帖人信息,帖子信息,有水印的视频链接、视频封面图链接,无水印的视频链接、视频封面图链接等等。都包含在了这一个接口中,好啊,这不就是想要的吗,但是我又思考,代码该怎么写呢,怎么通过一个分享的短链接去获取到这个接送呢,像那种一个链接就返回一串json的请求还好操作,直接代码请求,获取相应json就可以了。

  但是这个短链接302重定向了一次真实地址,然后又请求了一个接口才得到的数据啊!

  通过分析真实地址和接口地址找到了突破口,先看看这两个地址之间的联系,上地址:
  真实地址:https://h5.pipix.com/item/6762160710051961101?app_id=1319&app=super&timestamp=1582362058&user_id=5516739140&carrier_region=cn&region=cn&language=zh&utm_source=weixin
  json接口:https://h5.pipix.com/bds/webapi/item/detail/?item_id=6762160710051961101&source=share

  不难发现两者的联系已经很明显了,就是那串数字item_id=6762160710051961101,而且json接口是GET请求,无任何其他参数了。

  所以思路就有了,能不能通过重定向的地址获取item_id,然后进行拼接json接口的地址再请求呢?后来敲代码证实是可以的。

  不过这地方有两个问题:1.怎么能获取到重定向的网址。2.怎么通过地址截取出来那串数字。

  其实这些问题都不是问题,哈哈,第一个问题直接获取response中的location,第二个问题直接正则匹配就完事了。还有写代码时,直接不带header的去请求接口是不返回json数据的,必须加上User-Agent才好使。

  所以到此就基本结束了,有了思路,代码一眨眼就搞定了。下面关门,放代码。代码整体很简单,就不多说了。

  我把这个功能放到了我的助聊软件 上面去了,软件软件也不仅这一个功能,还有很多丰富干货,欢迎大家下载使用,多多支持。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/**
* 解析链接获取标题和无水印视频地址
*
* @return json
*/
@PostMapping("/getPipixiaVideo")
@ResponseBody
public String getPipixiaVideo(HttpServletRequest request) {
final String pwd = "wjup.top";
JSONObject json = new JSONObject();

String videoUrl = request.getParameter("videoUrl");
String value = request.getParameter("value");
String redirectUrl = null;
if (pwd.equals(value)) {
try {
redirectUrl = getRedirectUrl(videoUrl);
} catch (Exception e) {
e.printStackTrace();
}
String digitAfter = getDigitAfter(redirectUrl);
String apiUrl = "https://h5.pipix.com/bds/webapi/item/detail/?item_id=" + digitAfter + "&source=share";

String urlData = getUrlData(apiUrl, HttpMethod.GET);
JSONObject jsonObject = JSONObject.parseObject(urlData);
JSONObject video = jsonObject.getJSONObject("data").getJSONObject("item").getJSONObject("video");
// 标题
String title = video.getString("text");

// 无水印视频链接
String downVideo = video.getJSONObject("video_fallback").getJSONArray("url_list").getJSONObject(0).getString("url");

// 无水印封面图
String downImg = video.getJSONObject("video_fallback").getJSONObject("cover_image").getJSONArray("url_list").getJSONObject(0).getString("url");

json.put("videoTitle", title);
json.put("downVideo", downVideo);
json.put("downImg", downImg);
} else {
json.put("msg", 404);
}

return json.toJSONString();
}

/**
* 获取重定向地址
*
* @param path
* @return url
* @throws Exception
*/
private String getRedirectUrl(String path) throws Exception {
HttpURLConnection conn = (HttpURLConnection) new URL(path)
.openConnection();
conn.setInstanceFollowRedirects(false);
conn.setConnectTimeout(5000);
return conn.getHeaderField("Location");
}

/**
* 获取接口返回的json
*
* @param url
* @param method
* @return json
*/
public String getUrlData(String url, HttpMethod method) {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(10 * 1000);
factory.setReadTimeout(10 * 1000);
RestTemplate template = new RestTemplate(factory);
HttpHeaders headers = new HttpHeaders();
headers.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36");
headers.set("Accept", "*/*");
HttpEntity<String> requestEntity = new HttpEntity<String>(headers);
// 执行HTTP请求
ResponseEntity<String> response = template.exchange(url, method, requestEntity, String.class);
return response.getBody();
}

/**
* 正则匹配数字
*
* @param content
*/
public String getDigitAfter(String content) {
Pattern p = compile("\\d{5,}");
Matcher m = p.matcher(content);
boolean result = m.find();
String find_result = null;
if (result) {
find_result = m.group();
return find_result;
} else {
return "";
}
}

-------------本文结束感谢您的阅读-------------
感觉文章不错,就赏个吧!
0%