返回列表 发新帖

【Java工具类源码】蓝奏云直链获取v1.0

  [复制链接]

10

主题

721

回帖

2591

积分

大学生

Rank: 5Rank: 5

金币
1244
好评
12
信誉
109

MT论坛帅哥2019-5.1节快乐考神MT论坛新人MT论坛最佳新人MT论坛活跃会员

QQ
发表于 2022-9-20 13:32:16 来自手机  | 显示全部楼层 | 阅读模式  来自 江西
本帖最后由 老王 于 2022-9-20 13:37 编辑

前些天突发奇想写一个解析蓝奏云直链的工具类,其实也没有多难。写完了决定发出来

emm,这个用途不用多说了吧,直链获取,直接获取直链,可以用来APP更新,省的跳转浏览器。适合个人开发者。也可以用来显示图片。

因为自己的项目用到了jsoup,所以这个工具也是基于jsoup制作的,在使用前请引入jsoup依赖

下面是代码
  1. import java.io.IOException;
  2. import org.jsoup.Connection;
  3. import org.jsoup.Jsoup;
  4. import org.jsoup.nodes.Document;
  5. import org.jsoup.nodes.Element;
  6. import java.util.Date;
  7. import java.util.Map;
  8. import java.util.HashMap;
  9. import org.json.JSONObject;

  10. public class LcAnalyseUtil {
  11.     private static boolean isPwd = false;
  12.     private static String lanzou_link;
  13.     private static String link_password;
  14.     private String[] sublink;
  15.     private String userAgent = "Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36";
  16.     public static Map<String,String> responseData = new HashMap<>();


  17.     public LcAnalyseUtil() {}

  18.     public LcAnalyseUtil isPwd(boolean isPwd) {
  19.         this.isPwd = isPwd;
  20.         return this;
  21.     }

  22.     public LcAnalyseUtil setNeedAnalyseLink(String lanzou_link) {
  23.         if (lanzou_link != null) {
  24.             this.lanzou_link = lanzou_link;
  25.         }
  26.         return this;
  27.     }

  28.     public LcAnalyseUtil setLinkPassWord(String link_password) {
  29.         if (link_password != null) {
  30.             this.link_password = link_password;
  31.         }
  32.         return this;
  33.     }

  34.     public String start() {
  35.         if (this.lanzou_link != null) {
  36.             //将链接截取拼接成下载页链接
  37.             sublink = this.lanzou_link.replace("http://", "").replace("https://", "").split("/");
  38.             if (isPwd) {
  39.                 if (this.link_password != null) {
  40.                     return getHasPassword("https://" + sublink[0] + "/tp/" + sublink[1]);
  41.                 } else {
  42.                     return "密码为空";
  43.                 }
  44.             } else {
  45.                 return getNoPasswod("https://" + sublink[0] + "/tp/" + sublink[1]);
  46.             }
  47.         }
  48.         return "未知错误";
  49.     }

  50.     private String getNoPasswod(String url) {
  51.         try{
  52.             Document doc = Jsoup.parse(handlerHttp(url,this.lanzou_link,null,null).get("body"));
  53.             for(Element e : doc.getElementsByTag("script").eq(0)){
  54.                 String cppat = e.data().split("cppat")[1].split("'")[1];
  55.                 String down_sign = e.data().split("submit.href")[1].split("'")[1];
  56.                 Map<String,String> lastMap = handlerHttp(cppat+down_sign,url,null,null);
  57.                 if(lastMap.containsKey("Location")){
  58.                     return lastMap.get("Location");
  59.                 }
  60.                 return "解析失败,请检查链接格式是否正确";
  61.             }
  62.         }catch(Exception e){
  63.         }
  64.         return "解析失败,链接格式有误";
  65.     }

  66.     private String getHasPassword(String url) {
  67.         try {
  68.             Document doc = Jsoup.parse(handlerHttp(url, this.lanzou_link, null, null).get("body"));
  69.             //循环遍历js得到数据
  70.             String download_sign = null;
  71.             for (Element element:doc.getElementsByTag("script").eq(1)) {
  72.                 String[] jsAllVariable = element.data().split("var");
  73.                 for (String variable : jsAllVariable) {
  74.                     if (variable.contains("=") && variable.contains("posign")) {
  75.                         download_sign = variable.split("=")[1].split("'")[1];
  76.                         break;
  77.                     }
  78.                 }
  79.             }
  80.             //填写post表单
  81.             Map<String,String> parms = new HashMap<>();
  82.             parms.put("action", "downprocess");
  83.             parms.put("sign", download_sign);
  84.             parms.put("p", this.link_password);
  85.             //发送post请求并解析JSON数据
  86.             JSONObject responseJson = new JSONObject(handlerHttp("https://" + sublink[0] + "/ajaxm.php", url, "https://" + sublink[0], parms).get("body"));
  87.             responseData.put("documentName", responseJson.getString("inf"));
  88.             //最后获取直链
  89.             String lastUrl = responseJson.getString("dom") + "/file/" + responseJson.getString("url");
  90.             Map<String,String> lastMap = handlerHttp(lastUrl, url, null, null);
  91.             if (lastMap.containsKey("Location")) {
  92.                 return lastMap.get("Location");
  93.             }
  94.             return "解析失败,请检查密码是否正确";
  95.         } catch (Exception e) {
  96.         }
  97.         return "解析失败,请检查密码是否正确";
  98.     }

  99.     private Map<String,String> handlerHttp(String url, String referer, String origin, Map<String,String> parms) {
  100.         Map<String,String> requestMap = new HashMap<>();
  101.         requestMap.clear();
  102.         try {
  103.             Connection connection = Jsoup.connect(url);
  104.             connection.followRedirects(false);
  105.             connection.ignoreContentType(true);
  106.             connection.ignoreHttpErrors(true);
  107.             connection.method(Connection.Method.POST);
  108.             connection.userAgent(userAgent);
  109.             connection.header("Accept-Language", "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7");
  110.             connection.header("Origin", origin);
  111.             connection.header("Referer", referer);
  112.             if (parms != null) {
  113.                 connection.data(parms);
  114.             }
  115.             Connection.Response doc = connection.ignoreContentType(true).execute();
  116.             requestMap.put("body", doc.body());
  117.             requestMap.putAll(doc.headers());
  118.             return requestMap;
  119.         } catch (IOException e) {
  120.             e.printStackTrace();
  121.         }
  122.         return null;
  123.     }
  124. }
