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;
}
}