Skip to content

Commit

Permalink
新增获取已注销账号信息;
Browse files Browse the repository at this point in the history
新增备份已注销账号数据(收藏夹、收藏的视频合集、追番追剧);
  • Loading branch information
hzhilong committed Nov 25, 2024
1 parent 1d28f2f commit f43da24
Show file tree
Hide file tree
Showing 39 changed files with 482 additions and 87 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<groupId>top.ybgnb</groupId>
<artifactId>bilibili-backup</artifactId>
<description>哔哩哔哩账号备份</description>
<version>1.0.5</version>
<version>1.0.6</version>

<properties>
<maven.compiler.source>8</maven.compiler.source>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import top.ybgnb.bilibili.backup.biliapi.bean.Upper;
import top.ybgnb.bilibili.backup.biliapi.error.BusinessException;
import top.ybgnb.bilibili.backup.biliapi.request.BaseApi;
import top.ybgnb.bilibili.backup.biliapi.service.LoginService;
import top.ybgnb.bilibili.backup.biliapi.service.impl.LoginService;
import top.ybgnb.bilibili.backup.biliapi.user.User;
import top.ybgnb.bilibili.backup.biliapi.utils.QRUtil;
import top.ybgnb.bilibili.backup.biliapi.utils.StringUtils;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public class BusinessRunner {
* @return 当前登录的UP信息
*/
public static Upper processBusiness(BusinessType businessType, Scanner scanner) throws BusinessException {
log.info("================【{}工具】================", businessType.getName());
log.info("================【{}】================", businessType.getName());
try {
// 获取业务类
Class<? extends BaseBusiness> businessClass = businessType.getBusinessClass();
Expand All @@ -38,6 +38,7 @@ public static Upper processBusiness(BusinessType businessType, Scanner scanner)
if (upper != null) {
log.info("【{}】处理成功,当前用户:{}\n", businessType.getName(), upper.getName());
}
Thread.sleep(2000);
return upper;
} catch (BusinessException ex) {
log.info("【{}】处理失败,{}\n", businessType.getName(), ex.getMessage());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package top.ybgnb.bilibili.backup.app.business;

import top.ybgnb.bilibili.backup.app.business.impl.BackupBusiness;
import top.ybgnb.bilibili.backup.app.business.impl.CancelledAccountsBusiness;
import top.ybgnb.bilibili.backup.app.business.impl.ReadAllMessageBusiness;
import top.ybgnb.bilibili.backup.app.business.impl.RestoreBusiness;
import top.ybgnb.bilibili.backup.app.business.impl.UserManageBusiness;
Expand All @@ -16,7 +17,7 @@ public enum BusinessType {
BACKUP("备份", BackupBusiness.class),
RESTORE("还原", RestoreBusiness.class),
READ_ALL_MSG("已读所有消息", ReadAllMessageBusiness.class),
// SEARCH_CANCELLED_ACCOUNTS("查询已注销账号信息", BaseBusiness.class),
CANCELLED_ACCOUNTS("已注销账号数据", CancelledAccountsBusiness.class),

USER_MANAGE("管理已登录账号", UserManageBusiness.class),
EXIT("退出程序", null);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
package top.ybgnb.bilibili.backup.app.business.impl;

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import top.ybgnb.bilibili.backup.app.business.BaseBusiness;
import top.ybgnb.bilibili.backup.app.constant.AppConstant;
import top.ybgnb.bilibili.backup.app.menu.BaseMenu;
import top.ybgnb.bilibili.backup.app.menu.UserMenu;
import top.ybgnb.bilibili.backup.app.menu.btn.callback.YesOrNo;
import top.ybgnb.bilibili.backup.biliapi.bean.ApiResult;
import top.ybgnb.bilibili.backup.biliapi.bean.Upper;
import top.ybgnb.bilibili.backup.biliapi.bean.Video;
import top.ybgnb.bilibili.backup.biliapi.error.BusinessException;
import top.ybgnb.bilibili.backup.biliapi.request.AddQueryParams;
import top.ybgnb.bilibili.backup.biliapi.request.BaseApi;
import top.ybgnb.bilibili.backup.biliapi.service.ServiceBuilder;
import top.ybgnb.bilibili.backup.biliapi.service.impl.BangumiService;
import top.ybgnb.bilibili.backup.biliapi.service.impl.FavCollectedService;
import top.ybgnb.bilibili.backup.biliapi.service.impl.FavoritesService;
import top.ybgnb.bilibili.backup.biliapi.service.impl.VideoService;
import top.ybgnb.bilibili.backup.biliapi.user.User;
import top.ybgnb.bilibili.backup.biliapi.utils.FileUtil;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

/**
* @ClassName CancelledAccountsBusiness
* @Description 已注销账号数据
* @Author hzhilong
* @Time 2024/11/22
* @Version 1.0
*/
@Slf4j
public class CancelledAccountsBusiness extends BaseBusiness {

@Override
public Upper process(Scanner scanner) throws BusinessException {
// 输入用户UID
String uid = UserMenu.inputUid(scanner);
// 设置当前备份目录
String path = String.format("%s%s_%s_%s/", AppConstant.BACKUP_PATH_PREFIX, AppConstant.CANCELLED_ACCOUNT_NAME, uid,
new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date()));
getUserInfo(uid);
log.info("\n是否获取该用户投稿的视频数据?");
BaseMenu.inputYes(scanner, new YesOrNo() {
@Override
public void yes() {
try {
getUserVideo(uid, path);
} catch (BusinessException e) {
log.info(e.getMessage());
}
}

@Override
public void no() {

}
});
log.info("\n是否尝试备份该用户数据?(需在注销前将相关隐私设置为公开)");
log.info("\t备份的项目有:收藏夹、收藏的视频合集、追番追剧\n");
final Upper[] upper = {null};
BaseMenu.inputYes(scanner, new YesOrNo() {
@Override
public void yes() {
backupInfo(uid, path);
upper[0] = new Upper(Long.valueOf(uid), AppConstant.CANCELLED_ACCOUNT_NAME, "");
}

@Override
public void no() {

}
});
return upper[0];
}

private void getUserInfo(String uid) throws BusinessException {
ApiResult<JSONObject> apiResult = new BaseApi<JSONObject>(client, null, "https://api.bilibili.com/x/relation/stat", new AddQueryParams() {
@Override
public void addQueryParams(Map<String, String> queryParams) {
queryParams.put("vmid", uid);
}
}, false, JSONObject.class).apiGet();
if (apiResult._isSuccess()) {
JSONObject data = apiResult.getData();
log.info("");
log.info("用户UID:{}", uid);
log.info("该用户关注数:{}", data.getInteger("following"));
log.info("该用户粉丝数:{}", data.getInteger("follower"));
} else {
throw new BusinessException("查询该uid用户信息失败");
}
}

private void getUserVideo(String uid, String path) throws BusinessException {
log.info("正在获取该用户投稿的视频,请稍候...");
List<Video> videos = new VideoService(client, new User(uid)).getVideos(uid);
log.info("该用户共投稿{}个视频。", videos.size());
for (int i = 0; i < videos.size(); i++) {
Video video = videos.get(i);
log.info("{}.{} {}", i + 1, video.getBvid(), video.getTitle());
}
FileUtil.writeJsonFile(path, "投稿的视频.json", videos);
}

private void backupInfo(String uid, String path) {
List<ServiceBuilder> serviceBuilders = new ArrayList<>();
serviceBuilders.add(FavoritesService::new);
serviceBuilders.add(FavCollectedService::new);
serviceBuilders.add(BangumiService::new);

for (ServiceBuilder serviceBuilder : serviceBuilders) {
try {
serviceBuilder.build(client, new User(uid), path).backup();
} catch (BusinessException be) {
log.info(be.getMessage());
}
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import top.ybgnb.bilibili.backup.app.business.BaseBusinessForLoginUser;
import top.ybgnb.bilibili.backup.biliapi.bean.Upper;
import top.ybgnb.bilibili.backup.biliapi.error.BusinessException;
import top.ybgnb.bilibili.backup.biliapi.service.MessageService;
import top.ybgnb.bilibili.backup.biliapi.service.impl.MessageService;
import top.ybgnb.bilibili.backup.biliapi.user.User;

import java.util.Scanner;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package top.ybgnb.bilibili.backup.app.constant;

import java.util.regex.Pattern;

public class AppConstant {

/**
Expand All @@ -12,4 +14,13 @@ public class AppConstant {
*/
public static final String COOKIE_PATH_PREFIX = "bin/cookies/";

/**
* 纯数字
*/
public static final Pattern NUM_PATTERN = Pattern.compile("[0-9]*");

/**
* 已注销账号的昵称
*/
public static final String CANCELLED_ACCOUNT_NAME = "账号已注销";
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
* @Version 1.0
*/
@Slf4j
public class AppMainMenu {
public class AppMainMenu extends BaseMenu{

/**
* 选择业务
Expand All @@ -28,6 +28,7 @@ public static void chooseBusiness(Scanner sc) {
for (int i = 0; i < businessTypes.length; i++) {
log.info("{}: {}", i, businessTypes[i].getName());
}
log.info("\n");

int pos = MenuUtil.checkInputPos(businessTypes.length, sc.nextLine());
// 输入是否有效
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@
import top.ybgnb.bilibili.backup.app.constant.AppConstant;
import top.ybgnb.bilibili.backup.app.utils.MenuUtil;
import top.ybgnb.bilibili.backup.biliapi.error.BusinessException;
import top.ybgnb.bilibili.backup.biliapi.service.BangumiService;
import top.ybgnb.bilibili.backup.biliapi.service.BlackService;
import top.ybgnb.bilibili.backup.biliapi.service.FavCollectedService;
import top.ybgnb.bilibili.backup.biliapi.service.FavOpusesService;
import top.ybgnb.bilibili.backup.biliapi.service.FavoritesService;
import top.ybgnb.bilibili.backup.biliapi.service.FollowingService;
import top.ybgnb.bilibili.backup.biliapi.service.impl.BangumiService;
import top.ybgnb.bilibili.backup.biliapi.service.impl.BlackService;
import top.ybgnb.bilibili.backup.biliapi.service.impl.FavCollectedService;
import top.ybgnb.bilibili.backup.biliapi.service.impl.FavOpusesService;
import top.ybgnb.bilibili.backup.biliapi.service.impl.FavoritesService;
import top.ybgnb.bilibili.backup.biliapi.service.impl.FollowingService;
import top.ybgnb.bilibili.backup.biliapi.service.ServiceBuilder;
import top.ybgnb.bilibili.backup.biliapi.service.ToViewService;
import top.ybgnb.bilibili.backup.biliapi.service.impl.ToViewService;

import java.io.File;
import java.util.ArrayList;
Expand All @@ -28,7 +28,7 @@
* @Version 1.0
*/
@Slf4j
public class BackupRestoreMenu {
public class BackupRestoreMenu extends BaseMenu {

/**
* 选择服务项目
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/top/ybgnb/bilibili/backup/app/menu/BaseMenu.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package top.ybgnb.bilibili.backup.app.menu;

import top.ybgnb.bilibili.backup.app.menu.btn.callback.YesOrNo;
import top.ybgnb.bilibili.backup.app.menu.btn.impl.InputYes;

import java.util.Scanner;

/**
* @ClassName BaseMenu
* @Description 菜单基类
* @Author hzhilong
* @Time 2024/11/25
* @Version 1.0
*/
public class BaseMenu {

public static void inputYes(Scanner scanner, YesOrNo yesOrNo) {
new InputYes(scanner).showBtn(yesOrNo);
}

}
14 changes: 13 additions & 1 deletion src/main/java/top/ybgnb/bilibili/backup/app/menu/UserMenu.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import lombok.extern.slf4j.Slf4j;
import top.ybgnb.bilibili.backup.app.bean.SavedUser;
import top.ybgnb.bilibili.backup.app.constant.AppConstant;
import top.ybgnb.bilibili.backup.app.state.UserManager;
import top.ybgnb.bilibili.backup.app.utils.MenuUtil;
import top.ybgnb.bilibili.backup.biliapi.error.BusinessException;
Expand All @@ -17,7 +18,7 @@
* @Version 1.0
*/
@Slf4j
public class UserMenu {
public class UserMenu extends BaseMenu {

/**
* 选择用户
Expand Down Expand Up @@ -62,4 +63,15 @@ public static SavedUser chooseLoggedUser(Scanner scanner, boolean isTip) throws
return null;
}

public static String inputUid(Scanner sc) {
log.info("请输入用户UID:");
String nextLine = null;
do {
if (nextLine != null) {
log.info("输入错误,请重新输入");
}
nextLine = sc.nextLine();
} while (!AppConstant.NUM_PATTERN.matcher(nextLine).find());
return nextLine;
}
}
21 changes: 21 additions & 0 deletions src/main/java/top/ybgnb/bilibili/backup/app/menu/btn/BaseBtn.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package top.ybgnb.bilibili.backup.app.menu.btn;

import top.ybgnb.bilibili.backup.app.menu.btn.callback.BtnCallback;

/**
* @ClassName BaseBtn
* @Description 按钮基类
* @Author hzhilong
* @Time 2024/11/25
* @Version 1.0
*/
public abstract class BaseBtn<M extends BtnCallback> {

/**
* 显示按钮
*
* @param callback
*/
public abstract void showBtn(M callback);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package top.ybgnb.bilibili.backup.app.menu.btn.callback;

/**
* @ClassName BtnCallback
* @Description 菜单回调基类
* @Author hzhilong
* @Time 2024/11/25
* @Version 1.0
*/
public interface BtnCallback {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package top.ybgnb.bilibili.backup.app.menu.btn.callback;

/**
* @ClassName YesOrNo
* @Description 菜单回调
* @Author hzhilong
* @Time 2024/11/25
* @Version 1.0
*/
public interface YesOrNo extends BtnCallback {

void yes();

void no();
}
Loading

0 comments on commit f43da24

Please sign in to comment.