复制代码


用法也很简单
  1. 只需要new一个对象再传入参数,即可
  2. 例如:
  3. new LcAnalyseUtil()
  4.             .isPwd(true)//是否有密码,默认为false
  5.             .setNeedAnalyseLink("")//链接
  6.             .setLinkPassWord("")//密码没有可不填
  7.         .start();//开始解析,返回类型String

  8. 你也可以使用
  9. LcAnalyseUtil.responseData.get("documentName");
  10. 来获取文件名称

  11. 注意:因为本工具涉及网络请求,所以如果您在Android项目中使用请务必在线程中调用
复制代码


好了,制作不易,请多支持
已有1人评分好评 金币 理由
快乐小牛 + 1 + 5 赞一个!

查看全部评分 总评分:好评 +1  金币 +5 

回复

使用道具 举报

10

主题

721

回帖

2591

积分

大学生

Rank: 5Rank: 5

金币
1244
好评
12
信誉
109

MT论坛帅哥2019-5.1节快乐考神MT论坛新人MT论坛最佳新人MT论坛活跃会员

QQ
发表于 2022-9-20 13:36:00 来自手机  | 显示全部楼层  来自 江西
如果您的项目不需要用到jsoup,您可以手动剔除,修改handlerHttp方法即可
回复

使用道具 举报

5

主题

4431

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
8190
好评
10
信誉
195

MT论坛最佳新人考神MT论坛新人

QQ
发表于 2022-9-20 13:34:20 来自手机  | 显示全部楼层  来自 江西
感谢分享
回复

使用道具 举报

46

主题

5615

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
6216
好评
200
信誉
280

MT论坛最佳新人考神MT论坛帅哥MT论坛新人MT论坛活跃会员MT论坛侠客

发表于 2022-9-20 13:41:46 来自手机  | 显示全部楼层  来自 湖北
感谢分享
回复

使用道具 举报

14

主题

2700

回帖

8960

积分

硕士生

Friday

Rank: 6Rank: 6

金币
3466
好评
2
信誉
100

MT论坛最佳新人MT论坛帅哥考神

发表于 2022-9-20 13:46:08 来自手机  | 显示全部楼层  来自 贵州
感谢分享
回复

使用道具 举报

5

主题

2143

回帖

5116

积分

硕士生

Rank: 6Rank: 6

金币
1659
好评
0
信誉
100
发表于 2022-9-20 14:00:14 来自手机  | 显示全部楼层  来自 广东
学习学习
回复

使用道具 举报

50

主题

2504

回帖

9503

积分

硕士生

Rank: 6Rank: 6

金币
1138
好评
69
信誉
118

考神

QQ
发表于 2022-9-20 14:06:42 来自手机  | 显示全部楼层  来自 云南
感谢分享
回复

使用道具 举报

175

主题

8838

回帖

2万

积分

博士后

Rank: 8Rank: 8

金币
7383
好评
29
信誉
165

MT论坛新人MT论坛帅哥考神MT论坛最佳新人MT论坛灌水老大MT论坛活跃会员

发表于 2022-9-20 14:08:45 来自手机  | 显示全部楼层  来自 河南
感谢大佬
回复

使用道具 举报

68

主题

3198

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
4760
好评
31
信誉
101

考神MT论坛帅哥MT论坛新人MT论坛活跃会员MT论坛最佳新人

发表于 2022-9-20 14:10:56 来自手机  | 显示全部楼层  来自 西藏
感谢分享
回复

使用道具 举报

10

主题

2093

回帖

8487

积分

硕士生

Rank: 6Rank: 6

金币
6496
好评
1
信誉
193
发表于 2022-9-20 14:14:41 来自手机  | 显示全部楼层  来自 重庆
感谢分享
回复

使用道具 举报

1

主题

612

回帖

2135

积分

大学生

Rank: 5Rank: 5

金币
85
好评
0
信誉
101
发表于 2022-9-20 14:26:00 来自手机  | 显示全部楼层  来自 新疆–库尔勒
过来看看
回复

使用道具 举报

0

主题

2463

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
5792
好评
0
信誉
134

MT论坛帅哥考神

发表于 2022-9-20 14:29:38 来自手机  | 显示全部楼层  来自 湖北
看看分享
回复

使用道具 举报

63

主题

3408

回帖

1万

积分

博士生

傲辰哥哥

Rank: 7Rank: 7Rank: 7

金币
5415
好评
28
信誉
202
发表于 2022-9-20 14:42:09 来自手机  | 显示全部楼层  来自 河北
回复看看隐藏
回复

使用道具 举报

37

主题

2285

回帖

7069

积分

硕士生

Rank: 6Rank: 6

金币
1054
好评
6
信誉
100
发表于 2022-9-20 14:43:25 来自手机  | 显示全部楼层  来自 云南
看看。。。
回复

使用道具 举报

0

主题

6570

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
6322
好评
0
信誉
108

考神MT论坛新人MT论坛帅哥

发表于 2022-9-20 14:43:56 来自手机  | 显示全部楼层  来自 江苏
感谢分享
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表