wangzhibo
2025-07-30 25087cbe79c8c4992551477d55d9db8bbea2202e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# -*- coding: utf-8 -*-
import os
import random
import subprocess
from pathlib import Path
from typing import List, Tuple
from concurrent.futures import ThreadPoolExecutor
from pydub import AudioSegment
import tempfile
import time
from datetime import datetime
import re
import json
import re
from glob import glob
 
from auto_media_publisher.utils.logger import get_logger
from auto_media_publisher.config.conf_video_mashup import FINAL_MEDIA_DIR
 
from auto_media_publisher.generators.media_generator_base import MediaGenerator
from auto_media_publisher.modifiers.rewriter.docx_rewriter_gemini import DocxRewriterGemini
 
 
class DocxGeneratorRewriter(MediaGenerator):
    """
    docx生成器类,用于根据参数改写并创建docx,发布微信公众号。
    Attributes:
        **kwargs : 其中包括 user_id,platform,proxy_full 和其他用得着addon 参数。  
        本类中,addon 参数是 docx_type 具体参考 conf_docx_random.py
    """
    required_keys = ['user_id', 'scheduled_time','proxy_full']
    def __init__(self, *args, **kwargs):
        if args:
            raise TypeError("不支持位置参数,请全部使用关键字参数")
 
        for key in self.required_keys:
            if key not in kwargs:
                raise ValueError(f"缺少必要参数:{key}")
            setattr(self, key, kwargs[key])
 
        # 允许设置额外字段
        for key, value in kwargs.items():
            if key not in self.required_keys:
                setattr(self, key, value)
                
        self.logger = get_logger(self.__class__.__name__,"admin")
    
 
    def get_random_docx_file(self) -> str:
        """
        递归 获取目录下所有的*.docx 文件, 随机选取一个
        Attributes:
            docx_dir  : 顶级目录
        """
        all_docx = glob(f"{self.docx_dir}/**/*.docx", recursive=True)
        return random.choice(all_docx)
        
 
    def generate(self):
        """
        被外部调用。
        生成一个docx ;
        生成一个png封面;
        生成一个docx的配置json文件; 
        三个文件都 保存到 media_final / user_id / 下面
 
        """        # from 2025-07-19 08:00:00   to  2025-07-19 08:00
        try:
            tmp_datetime = datetime.strptime(self.scheduled_time, "%Y-%m-%d %H:%M:%S")
            scheduled_time_str  = tmp_datetime.strftime("%Y%m%d%H%M%S")
            self.logger.info(f"DocxGeneratorRewriter 正在改写 media:{self.user_id},{self.scheduled_time} .docx")
 
            os.makedirs(os.path.join(FINAL_MEDIA_DIR,self.user_id),exist_ok=True)
            output_docx_path =f"{FINAL_MEDIA_DIR}/{self.user_id}/{scheduled_time_str}.docx"
            output_json_path = f"{FINAL_MEDIA_DIR}/{self.user_id}/{scheduled_time_str}.json"
 
            # 针对不同的平台,如果配置了相同的发布时间,默认是使用同一个视频。
            # 如果某个用户在不同的平台上,需要展示不同的内容,要 人为 地 设置最终发布时间是不同的时间。
            
            if os.path.exists(output_json_path):
                return True
            
            input_docx = self.get_random_docx_file()
 
            rewritor = DocxRewriterGemini("random",self.docx_author)
            rewritor.rewrite(input_docx,output_docx_path)
 
            summary_json = rewritor.summary_info
            summary_json["user"] = self.user_id
            summary_json["scheduled_time"] = self.scheduled_time
            summary_json["proxy_full"] = self.proxy_full
            summary_json["path_media"] = output_docx_path
            summary_json["author"] = self.docx_author
 
 
            # 3. 写入磁盘
            with open(output_json_path.replace(".docx",".json"), "w", encoding="utf-8") as f:
                json.dump(summary_json, f, ensure_ascii=False, indent=4)
 
            time.sleep(5)
            return True
        except Exception as e:
            self.logger.error(f"DocxGeneratorRewriter error: {e}")
            return False