|
|
本帖最后由 老王 于 2022-9-20 13:37 编辑
前些天突发奇想写一个解析蓝奏云直链的工具类,其实也没有多难。写完了决定发出来
emm,这个用途不用多说了吧,直链获取,直接获取直链,可以用来APP更新,省的跳转浏览器。适合个人开发者。也可以用来显示图片。
因为自己的项目用到了jsoup,所以这个工具也是基于jsoup制作的,在使用前请引入jsoup依赖
下面是代码
- import java.io.IOException;
- import org.jsoup.Connection;
- import org.jsoup.Jsoup;
- import org.jsoup.nodes.Document;
- import org.jsoup.nodes.Element;
- import java.util.Date;
- import java.util.Map;
- import java.util.HashMap;
- import org.json.JSONObject;
- public class LcAnalyseUtil {
- private static boolean isPwd = false;
- private static String lanzou_link;
- private static String link_password;
- private String[] sublink;
- private String userAgent = "Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36";
- public static Map<String,String> responseData = new HashMap<>();
- public LcAnalyseUtil() {}
- public LcAnalyseUtil isPwd(boolean isPwd) {
- this.isPwd = isPwd;
- return this;
- }
- public LcAnalyseUtil setNeedAnalyseLink(String lanzou_link) {
- if (lanzou_link != null) {
- this.lanzou_link = lanzou_link;
- }
- return this;
- }
- public LcAnalyseUtil setLinkPassWord(String link_password) {
- if (link_password != null) {
- this.link_password = link_password;
- }
- return this;
- }
- public String start() {
- if (this.lanzou_link != null) {
- //将链接截取拼接成下载页链接
- sublink = this.lanzou_link.replace("http://", "").replace("https://", "").split("/");
- if (isPwd) {
- if (this.link_password != null) {
- return getHasPassword("https://" + sublink[0] + "/tp/" + sublink[1]);
- } else {
- return "密码为空";
- }
- } else {
- return getNoPasswod("https://" + sublink[0] + "/tp/" + sublink[1]);
- }
- }
- return "未知错误";
- }
- private String getNoPasswod(String url) {
- try{
- Document doc = Jsoup.parse(handlerHttp(url,this.lanzou_link,null,null).get("body"));
- for(Element e : doc.getElementsByTag("script").eq(0)){
- String cppat = e.data().split("cppat")[1].split("'")[1];
- String down_sign = e.data().split("submit.href")[1].split("'")[1];
- Map<String,String> lastMap = handlerHttp(cppat+down_sign,url,null,null);
- if(lastMap.containsKey("Location")){
- return lastMap.get("Location");
- }
- return "解析失败,请检查链接格式是否正确";
- }
- }catch(Exception e){
- }
- return "解析失败,链接格式有误";
- }
- private String getHasPassword(String url) {
- try {
- Document doc = Jsoup.parse(handlerHttp(url, this.lanzou_link, null, null).get("body"));
- //循环遍历js得到数据
- String download_sign = null;
- for (Element element:doc.getElementsByTag("script").eq(1)) {
- String[] jsAllVariable = element.data().split("var");
- for (String variable : jsAllVariable) {
- if (variable.contains("=") && variable.contains("posign")) {
- download_sign = variable.split("=")[1].split("'")[1];
- break;
- }
- }
- }
- //填写post表单
- Map<String,String> parms = new HashMap<>();
- parms.put("action", "downprocess");
- parms.put("sign", download_sign);
- parms.put("p", this.link_password);
- //发送post请求并解析JSON数据
- JSONObject responseJson = new JSONObject(handlerHttp("https://" + sublink[0] + "/ajaxm.php", url, "https://" + sublink[0], parms).get("body"));
- responseData.put("documentName", responseJson.getString("inf"));
- //最后获取直链
- String lastUrl = responseJson.getString("dom") + "/file/" + responseJson.getString("url");
- Map<String,String> lastMap = handlerHttp(lastUrl, url, null, null);
- if (lastMap.containsKey("Location")) {
- return lastMap.get("Location");
- }
- return "解析失败,请检查密码是否正确";
- } catch (Exception e) {
- }
- return "解析失败,请检查密码是否正确";
- }
- private Map<String,String> handlerHttp(String url, String referer, String origin, Map<String,String> parms) {
- Map<String,String> requestMap = new HashMap<>();
- requestMap.clear();
- try {
- Connection connection = Jsoup.connect(url);
- connection.followRedirects(false);
- connection.ignoreContentType(true);
- connection.ignoreHttpErrors(true);
- connection.method(Connection.Method.POST);
- connection.userAgent(userAgent);
- connection.header("Accept-Language", "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7");
- connection.header("Origin", origin);
- connection.header("Referer", referer);
- if (parms != null) {
- connection.data(parms);
- }
- Connection.Response doc = connection.ignoreContentType(true).execute();
- requestMap.put("body", doc.body());
- requestMap.putAll(doc.headers());
- return requestMap;
- } catch (IOException e) {
- e.printStackTrace();
- }
- return null;
- }
- }
复制代码
用法也很简单
- 只需要new一个对象再传入参数,即可
- 例如:
- new LcAnalyseUtil()
- .isPwd(true)//是否有密码,默认为false
- .setNeedAnalyseLink("")//链接
- .setLinkPassWord("")//密码没有可不填
- .start();//开始解析,返回类型String
- 你也可以使用
- LcAnalyseUtil.responseData.get("documentName");
- 来获取文件名称
- 注意:因为本工具涉及网络请求,所以如果您在Android项目中使用请务必在线程中调用
复制代码
好了,制作不易,请多支持
|
-
查看全部评分
总评分:好评 +1
金币 +5
|