Kuaishou share link information crawl

Kuaishou share link information crawl

package com.chuji.util.kuaishou;

import com.alibaba.fastjson.JSONObject;
import com.chuji.model.VO.KuaiShouVO;
import com.chuji.model.VO.UrlResultVO;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

/**
 * @Author: tangziqian
 * @Description: 快手分享链接信息爬取
 * @Date: Created in 16:08 2021/3/17
 * @Modified By:
 */
public class KuaiShouShareUtil {

    /**
     * 根据分享的链接获取重定向之后的url
     * @param ksUrl
     * @return
     * @throws Exception
     */
    public static String redirectCan(String ksUrl) throws Exception {
        URL url = new URL(ksUrl);
        HttpURLConnection conn=(HttpURLConnection)url.openConnection();
        conn.getResponseCode();
        //重定向之后的url
        String realUrl=conn.getURL().toString();

        String[] strs = realUrl.split("/");

        String splitUrl = "";

        boolean boo = false;
        for (String aa:strs) {
            if(boo){
                splitUrl = aa;
                break;
            }
            if("short-video".equals(aa)){
                boo = true;
            }
        }

        String[] strss = splitUrl.split("\\?");

        String record = doPost("https://video.kuaishou.com/graphql",strss[0]);

        return record;
    }

    public static String doPost(String url,String videoId){
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            URLConnection conn = realUrl.openConnection();
            // 设置通用的请求属性
            conn.setRequestProperty("Cookie", "did=web_ce64ca4fed7f4c798368e7ae5de28191; didv=1615893861000; kpf=PC_WEB; kpn=KUAISHOU_VISION; clientid=3; client_key=65890b29; needLoginToWatchHD=1");
            conn.setRequestProperty("content-type","application/json");
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            out = new PrintWriter(conn.getOutputStream());

            // 设置请求属性
            String param = "{\"operationName\": \"visionVideoDetail\",\"query\": \"query visionVideoDetail($photoId: String, $type: String, $page: String, $webPageArea: String) {\\n  visionVideoDetail(photoId: $photoId, type: $type, page: $page, webPageArea: $webPageArea) {\\n    status\\n    type\\n    author {\\n      id\\n      name\\n      following\\n      headerUrl\\n      __typename\\n    }\\n    photo {\\n      id\\n      duration\\n      caption\\n      likeCount\\n      realLikeCount\\n      coverUrl\\n      photoUrl\\n      liked\\n      timestamp\\n      expTag\\n      llsid\\n      viewCount\\n      videoRatio\\n      stereoType\\n      __typename\\n    }\\n    tags {\\n      type\\n      name\\n      __typename\\n    }\\n    commentLimit {\\n      canAddComment\\n      __typename\\n    }\\n    llsid\\n    __typename\\n  }\\n}\\n\",\"variables\": {\"photoId\": \""+videoId+"\", \"page\": \"detail\"}}";

            // 发送请求参数
            out.print(param);
            // flush输出流的缓冲
            out.flush();
            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(
                    new InputStreamReader(conn.getInputStream(), "utf-8"));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.err.println("发送 POST 请求出现异常!" + e);
            e.printStackTrace();
        }
        // 使用finally块来关闭输出流、输入流
        finally {
            try {
                if (out != null) {
                    out.close();
                }
                if (in != null) {
                    in.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        return result;
    }

    /**
     * 解析json
     * @param url
     */
    public static KuaiShouVO kuaiShowVideo(String url) throws Exception {
        String record = redirectCan(url);
        KuaiShouVO kuaiShouVO = jiexiJSON(record);
        return kuaiShouVO;
    }

    public static KuaiShouVO jiexiJSON(String json){
        JSONObject jsonObject1 =JSONObject.parseObject(json);
        JSONObject obj1 = (JSONObject) jsonObject1.get("data");
        JSONObject obj2 = (JSONObject) obj1.get("visionVideoDetail");
        JSONObject obj3 = (JSONObject) obj2.get("author");
        JSONObject obj4 = (JSONObject) obj2.get("photo");

        KuaiShouVO kuaiShouVO = new KuaiShouVO();
        kuaiShouVO.setKsId(obj3.getString("id"));
        kuaiShouVO.setKsName(obj3.getString("name"));
        kuaiShouVO.setKsHeaderUrl(obj3.getString("headerUrl"));
        kuaiShouVO.setKsCoverUrl(obj4.getString("coverUrl"));
        kuaiShouVO.setKsTitle(obj4.getString("caption"));
        return kuaiShouVO;
    }

    public static KuaiShouVO kuaiShouLive(String ksUrl) throws IOException {
        URL url = new URL(ksUrl);
        HttpURLConnection conn=(HttpURLConnection)url.openConnection();
        conn.getResponseCode();
        //重定向之后的url
        String realUrl=conn.getURL().toString();


        String[] strs = realUrl.split("/");

        String splitUrl = "";

        boolean boo = false;
        for (String aa:strs) {
            if(boo){
                splitUrl = aa;
                break;
            }
            if("u".equals(aa)){
                boo = true;
            }
        }

        String[] strss = splitUrl.split("\\?");


        StringBuilder json = new StringBuilder();

        URL urlObject = new URL(realUrl);

        URLConnection uc = urlObject.openConnection();

        BufferedReader in = new BufferedReader(new InputStreamReader(uc

                .getInputStream(), "utf-8"));

        String inputLine = null;

        while ((inputLine = in.readLine()) != null) {
            json.append(inputLine);
        }

        String jsonStr1 = json.substring(0, json.indexOf("window.__APOLLO_STATE__="));
        String jsonStr2 = json.substring(jsonStr1.length()+24, json.length());
        String jsonStr3 = jsonStr2.substring(0, jsonStr2.indexOf(";(function()"));

        JSONObject jsonObject1 =JSONObject.parseObject(jsonStr3);
        JSONObject obj1 = (JSONObject) jsonObject1.get("clients");
        JSONObject obj2 = (JSONObject) obj1.get("graphqlServerClient");

        String userNmae = "User:" + strss[0];
        JSONObject obj3 = (JSONObject) obj2.get(userNmae);

        String roomName = "$ROOT_QUERY.webLiveDetail({\"principalId\":\"" + strss[0] + "\"})";
        JSONObject obj4 = (JSONObject) obj2.get(roomName);
        JSONObject obj5 = (JSONObject) obj4.get("liveStream");
        JSONObject obj6 = (JSONObject) obj5.get("json");

        KuaiShouVO kuaiShouVO = new KuaiShouVO();
        kuaiShouVO.setKsCode(obj3.getString("id"));
        kuaiShouVO.setKsHeaderUrl(obj3.getString("avatar"));
        kuaiShouVO.setKsCoverUrl(obj6.getString("coverUrl"));
        kuaiShouVO.setKsId(obj3.getString("eid"));
        kuaiShouVO.setKsName(obj3.getString("name"));
        kuaiShouVO.setKsTitle(obj6.getString("caption"));

        return kuaiShouVO;
    }

    public static void main(String[] args) throws Exception {
//        KuaiShouVO kuaiShou = kuaiShowVideo("https://v.kuaishou.com/crSGvv");

        KuaiShouVO kuaiShouVO = kuaiShouLive("https://v.kuaishou.com/cuVo5V");

        System.out.println("aaa");
    }

    public static UrlResultVO getKuaiShouLive(String Url) throws IOException {

        URL url = new URL(Url);
        HttpURLConnection conn=(HttpURLConnection)url.openConnection();
        conn.getResponseCode();
        //重定向之后的url
        String realUrl=conn.getURL().toString();


        String[] strs = realUrl.split("/");

        String splitUrl = "";

        boolean boo = false;
        for (String aa:strs) {
            if(boo){
                splitUrl = aa;
                break;
            }
            if("u".equals(aa)){
                boo = true;
            }
        }

        String[] strss = splitUrl.split("\\?");


        StringBuilder json = new StringBuilder();

        URL urlObject = new URL(realUrl);

        URLConnection uc = urlObject.openConnection();

        BufferedReader in = new BufferedReader(new InputStreamReader(uc

                .getInputStream(), "utf-8"));

        String inputLine = null;

        while ((inputLine = in.readLine()) != null) {
            json.append(inputLine);
        }

        String jsonStr1 = json.substring(0, json.indexOf("window.__APOLLO_STATE__="));
        String jsonStr2 = json.substring(jsonStr1.length()+24, json.length());
        String jsonStr3 = jsonStr2.substring(0, jsonStr2.indexOf(";(function()"));

        JSONObject jsonObject1 =JSONObject.parseObject(jsonStr3);
        JSONObject obj1 = (JSONObject) jsonObject1.get("clients");
        JSONObject obj2 = (JSONObject) obj1.get("graphqlServerClient");

        String userNmae = "User:" + strss[0];
        JSONObject obj3 = (JSONObject) obj2.get(userNmae);

        String roomName = "$ROOT_QUERY.webLiveDetail({\"principalId\":\"" + strss[0] + "\"})";
        JSONObject obj4 = (JSONObject) obj2.get(roomName);
        JSONObject obj5 = (JSONObject) obj4.get("liveStream");
        JSONObject obj6 = (JSONObject) obj5.get("json");

        UrlResultVO resultVO = new UrlResultVO();
        resultVO.setMessageType("快手直播");
        resultVO.setId(obj3.getString("eid"));
        resultVO.setCode(obj3.getString("id"));
        resultVO.setKsHeaderUrl(obj3.getString("avatar"));
        resultVO.setCoverUrl(obj6.getString("coverUrl"));
        resultVO.setName(obj3.getString("name"));
        resultVO.setTitle(obj6.getString("caption"));

        return resultVO;
    }

    public static UrlResultVO getKuaiShouVideo(String Url) throws Exception {

        String record = redirectCan(Url);

        JSONObject jsonObject1 =JSONObject.parseObject(record);
        JSONObject obj1 = (JSONObject) jsonObject1.get("data");
        JSONObject obj2 = (JSONObject) obj1.get("visionVideoDetail");
        JSONObject obj3 = (JSONObject) obj2.get("author");
        JSONObject obj4 = (JSONObject) obj2.get("photo");

        UrlResultVO resultVO = new UrlResultVO();
        resultVO.setMessageType("快手视频");
        resultVO.setId(obj3.getString("id"));
        resultVO.setName(obj3.getString("name"));
        resultVO.setKsHeaderUrl(obj3.getString("headerUrl"));
        resultVO.setCoverUrl(obj4.getString("coverUrl"));
        resultVO.setTitle(obj4.getString("caption"));

        return resultVO;
    }

}

Kuaishou data entity crawled

package com.chuji.model.VO;

/**
 * @Author: tangziqian
 * @Description: 爬取的快手数据
 * @Date: Created in 19:24 2021/3/17
 * @Modified By:
 */
public class KuaiShouVO {

    /**
     * 快手id
     */
    private String ksId;

    /**
     * 快手号
     */
    private String ksCode;

    /**
     * 快手名称
     */
    private String ksName;

    /**
     * 快手头像
     */
    private String ksHeaderUrl;

    /**
     * 快手视频截图
     */
    private String ksCoverUrl;

    /**
     * 快手直播或者视频的标题
     */
    private String ksTitle;

    public String getKsTitle() {
        return ksTitle;
    }

    public void setKsTitle(String ksTitle) {
        this.ksTitle = ksTitle;
    }

    public String getKsCode() {
        return ksCode;
    }

    public void setKsCode(String ksCode) {
        this.ksCode = ksCode;
    }

    public String getKsId() {
        return ksId;
    }

    public void setKsId(String ksId) {
        this.ksId = ksId;
    }

    public String getKsName() {
        return ksName;
    }

    public void setKsName(String ksName) {
        this.ksName = ksName;
    }

    public String getKsHeaderUrl() {
        return ksHeaderUrl;
    }

    public void setKsHeaderUrl(String ksHeaderUrl) {
        this.ksHeaderUrl = ksHeaderUrl;
    }

    public String getKsCoverUrl() {
        return ksCoverUrl;
    }

    public void setKsCoverUrl(String ksCoverUrl) {
        this.ksCoverUrl = ksCoverUrl;
    }
}

Kuaishou Douyin Public Entity

package com.chuji.model.VO;

/**
 * @Author: tangziqian
 * @Description:
 * @Date: Created in 10:59 2021/3/18
 * @Modified By:
 */
public class UrlResultVO {

    /**
     * 表明是抖音还是快手
     */
    private String messageType;

    /**
     * 快手号或抖音号
     */
    private String code;

    /**
     * 快手id或者抖音id
     */
    private String id;

    /**
     * 快手名称或者抖音名称
     */
    private String name;

    /**
     * 抖音短id
     */
    private String shortId;

    /**
     * 快手头像
     */
    private String ksHeaderUrl;

    /**
     * 快手/抖音视频截图
     */
    private String coverUrl;

    /**
     * 快手/抖音视频的标题
     */
    private String title;

    public String getMessageType() {
        return messageType;
    }

    public void setMessageType(String messageType) {
        this.messageType = messageType;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getShortId() {
        return shortId;
    }

    public void setShortId(String shortId) {
        this.shortId = shortId;
    }

    public String getKsHeaderUrl() {
        return ksHeaderUrl;
    }

    public void setKsHeaderUrl(String ksHeaderUrl) {
        this.ksHeaderUrl = ksHeaderUrl;
    }

    public String getCoverUrl() {
        return coverUrl;
    }

    public void setCoverUrl(String coverUrl) {
        this.coverUrl = coverUrl;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

Guess you like

Origin blog.csdn.net/BOOM0BOOM/article/details/114997157