原理:通过b站的动态api获取动态的json,从json中获取动态的作者与图片信息,并持久化到数据库。
b站的动态链接格式为 https://t.bilibili.com/xxx其中xxx为动态的id,通过b站的api接口:https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/get_dynamic_detail?dynamic_id=xxx 即可获取到此动态的json数据。
关键功能实现:
首先通过工具类从用户提交的完整网址中提取动态id
public class UrlUtil {
public static String getApiId(String str){
if(str.length()>49) {
str = str.substring(0, 50);
}
if(str.contains("b23.tv")){
str = shortLink.getLink(str);
}
str=str.trim();
String str2="";
if(!"".equals(str)){
for(int i=0;i<str.length();i++){
if(str.charAt(i)>=48 && str.charAt(i)<=57){
str2+=str.charAt(i);
}
}
}
if(str2.length()>=18){
return str2.substring(0,18);
}else
return null;
}
}
但是手机端用户复制下来的动态链接为短链接,为了减少用户使用的时间成本,可以通过工具类将短链接转换为长连接
public class shortLink {
public static String getLink(String shortLink){
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(shortLink).build();
try {
Response response = client.newCall(request).execute();
HttpUrl realUrl = response.request().url();
response.close();
return String.valueOf(realUrl);
} catch (IOException e) {
return null;
}
}
}
至此后台就可以通过用户上传的动态链接来获取到动态的id
之后通过fastjson来获取json里的各项数据
public class GetPicJson {
public static List<String> upload(String link) throws IOException {
link = UrlUtil.getApiId(link);
String str = GetHttpData.getData("https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/get_dynamic_detail?dynamic_id="+link);
JSONObject nameJson = JSON.parseObject(str);
String name = nameJson.getJSONObject("data").getJSONObject("card").getJSONObject("card").getJSONObject("user").getString("name");
String uid = nameJson.getJSONObject("data").getJSONObject("card").getJSONObject("desc").getString("uid");
String time = nameJson.getJSONObject("data").getJSONObject("card").getJSONObject("desc").getString("timestamp");
JSONArray tags;
StringBuilder tag= new StringBuilder();
if (nameJson.getJSONObject(