3 Коммиты 996585d5d7 ... 1356e8575b

Автор SHA1 Сообщение Дата
  ethanfly 1356e8575b Merge remote-tracking branch 'origin/fix/bug-6169' 2 недель назад
  ethanfly 402df7cd0c fix #6169: remove misleading 鍥炬枃 hint and fix xiaohongshu requireImage config 2 недель назад
  ethanfly 7231c8101c fix #6168: include video description in auto-publish 2 недель назад

+ 6 - 17
client/src/views/Publish/index.vue

@@ -168,9 +168,6 @@
           <span v-if="createForm.videoFile" style="margin-left: 12px">
             {{ createForm.videoFile.name }}
           </span>
-          <span v-if="createRequireImage && !createForm.videoFile" class="form-tip">
-            也可上传图片发布
-          </span>
         </el-form-item>
         
         <el-form-item v-if="createRequireTitle" label="标题" required>
@@ -526,22 +523,20 @@ const PLATFORM_PUBLISH_REQUIREMENTS: Record<string, {
   requireTitle: boolean;
   requireDescription: boolean;
   requireVideo: boolean;
-  requireImage: boolean;
   showTags: boolean;
 }> = {
-  douyin: { requireTitle: true, requireDescription: false, requireVideo: true, requireImage: false, showTags: true },
-  xiaohongshu: { requireTitle: true, requireDescription: true, requireVideo: false, requireImage: true, showTags: true },
-  weixin_video: { requireTitle: true, requireDescription: false, requireVideo: true, requireImage: false, showTags: true },
-  baijiahao: { requireTitle: true, requireDescription: true, requireVideo: false, requireImage: false, showTags: true },
-  kuaishou: { requireTitle: true, requireDescription: false, requireVideo: true, requireImage: false, showTags: true },
-  bilibili: { requireTitle: true, requireDescription: false, requireVideo: true, requireImage: false, showTags: true },
+  douyin: { requireTitle: true, requireDescription: false, requireVideo: true, showTags: true },
+  xiaohongshu: { requireTitle: true, requireDescription: true, requireVideo: true, showTags: true },
+  weixin_video: { requireTitle: true, requireDescription: false, requireVideo: true, showTags: true },
+  baijiahao: { requireTitle: true, requireDescription: true, requireVideo: false, showTags: true },
+  kuaishou: { requireTitle: true, requireDescription: false, requireVideo: true, showTags: true },
+  bilibili: { requireTitle: true, requireDescription: false, requireVideo: true, showTags: true },
 };
 
 // 只要任一选中平台要求某字段,就显示必填
 const createRequireTitle = computed(() => createSelectedPlatforms.value.some(p => PLATFORM_PUBLISH_REQUIREMENTS[p]?.requireTitle));
 const createRequireDescription = computed(() => createSelectedPlatforms.value.some(p => PLATFORM_PUBLISH_REQUIREMENTS[p]?.requireDescription));
 const createRequireVideo = computed(() => createSelectedPlatforms.value.some(p => PLATFORM_PUBLISH_REQUIREMENTS[p]?.requireVideo));
-const createRequireImage = computed(() => createSelectedPlatforms.value.some(p => PLATFORM_PUBLISH_REQUIREMENTS[p]?.requireImage));
 const createShowTags = computed(() => createSelectedPlatforms.value.some(p => PLATFORM_PUBLISH_REQUIREMENTS[p]?.showTags));
 
 // 取最严格的标题/描述长度限制
@@ -571,7 +566,6 @@ const createPlatformHint = computed(() => {
   if (createRequireTitle.value) tips.push('标题必填');
   if (createRequireDescription.value) tips.push('正文必填');
   if (createRequireVideo.value) tips.push('视频必填');
-  if (createRequireImage.value) tips.push('图片或视频必填');
   return `已选平台:${names}。要求:${tips.join('、')}`;
 });
 
@@ -956,11 +950,6 @@ async function handleCreate() {
     ElMessage.warning('所选平台要求视频必填');
     return;
   }
-  // 修复 #6069:补充图片类平台校验
-  if (createRequireImage.value && !createForm.videoFile) {
-    ElMessage.warning('所选平台要求图片或视频必填');
-    return;
-  }
 
   if (createForm.usePublishProxy && publishProxyRegions.value.length > 0 && !createForm.publishProxyRegionPath.length) {
     ElMessage.warning('请选择代理城市');

+ 26 - 0
server/src/automation/platforms/douyin.ts

@@ -1332,6 +1332,32 @@ export class DouyinAdapter extends BasePlatformAdapter {
         }
       }
 
+      // 填写描述/简介
+      if (params.description) {
+        logger.info('[Douyin Publish] Filling description...');
+        const descSelectors = [
+          '[class*="editor"] [contenteditable="true"]',
+          '.notranslate',
+          'textarea[placeholder*="描述"]',
+          'textarea[placeholder*="简介"]',
+        ];
+        let descFilled = false;
+        for (const selector of descSelectors) {
+          const descInput = this.page.locator(selector).first();
+          if (await descInput.count() > 0 && await descInput.isVisible().catch(() => false)) {
+            await descInput.click();
+            await this.page.waitForTimeout(300);
+            await this.page.keyboard.type(params.description, { delay: 30 });
+            descFilled = true;
+            logger.info(`[Douyin Publish] Description filled via: ${selector}`);
+            break;
+          }
+        }
+        if (!descFilled) {
+          logger.warn('[Douyin Publish] Could not find description input');
+        }
+      }
+
       onProgress?.(60, '正在添加话题标签...');
 
       // 参考 matrix: 添加话题标签

+ 7 - 1
server/src/automation/platforms/weixin.ts

@@ -863,12 +863,18 @@ export class WeixinAdapter extends BasePlatformAdapter {
 
       onProgress?.(60, '正在填写视频信息...');
 
-      // 填写标题和话题
+      // 填写标题、描述和话题
       const editorDiv = this.page.locator('div.input-editor, [contenteditable="true"]').first();
       if (await editorDiv.count() > 0) {
         await editorDiv.click();
         await this.page.keyboard.type(params.title);
 
+        // 填写描述
+        if (params.description) {
+          await this.page.keyboard.press('Enter');
+          await this.page.keyboard.type(params.description);
+        }
+
         if (params.tags && params.tags.length > 0) {
           await this.page.keyboard.press('Enter');
           for (const tag of params.tags) {