许多小盆友想在CSDN上下载资源,但苦于一无积分二无C币三不是会员。于是搜遍全网,找不到一个可以免积分C币下载的办法,授人以鱼不如授人以渔,今天给大家分享一个csdn免积分下载工具的源码
体验地址:servicedev.tpddns.cn:8181/#/login?c=3
“`
public interface CsdnService {
/**
* 下载csdn对应的资源
* @param resourceId
*/
CompletableFuturedownloadResource(@NotNull String resourceId, ResourceAccountsDto resourceAccounts);
/**
* 递归下载csdn对应的资源,直到到达最高递归次数3,或者可用下载账户为空
* @param resourceId
* @param excludeAccountIds
* @param recursiveLevel
* @return
*/
BooleandownloadResource(@NotNull String resourceId, List excludeAccountIds,int recursiveLevel);
/**
* 获取对应商品信息,如果获取不到返回null,应用应该走默认配置
* @param request
* @param resourceAccounts
* @return
*/
GoodsInfoDtogetGoodsInfo(@NotNull GoodsInfoRequest request, CSDNAccount resourceAccounts);
/**
* 获取用户信息
* @param request
* @param resourceAccounts
* @return
*/
UserInfogetUserInfo(@NotNull UserInfoRequest request, CSDNAccount resourceAccounts);
/**
* 检查账号是否正常
* @param request
* @param resourceAccounts
* @return
*/
boolean checkCSDNAccount(@NotNull AccountCheckRequest request, ResourceAccountsDto resourceAccounts);
}
@Log4j2
@Service
@DubboService(interfaceClass = CsdnService.class, version =”1.0.0″, group =”sunday”, timeout =3000)
public class CsdnServiceImplimplements CsdnService {
@Autowired
private DownloadServicedownloadService;
@Autowired
private AccountServiceaccountService;
@Autowired
private UserInfoServiceuserInfoService;
@Autowired
private GoodsInfoServicegoodsInfoService;
@Autowired
private ThreadPoolTaskExecutorthreadPoolTaskExecutor;
@Autowired
private ResourceFilesRpcServiceresourceFilesRpcService;
@Autowired
private LockServicelockService;
@Autowired
private WarningsRpcServicewarningsRpcService;
/**
* 下载资源
*
* @param resourceId csdn 资源ID
* @param resourceAccounts
* @return
*/
@MethodValidated
@Override
public CompletableFuturedownloadResource(String resourceId, ResourceAccountsDto resourceAccounts) {
log.trace(“received download task resourceId:{},resourceAccounts:{}”, resourceId, JSON.toJSONString(resourceAccounts));
return CompletableFuture.supplyAsync(() -> {
List excludeAccountIds =new ArrayList<>();
return downloadResource(resourceId, excludeAccountIds, 1);
}, threadPoolTaskExecutor);
}
/**
* 下载资源,存在递归调用,可以自动切换账号
* @param resourceId
* @param excludeAccountIds
* @param recursiveLevel
* @return
*/
@Override
public BooleandownloadResource(String resourceId, List excludeAccountIds, int recursiveLevel) {
log.info(“start downloadResource resourceId:{},excludeAccountIds:{},recursiveLevel:{}”,
resourceId,JSON.toJSONString(excludeAccountIds),recursiveLevel);
if (recursiveLevel >3) {
return false;
}
String lockPath =”csdn_” + resourceId;
try {
if (lockService.tryLock(lockPath, 1, TimeUnit.SECONDS, false)) {
//检查下载状态
ResourceFilesDto resourceFilesDto =resourceFilesRpcService.getResourceFileByOuterId(resourceId);
if (resourceFilesDto ==null) {
log.warn(“resourceFilesDto is not found resourceId:{}”, resourceId);
return false;
}
if (resourceFilesDto.getIsDelete()) {
log.warn(“resourceFilesDto is deleted resourceId:{}”, resourceId);
return false;
}
// 已经下载成功了,无需再下载
if (resourceFilesDto.getStatus().equals((byte)DOWNLOADED.ordinal())) {
return true;
}
if (resourceFilesDto.getStatus().equals((byte)DATA_LOST.ordinal())) {
return false;
}
// 不处理手动下载资源
if (resourceFilesDto.getStatus().equals((byte)MANUAL_DOWNLOADING.ordinal())) {
return false;
}
// 亏本中
if (resourceFilesDto.getStatus().equals((byte)REPLAY_MANUAL_DOWNLOAD_AGAIN.ordinal())) {
return false;
}
// 获取csdn账户
CSDNAccount account =null;
try {
account =accountService.getAvailableCSDNAccountWithCheck(resourceId, excludeAccountIds);
Assert.notNull(account, “account is still null resourceId:{}”, resourceId);
}catch (Exception e) {
log.error(“get CSDNAccount is failed,msg:{}”, e.getMessage(), e);
downloadService.statusHandler(resourceFilesDto, MANUAL_DOWNLOADING, “无法自动下载,正在进行人工下载”, true);
return false;
}
// 更新资源账户ID
Assert.notNull(account.getId(), “account id is null”);
resourceFilesDto.setResourceAccountId(account.getId());
// 获取用户信息
UserInfo userInfo =null;
try {
userInfo =userInfoService.getUserInfo(account, resourceId);
Assert.notNull(userInfo, “获取用户信息失败”);
}catch (Exception e) {
excludeAccountIds.add(account.getId());
return downloadResource(resourceId, excludeAccountIds, recursiveLevel +1);
}
try {
String fileName = DefaultUtils.getValue(userInfo.getContent().getTitle(), resourceId);
Assert.mustNotBlank(fileName, “fileName is blank resourceId:{}”, resourceId);
//逻辑判断是否可以下载
Action action = userInfo.getAction();
if (action !=null && action.getIsPay() !=null && action.getIsPay()) {
// 需要独立支付下载
downloadService.statusHandler(resourceFilesDto, MANUAL_DOWNLOADING, “人工下载中”, true);
return true;
}
if (action !=null &&
(
(action.getIsDownloaded() !=null && action.getIsDownloaded())
|| (action.getIsFreeDownload() !=null && action.getIsFreeDownload())
|| (action.getIsVipEnough() !=null && action.getIsVipEnough()))
) {
String downloadAddress =downloadService.getDownloadAddress(account, resourceId);
if (downloadAddress ==null) {
excludeAccountIds.add(account.getId());
return downloadResource(resourceId, excludeAccountIds, recursiveLevel +1);
}
/**
* 核心下载入口
*/
downloadService.download(account, downloadAddress, fileName, resourceFilesDto);
return true;
}else {
downloadService.statusHandler(resourceFilesDto, MANUAL_DOWNLOADING, “人工下载中”, true);
log.error(“未达到可以下载的状态,无法下载本次资源,action: {},userInfo:{},account:{} for resourceId {}”
, JSON.toJSONString(account), JSON.toJSONString(userInfo), JSON.toJSONString(account), resourceId);
return false;
}
}catch (Exception e) {
log.error(“下载出现错误 for resourceId {}, ,msg:{}”, resourceId, e.getMessage(), e);
excludeAccountIds.add(account.getId());
return downloadResource(resourceId, excludeAccountIds, recursiveLevel +1);
}
}else {
log.warn(“尝试获取锁失败,resourceId:{}”, resourceId);
warningsRpcService.http2AddWarnForAdmin(MF.m(“获取锁失败,resourceId:{}”, resourceId), null);
return false;
}
}catch (Exception e) {
log.error(“error happened:{},resourceId:{}”, e.getMessage(), resourceId, e);
return false;
}finally {
lockService.unlockOnlySelf(lockPath);
}
}
@Override
public GoodsInfoDtogetGoodsInfo(GoodsInfoRequest request, CSDNAccount resourceAccounts) {
try {
// 获取csdn账户
CSDNAccount account =null;
String resourceId = request.getResourceId();
try {
List excludeList =new ArrayList<>();
account = resourceAccounts ==null ?accountService.getAvailableCSDNAccountWithCheck(resourceId,excludeList) : resourceAccounts;
Assert.notNull(account, “account is still null resourceId:{}”, resourceId);
}catch (Exception e) {
String message = MF.m(“get CSDNAccount is failed msg:{},resourceId:{}”, e.getMessage(), resourceId);
warningsRpcService.http2AddWarnForAdmin(message, null);
log.error(message, e);
return null;
}
GoodsInfoDto goodsInfo =goodsInfoService.getGoodsInfo(account, resourceId, request.getFlag());
return goodsInfo;
}catch (Exception e) {
log.error(“getUserInfo() error happened:{}”, e.getMessage(), e);
}
return null;
}
@Override
public UserInfogetUserInfo(UserInfoRequest request, CSDNAccount resourceAccounts) {
try {
// 获取csdn账户
CSDNAccount account =null;
String resourceId = request.getResourceId();
try {
List excludeList =new ArrayList<>();
account = resourceAccounts ==null ?accountService.getAvailableCSDNAccountWithCheck(resourceId,excludeList) : resourceAccounts;
Assert.notNull(account, “account is still null resourceId:{}”, resourceId);
}catch (Exception e) {
String message = MF.m(“get CSDNAccount is failed msg:{},resourceId:{}”, e.getMessage(), resourceId);
warningsRpcService.http2AddWarnForAdmin(message, null);
log.error(message, e);
return null;
}
UserInfo userInfo =userInfoService.getUserInfo(account, resourceId);
return userInfo;
}catch (Exception e) {
log.error(“getUserInfo() error happened:{}”, e.getMessage(), e);
}
return null;
}
@Override
public boolean checkCSDNAccount(AccountCheckRequest request, ResourceAccountsDto resourceAccounts) {
Assert.notNull(request, “request is null”);
Assert.notNull(resourceAccounts, “resourceAccounts is null”);
try {
CSDNAccount account = AccountConvertUtil.getCSDNAccountFromResourceAccount(resourceAccounts);
return accountService.checkCSDNAccount(account, request.getResourceId()) !=null;
}catch (Exception e) {
log.error(“checkCSDNAccount() error happened:{}”, e.getMessage(), e);
return false;
}
}
}
“`