蓝奏云,大家肯定都用过,如果搞到直链的话,相信你们聪明的脑袋瓜,已经知道可以搞什么了,话不多说开始分析,先从最基本的单文件解析开始。
打开bp开始抓包,点击代理打开拦截,打开内置浏览器
然后在浏览器里面进行着正常的输入密码下载操作,记得在bp里面放行,然后就可以开始分析了,点击http历史记录
点击第一个链接
在右侧响应中我们可以看见这段js代码
function down_p(){
var pwd =document.getElementById('pwd').value;
if (pwd == '' || pwd == undefined || pwd == null) {
$(".passwdinput").focus();
return false;
}
var skdklds = 'VzFXaV5vAjNRWAI9BDQHO1c8DjxfMVdsUmBXZVc6BzdVZQV0DCVXPgluUDEDZlxvB28BPVY6UGdRYQY3';
$.ajax({
type : 'post',
url : '/ajaxm.php?file=171954110',
//data : 'action=downprocess&sign=VTMAPgs6UG&p='+pwd,
//data : '&p='+pwd,
//data : 'action=downprocess&sign=c20230818&p='+pwd,
data : { 'action':'downprocess','sign':skdklds,'p':pwd },
//data : 'p='+pwd+'&',
dataType : 'json',
success:function(msg){
var date = msg;
if(date.zt == '1'){
$("#downajax").html("<a href="+date.dom+"/file/"+ date.url +" target=_blank rel=noreferrer>下载</a>");
$("#passwddiv").hide();
$("#filenajax").text(date.inf);
document.title = date.inf;
$(".n_box_des").show();
$("#file").removeClass("filter");
}else{
$("#info").text(date.inf);
};
},
error:function(){
$("#info").html("失败,请刷新");
}
});
}
回到bp,可以看见我们第二个链接就是从这段代码中构造的
现在我们可以看见其构造参数和响应内容
注意这里有个坑
其直链构造方式中间有**/file/**字段是在前端拼接的
还有几个坑我一次性说完,蓝奏所有请求必须全部携带User-Agent,以及Referer,cookie不需要携带传入
接下来就可以开始写代码了,这里我用Java来写
先引入依赖
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.1</version>
</dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.47</version>
</dependency>
我是springboot项目,我就写一个Controller,请求方式为get,参数自主拼接,获取用户传入的url和password
@RequestMapping("/LanZou")
public String LanZou(@RequestParam String url,@RequestParam String PassWord) throws IOException {
return null;
}
接下来就是去匹配参数,这里我采用最朴素的正则表达式,有更好的方法的话欢迎补充。
@RequestMapping("/LanZou")
public String LanZou(@RequestParam String url,@RequestParam String PassWord) throws IOException {
String html=requests.GetWebPage(url);
String SignPattern = "var skdklds = '(.*)';";
String FilePattern = "/ajaxm\\.php\\?file=(\\d+)";
String UrlPattern = "(https?://[^/]+)";
String sign = characterTools.getCharacter(html, SignPattern, 1);//获取sign
String FileCode =characterTools.getCharacter(html, FilePattern, 1);//获取urls
String url_1 = characterTools.getCharacter(url, UrlPattern, 0);
String MessageUrl =url_1+ "/ajaxm.php?file=" + FileCode;
String Params = "action=downprocess&sign=" + sign + "&p="+PassWord;
String responseData = requests.PostWithData(MessageUrl, Params, url_1);
JSONObject jsonObject = JSONObject.parseObject(responseData);
String dom = (String) jsonObject.get("dom");
String lat = (String) jsonObject.get("url");
String inf = (String) jsonObject.get("inf");
JSONObject json = new JSONObject();
json.put("code", 200);
json.put("msg", "success");
JSONObject data = new JSONObject();
data.put("info", inf);
data.put("url", dom + "/file/" + lat);
json.put("data", data);
return json.toJSONString();
}
给出我用到的方法
/**
* 获取字符
* @param Text 文本
* @param Patter 正则
* @param code 代码
* @return 字符
*/
public String getCharacter(String Text,String Patter,int code) {
Pattern r = Pattern.compile(Patter);
Matcher m = r.matcher(Text);
if (m.find()){
return m.group(code);
}
return null;
}
private final OkHttpClient client = new OkHttpClient();
/**
* 发起 POST 请求
* @param url 请求地址
* @param Params 请求体
* @return 返回请求结果
* @throws IOException 请求异常
*/
public String PostWithData(String url,String Params,String Referer) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.addHeader("Referer", Referer)
.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36")
.post(RequestBody.create(Params, MediaType.parse("application/x-www-form-urlencoded")))
.build();
// 发送请求并获取响应
try {
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
return response.body().string();
} else {
System.out.println("Request failed");
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 下载网页
* @param url 网页地址
* @return 返回网页内容
*/
public String GetWebPage(String url) {
Request request = new Request.Builder()
.url(url)
.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36")
.build();
try {
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
return response.body().string();
} else {
// 请求失败
System.out.println("请求失败: " + response.code() + " " + response.message());
}
} catch (IOException e) {
// 异常处理
e.printStackTrace();
}
return null;
}
其实走到这步这并不是最终的链接,最终的链接在请求这个链接后的响应头里面
我们需要获取到这个Location响应头,这个才是最终直链,至于怎么获取,应该不必我说了吧,对于单文件解析是比较简单的,新手可以去练练,在文件夹解析中,蓝奏云,连变量名都是随机的,具有有效期,下一篇我会讲到。