mirror of
https://github.com/ctwj/urldb.git
synced 2025-11-25 03:15:04 +08:00
fix: 修复了转存删除和添加广告的问题
This commit is contained in:
@@ -281,8 +281,26 @@ func (q *QuarkPanService) DeleteFiles(fileList []string) (*TransferResult, error
|
||||
return ErrorResult("文件列表为空"), nil
|
||||
}
|
||||
|
||||
// 逐个删除文件,确保每个删除操作都完成
|
||||
for _, fileID := range fileList {
|
||||
err := q.deleteSingleFile(fileID)
|
||||
if err != nil {
|
||||
log.Printf("删除文件 %s 失败: %v", fileID, err)
|
||||
return ErrorResult(fmt.Sprintf("删除文件 %s 失败: %v", fileID, err)), nil
|
||||
}
|
||||
}
|
||||
|
||||
return SuccessResult("删除成功", nil), nil
|
||||
}
|
||||
|
||||
// deleteSingleFile 删除单个文件
|
||||
func (q *QuarkPanService) deleteSingleFile(fileID string) error {
|
||||
log.Printf("正在删除文件: %s", fileID)
|
||||
|
||||
data := map[string]interface{}{
|
||||
"fid_list": fileList,
|
||||
"action_type": 2,
|
||||
"filelist": []string{fileID},
|
||||
"exclude_fids": []string{},
|
||||
}
|
||||
|
||||
queryParams := map[string]string{
|
||||
@@ -291,12 +309,41 @@ func (q *QuarkPanService) DeleteFiles(fileList []string) (*TransferResult, error
|
||||
"uc_param_str": "",
|
||||
}
|
||||
|
||||
_, err := q.HTTPPost("https://drive-pc.quark.cn/1/clouddrive/file/delete", data, queryParams)
|
||||
respData, err := q.HTTPPost("https://drive-pc.quark.cn/1/clouddrive/file/delete", data, queryParams)
|
||||
if err != nil {
|
||||
return ErrorResult(fmt.Sprintf("删除文件失败: %v", err)), nil
|
||||
return fmt.Errorf("删除文件请求失败: %v", err)
|
||||
}
|
||||
|
||||
return SuccessResult("删除成功", nil), nil
|
||||
// 解析响应
|
||||
var response struct {
|
||||
Status int `json:"status"`
|
||||
Message string `json:"message"`
|
||||
Data struct {
|
||||
TaskID string `json:"task_id"`
|
||||
} `json:"data"`
|
||||
}
|
||||
|
||||
if err := json.Unmarshal(respData, &response); err != nil {
|
||||
return fmt.Errorf("解析删除响应失败: %v", err)
|
||||
}
|
||||
|
||||
if response.Status != 200 {
|
||||
return fmt.Errorf("删除文件失败: %s", response.Message)
|
||||
}
|
||||
|
||||
// 如果有任务ID,等待任务完成
|
||||
if response.Data.TaskID != "" {
|
||||
log.Printf("删除文件任务ID: %s", response.Data.TaskID)
|
||||
_, err := q.waitForTask(response.Data.TaskID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("等待删除任务完成失败: %v", err)
|
||||
}
|
||||
log.Printf("文件 %s 删除完成", fileID)
|
||||
} else {
|
||||
log.Printf("文件 %s 删除完成(无任务ID)", fileID)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// getStoken 获取stoken
|
||||
@@ -376,12 +423,17 @@ func (q *QuarkPanService) getShare(shareID, stoken string) (*ShareResult, error)
|
||||
|
||||
// getShareSave 转存分享
|
||||
func (q *QuarkPanService) getShareSave(shareID, stoken string, fidList, fidTokenList []string) (*SaveResult, error) {
|
||||
return q.getShareSaveToDir(shareID, stoken, fidList, fidTokenList, "0")
|
||||
}
|
||||
|
||||
// getShareSaveToDir 转存分享到指定目录
|
||||
func (q *QuarkPanService) getShareSaveToDir(shareID, stoken string, fidList, fidTokenList []string, toPdirFid string) (*SaveResult, error) {
|
||||
data := map[string]interface{}{
|
||||
"pwd_id": shareID,
|
||||
"stoken": stoken,
|
||||
"fid_list": fidList,
|
||||
"fid_token_list": fidTokenList,
|
||||
"to_pdir_fid": "0", // 默认存储到根目录
|
||||
"to_pdir_fid": toPdirFid, // 存储到指定目录
|
||||
}
|
||||
|
||||
queryParams := map[string]string{
|
||||
@@ -634,7 +686,7 @@ func (q *QuarkPanService) addAd(dirID string) error {
|
||||
// 暂时使用硬编码的广告文件ID,后续可以从系统配置中读取
|
||||
adFileIDs := []string{
|
||||
// 可以配置多个广告文件ID
|
||||
// "4c0381f2d1ca", // 示例广告文件ID
|
||||
"eeb2ccce25ad", // 示例广告文件ID
|
||||
}
|
||||
|
||||
if len(adFileIDs) == 0 {
|
||||
@@ -643,7 +695,7 @@ func (q *QuarkPanService) addAd(dirID string) error {
|
||||
}
|
||||
|
||||
// 随机选择一个广告文件
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
rand.Seed(utils.GetCurrentTimestampNano())
|
||||
selectedAdID := adFileIDs[rand.Intn(len(adFileIDs))]
|
||||
|
||||
log.Printf("选择广告文件ID: %s", selectedAdID)
|
||||
@@ -673,7 +725,7 @@ func (q *QuarkPanService) addAd(dirID string) error {
|
||||
shareFidToken := adFile.ShareFidToken
|
||||
|
||||
// 保存广告文件到目标目录
|
||||
saveResult, err := q.getShareSave(selectedAdID, stokenResult.Stoken, []string{fid}, []string{shareFidToken})
|
||||
saveResult, err := q.getShareSaveToDir(selectedAdID, stokenResult.Stoken, []string{fid}, []string{shareFidToken}, dirID)
|
||||
if err != nil {
|
||||
log.Printf("保存广告文件失败: %v", err)
|
||||
return err
|
||||
@@ -729,26 +781,8 @@ func (q *QuarkPanService) getDirFile(pdirFid string) ([]map[string]interface{},
|
||||
return nil, fmt.Errorf(response.Message)
|
||||
}
|
||||
|
||||
// 递归处理子目录
|
||||
var allFiles []map[string]interface{}
|
||||
for _, item := range response.Data.List {
|
||||
// 添加当前文件/目录
|
||||
allFiles = append(allFiles, item)
|
||||
|
||||
// 如果是目录,递归获取子目录内容
|
||||
if fileType, ok := item["file_type"].(float64); ok && fileType == 1 { // 1表示目录
|
||||
if fid, ok := item["fid"].(string); ok {
|
||||
subFiles, err := q.getDirFile(fid)
|
||||
if err != nil {
|
||||
log.Printf("获取子目录 %s 失败: %v", fid, err)
|
||||
continue
|
||||
}
|
||||
allFiles = append(allFiles, subFiles...)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return allFiles, nil
|
||||
// 直接返回文件列表,不递归处理子目录(与参考代码保持一致)
|
||||
return response.Data.List, nil
|
||||
}
|
||||
|
||||
// 定义各种结果结构体
|
||||
|
||||
@@ -257,6 +257,8 @@ func insertDefaultDataIfEmpty() error {
|
||||
{Key: entity.ConfigKeyAutoFetchHotDramaEnabled, Value: entity.ConfigDefaultAutoFetchHotDramaEnabled, Type: entity.ConfigTypeBool},
|
||||
{Key: entity.ConfigKeyApiToken, Value: entity.ConfigDefaultApiToken, Type: entity.ConfigTypeString},
|
||||
{Key: entity.ConfigKeyForbiddenWords, Value: entity.ConfigDefaultForbiddenWords, Type: entity.ConfigTypeString},
|
||||
{Key: entity.ConfigKeyAdKeywords, Value: entity.ConfigDefaultAdKeywords, Type: entity.ConfigTypeString},
|
||||
{Key: entity.ConfigKeyAutoInsertAd, Value: entity.ConfigDefaultAutoInsertAd, Type: entity.ConfigTypeString},
|
||||
{Key: entity.ConfigKeyPageSize, Value: entity.ConfigDefaultPageSize, Type: entity.ConfigTypeInt},
|
||||
{Key: entity.ConfigKeyMaintenanceMode, Value: entity.ConfigDefaultMaintenanceMode, Type: entity.ConfigTypeBool},
|
||||
}
|
||||
|
||||
@@ -58,6 +58,10 @@ func SystemConfigToResponse(configs []entity.SystemConfig) *dto.SystemConfigResp
|
||||
response.ApiToken = config.Value
|
||||
case entity.ConfigKeyForbiddenWords:
|
||||
response.ForbiddenWords = config.Value
|
||||
case entity.ConfigKeyAdKeywords:
|
||||
response.AdKeywords = config.Value
|
||||
case entity.ConfigKeyAutoInsertAd:
|
||||
response.AutoInsertAd = config.Value
|
||||
case entity.ConfigKeyPageSize:
|
||||
if val, err := strconv.Atoi(config.Value); err == nil {
|
||||
response.PageSize = val
|
||||
@@ -114,6 +118,12 @@ func RequestToSystemConfig(req *dto.SystemConfigRequest) []entity.SystemConfig {
|
||||
if req.ForbiddenWords != "" {
|
||||
configs = append(configs, entity.SystemConfig{Key: entity.ConfigKeyForbiddenWords, Value: req.ForbiddenWords, Type: entity.ConfigTypeString})
|
||||
}
|
||||
if req.AdKeywords != "" {
|
||||
configs = append(configs, entity.SystemConfig{Key: entity.ConfigKeyAdKeywords, Value: req.AdKeywords, Type: entity.ConfigTypeString})
|
||||
}
|
||||
if req.AutoInsertAd != "" {
|
||||
configs = append(configs, entity.SystemConfig{Key: entity.ConfigKeyAutoInsertAd, Value: req.AutoInsertAd, Type: entity.ConfigTypeString})
|
||||
}
|
||||
|
||||
// 布尔值字段 - 只处理实际提交的字段
|
||||
// 注意:由于 Go 的零值机制,我们需要通过其他方式判断字段是否被提交
|
||||
@@ -156,6 +166,8 @@ func SystemConfigToPublicResponse(configs []entity.SystemConfig) map[string]inte
|
||||
entity.ConfigResponseFieldAutoTransferMinSpace: 100,
|
||||
entity.ConfigResponseFieldAutoFetchHotDramaEnabled: false,
|
||||
entity.ConfigResponseFieldForbiddenWords: "",
|
||||
entity.ConfigResponseFieldAdKeywords: "",
|
||||
entity.ConfigResponseFieldAutoInsertAd: "",
|
||||
entity.ConfigResponseFieldPageSize: 100,
|
||||
entity.ConfigResponseFieldMaintenanceMode: false,
|
||||
entity.ConfigResponseFieldEnableRegister: true, // 默认开启注册功能
|
||||
@@ -200,6 +212,10 @@ func SystemConfigToPublicResponse(configs []entity.SystemConfig) map[string]inte
|
||||
}
|
||||
case entity.ConfigKeyForbiddenWords:
|
||||
response[entity.ConfigResponseFieldForbiddenWords] = config.Value
|
||||
case entity.ConfigKeyAdKeywords:
|
||||
response[entity.ConfigResponseFieldAdKeywords] = config.Value
|
||||
case entity.ConfigKeyAutoInsertAd:
|
||||
response[entity.ConfigResponseFieldAutoInsertAd] = config.Value
|
||||
case entity.ConfigKeyPageSize:
|
||||
if val, err := strconv.Atoi(config.Value); err == nil {
|
||||
response[entity.ConfigResponseFieldPageSize] = val
|
||||
@@ -242,6 +258,8 @@ func getDefaultConfigResponse() *dto.SystemConfigResponse {
|
||||
AutoFetchHotDramaEnabled: false,
|
||||
ApiToken: entity.ConfigDefaultApiToken,
|
||||
ForbiddenWords: entity.ConfigDefaultForbiddenWords,
|
||||
AdKeywords: entity.ConfigDefaultAdKeywords,
|
||||
AutoInsertAd: entity.ConfigDefaultAutoInsertAd,
|
||||
PageSize: 100,
|
||||
MaintenanceMode: false,
|
||||
EnableRegister: true, // 默认开启注册功能
|
||||
|
||||
@@ -23,6 +23,10 @@ type SystemConfigRequest struct {
|
||||
// 违禁词配置
|
||||
ForbiddenWords string `json:"forbidden_words"` // 违禁词列表,用逗号分隔
|
||||
|
||||
// 广告配置
|
||||
AdKeywords string `json:"ad_keywords"` // 广告关键词列表,用逗号分隔
|
||||
AutoInsertAd string `json:"auto_insert_ad"` // 自动插入广告内容
|
||||
|
||||
// 其他配置
|
||||
PageSize int `json:"page_size"`
|
||||
MaintenanceMode bool `json:"maintenance_mode"`
|
||||
@@ -59,6 +63,10 @@ type SystemConfigResponse struct {
|
||||
// 违禁词配置
|
||||
ForbiddenWords string `json:"forbidden_words"` // 违禁词列表,用逗号分隔
|
||||
|
||||
// 广告配置
|
||||
AdKeywords string `json:"ad_keywords"` // 广告关键词列表,用逗号分隔
|
||||
AutoInsertAd string `json:"auto_insert_ad"` // 自动插入广告内容
|
||||
|
||||
// 其他配置
|
||||
PageSize int `json:"page_size"`
|
||||
MaintenanceMode bool `json:"maintenance_mode"`
|
||||
|
||||
@@ -23,6 +23,10 @@ const (
|
||||
// 违禁词配置
|
||||
ConfigKeyForbiddenWords = "forbidden_words"
|
||||
|
||||
// 广告配置
|
||||
ConfigKeyAdKeywords = "ad_keywords" // 广告关键词
|
||||
ConfigKeyAutoInsertAd = "auto_insert_ad" // 自动插入广告
|
||||
|
||||
// 其他配置
|
||||
ConfigKeyPageSize = "page_size"
|
||||
ConfigKeyMaintenanceMode = "maintenance_mode"
|
||||
@@ -68,6 +72,10 @@ const (
|
||||
// 违禁词配置字段
|
||||
ConfigResponseFieldForbiddenWords = "forbidden_words"
|
||||
|
||||
// 广告配置字段
|
||||
ConfigResponseFieldAdKeywords = "ad_keywords"
|
||||
ConfigResponseFieldAutoInsertAd = "auto_insert_ad"
|
||||
|
||||
// 其他配置字段
|
||||
ConfigResponseFieldPageSize = "page_size"
|
||||
ConfigResponseFieldMaintenanceMode = "maintenance_mode"
|
||||
@@ -100,6 +108,10 @@ const (
|
||||
// 违禁词配置默认值
|
||||
ConfigDefaultForbiddenWords = ""
|
||||
|
||||
// 广告配置默认值
|
||||
ConfigDefaultAdKeywords = ""
|
||||
ConfigDefaultAutoInsertAd = ""
|
||||
|
||||
// 其他配置默认值
|
||||
ConfigDefaultPageSize = "100"
|
||||
ConfigDefaultMaintenanceMode = "false"
|
||||
|
||||
@@ -133,6 +133,8 @@ func (r *SystemConfigRepositoryImpl) GetOrCreateDefault() ([]entity.SystemConfig
|
||||
entity.ConfigKeyAutoTransferMinSpace: {Key: entity.ConfigKeyAutoTransferMinSpace, Value: entity.ConfigDefaultAutoTransferMinSpace, Type: entity.ConfigTypeInt},
|
||||
entity.ConfigKeyAutoFetchHotDramaEnabled: {Key: entity.ConfigKeyAutoFetchHotDramaEnabled, Value: entity.ConfigDefaultAutoFetchHotDramaEnabled, Type: entity.ConfigTypeBool},
|
||||
entity.ConfigKeyApiToken: {Key: entity.ConfigKeyApiToken, Value: entity.ConfigDefaultApiToken, Type: entity.ConfigTypeString},
|
||||
entity.ConfigKeyAdKeywords: {Key: entity.ConfigKeyAdKeywords, Value: entity.ConfigDefaultAdKeywords, Type: entity.ConfigTypeString},
|
||||
entity.ConfigKeyAutoInsertAd: {Key: entity.ConfigKeyAutoInsertAd, Value: entity.ConfigDefaultAutoInsertAd, Type: entity.ConfigTypeString},
|
||||
entity.ConfigKeyPageSize: {Key: entity.ConfigKeyPageSize, Value: entity.ConfigDefaultPageSize, Type: entity.ConfigTypeInt},
|
||||
entity.ConfigKeyMaintenanceMode: {Key: entity.ConfigKeyMaintenanceMode, Value: entity.ConfigDefaultMaintenanceMode, Type: entity.ConfigTypeBool},
|
||||
entity.ConfigKeyEnableRegister: {Key: entity.ConfigKeyEnableRegister, Value: entity.ConfigDefaultEnableRegister, Type: entity.ConfigTypeBool},
|
||||
|
||||
Reference in New Issue
Block a user