csdn免费下载源码分析3

内容分享9小时前发布
0 0 0

许多小盆友想在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;

        }

}

}

“`

© 版权声明

相关文章

暂无评论

none
暂无评论...