Explorar o código

审核通过的视频先执行生成小程序标题,若小程序标题生成失败则将审核状态改为4

luojunhui hai 4 meses
pai
achega
5fcdb9c302

+ 4 - 0
applications/api/__init__.py

@@ -0,0 +1,4 @@
+"""
+@author: luojunhui
+"""
+from .moon_shot_api import generate_mini_program_title

+ 45 - 0
applications/api/moon_shot_api.py

@@ -0,0 +1,45 @@
+"""
+@author: luojunhui
+"""
+from openai import OpenAI
+
+mini_program_title_generate_prompt = """
+    请将以上标题改写成适合小程序点击和传播的小程序标题,小程序标题的写作规范如下,请学习后进行小程序标题的编写。直接输出最终的小程序标题
+    小程序标题写作规范:
+    1.要点前置:将最重要的信息放在标题的最前面,以快速吸引读者的注意力。例如,“5月一辈子同学,三辈子亲,送给我的老同学,听哭无数人!”中的“5月”和“一辈子同学,三辈子亲”都是重要的信息点。
+    2.激发情绪:使用能够触动人心的语言,激发读者的情感共鸣。如“只剩两人同学聚会,看后感动落泪。”使用“感动落泪”激发读者的同情和怀旧情绪。
+    3.使用数字和特殊符号:数字可以提供具体性,而特殊符号如“🔴”、“😄”、“🔥”等可以吸引视觉注意力,增加点击率。
+    4.悬念和好奇心:创建悬念或提出问题,激发读者的好奇心。例如,“太神奇了!长江水位下降,重庆出现惊奇一幕!”中的“惊奇一幕”就是一个悬念。
+    5.名人效应:如果内容与知名人士相关,提及他们的名字可以增加标题的吸引力。
+    6.社会价值观:触及读者的文化和社会价值观,如家庭、友情、国家荣誉等。
+    7.标点符号的运用:使用感叹号、问号等标点来增强语气和情感表达。
+    8.直接的语言:使用直白、口语化的语言,易于理解,如“狗屁股,笑死我了!”。
+    9.热点人物或事件:提及当前的热点人物或事件,利用热点效应吸引读者。
+    10.字数适中:保持标题在10-20个字之间,既不过长也不过短,确保信息的完整性和吸引力。
+    11.适当的紧迫感:使用“最新”、“首次”、“紧急”等词汇,创造一种紧迫感,促使读者立即行动。
+    12.情感或价值诉求:使用如“感动”、“泪目”、“经典”等词汇,直接与读者的情感或价值观产生共鸣。
+    避免误导:确保标题准确反映内容,避免夸大或误导读者。
+    """
+
+
+def generate_mini_program_title(ori_title):
+    """
+    prompt + kimi + ori_title generate new title
+    :param ori_title:
+    :return:
+    """
+    client = OpenAI(
+        api_key='sk-5DqYCa88kche6nwIWjLE1p4oMm8nXrR9kQMKbBolNAWERu7q',
+        base_url="https://api.moonshot.cn/v1"
+    )
+    chat_completion = client.chat.completions.create(
+        messages=[
+            {
+                "role": "user",
+                "content": ori_title + "\n" + mini_program_title_generate_prompt
+            }
+        ],
+        model="moonshot-v1-32k",
+    )
+    response = chat_completion.choices[0].message.content
+    return response.split("\n")[0]

+ 1 - 0
applications/const.py

@@ -113,6 +113,7 @@ class WeixinVideoCrawlerConst:
     VIDEO_AUDIT_INIT_STATUS = 0
     VIDEO_AUDIT_SUCCESS_STATUS = 1
     VIDEO_AUDIT_FAIL_STATUS = 2
+    VIDEO_TITLE_GENERATE_FAIL_STATUS = 4
     VIDEO_AUDIT_PROCESSING_STATUS = -1
 
     # 票圈视频审核状态, 1 审核中,2 不通过 3 待修改,4 自己可见 5 通过

+ 59 - 6
coldStartTasks/publish/publish_video_to_pq_for_audit.py

@@ -13,6 +13,7 @@ from applications import log
 from applications import PQAPI
 from applications import longArticlesMySQL
 from applications.const import WeixinVideoCrawlerConst
+from applications.api import generate_mini_program_title
 
 const = WeixinVideoCrawlerConst()
 pq_functions = PQAPI()
@@ -140,6 +141,46 @@ class PublishVideosForAudit(object):
         response = self.db.select(sql, cursor_type=DictCursor)
         return response
 
+    def update_mini_program_title(self, video_id: int) -> bool:
+        """
+        :param video_id:
+        """
+        select_sql = f"""
+            SELECT article_title FROM publish_single_video_source WHERE audit_video_id = {video_id};
+        """
+        title = self.db.select(select_sql, cursor_type=DictCursor)[0]['article_title']
+
+        try:
+            mini_program_title = generate_mini_program_title(title)
+            update_sql = f"""
+            UPDATE publish_single_video_source SET mini_program_title = %s WHERE audit_video_id = %s;
+            """
+            self.db.update(update_sql, params=(mini_program_title, video_id))
+            log(
+                task="publish_video_for_audit",
+                function="update_mini_program_title",
+                message="修改小程序标题成功",
+                data={
+                    "video_id": video_id,
+                    "title": title,
+                    "mini_program_title": mini_program_title
+                }
+            )
+            return True
+        except Exception as e:
+            log(
+                task="publish_video_for_audit",
+                function="update_mini_program_title",
+                status="fail",
+                data={
+                    "video_id": video_id,
+                    "title": title,
+                    "error": str(e),
+                    "error_stack": traceback.format_exc()
+                }
+            )
+            return False
+
     def check_video_status(self, video_id: int) -> Dict:
         """
         检查视频的状态,若视频审核通过or不通过,修改记录状态
@@ -148,14 +189,26 @@ class PublishVideosForAudit(object):
         """
         response = pq_functions.getPQVideoListDetail([video_id])
         audit_status = response.get("data")[0].get("auditStatus")
-        # 请求成功
+        # 请求成功
         if audit_status == const.PQ_AUDIT_SUCCESS_STATUS:
-            affected_rows = self.update_audit_status(
-                video_id=video_id,
-                ori_audit_status=const.VIDEO_AUDIT_PROCESSING_STATUS,
-                new_audit_status=const.VIDEO_AUDIT_SUCCESS_STATUS
-            )
+            # 更新小程序标题字段
+            mini_program_title_flag = self.update_mini_program_title(video_id)
+            if mini_program_title_flag:
+                # 处理成功,修改审核状态为1
+                affected_rows = self.update_audit_status(
+                    video_id=video_id,
+                    ori_audit_status=const.VIDEO_AUDIT_PROCESSING_STATUS,
+                    new_audit_status=const.VIDEO_AUDIT_SUCCESS_STATUS
+                )
+            else:
+                # 修改小程序标题失败,修改审核状态为4
+                affected_rows = self.update_audit_status(
+                    video_id=video_id,
+                    ori_audit_status=const.VIDEO_AUDIT_PROCESSING_STATUS,
+                    new_audit_status=const.VIDEO_TITLE_GENERATE_FAIL_STATUS
+                )
         elif audit_status in {const.PQ_AUDIT_SELF_VISIBLE_STATUS, const.PQ_AUDIT_FAIL_STATUS}:
+            # 视频审核失败,修改审核状态为2
             affected_rows = self.update_audit_status(
                 video_id=video_id,
                 ori_audit_status=const.VIDEO_AUDIT_PROCESSING_STATUS,