gpt4o_help.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. import json
  2. import random
  3. import re
  4. import time
  5. import requests
  6. class GPT4o:
  7. @classmethod
  8. def extract_title(cls, data):
  9. if isinstance(data, str):
  10. try:
  11. data = json.loads(data) # 尝试解析 JSON 字符串
  12. except json.JSONDecodeError:
  13. pass # 如果无法解析成 JSON,保留原始字符串
  14. # Step 2: 确保我们在正确的地方查找 content 字段
  15. content = None
  16. if isinstance(data, dict):
  17. if 'data' in data and 'choices' in data['data']:
  18. choices = data['data']['choices']
  19. if choices and 'message' in choices[0]:
  20. content = choices[0]['message'].get('content', '')
  21. elif isinstance(data, str): # 如果是直接的 JSON 字符串
  22. content = data
  23. # Step 3: 使用正则表达式提取 title 内容
  24. if content:
  25. # 正则表达式匹配 `title` 字段
  26. match = re.search(r'title[::]"(.*?)"', content)
  27. if match:
  28. return match.group(1)
  29. return None
  30. @classmethod
  31. def get_ai_title(cls, old_title):
  32. content = '''
  33. CONTEXT
  34. 你是一名短视频标题优化专家,任务是为短视频生成吸引力高且符合规范的标题。
  35. OBJECTIVE
  36. 基于优秀标题要求及示例,生成新的、吸引用户注意的标题。
  37. SCALE
  38. 如果原标题无法按照规则生成新标题则重新尝试5次,失败后返回None
  39. TIME
  40. 在标题生成请求提出后的1分钟内生成。
  41. ACTOR
  42. 短视频标题优化专家
  43. RESOURCES
  44. - 原标题列表
  45. - 优秀标题示例
  46. - 标题生成规范和约束条件
  47. RESPONSE
  48. 为每个原标题生成符合规范的新标题。
  49. 生成示例标题案例及要求
  50. 1. 标题开头包含醒目emoji🔴,整体字符长度必须控制在10-25个字
  51. 2. 识别需要修改的标题中可能感兴趣的人群,并在标题中表现出来。人群示例如:群友们、退休人员、50~70后等
  52. 3. 标题中可增加一些对内容的观点/态度,用人格化的方式表达,示例:太香了、老外至今难以相信
  53. 4. 标题结尾可以根据标题内容增加一些引导语,格式参考示例但不必局限于示例。示例:你们见过吗、你听对不对、说的太好了、请听、太神奇了
  54. 5. 对于包含#话题和@人的标题,若标题中包含其他元素,则去除#话题和@人元素后利用其他元素生成标题。若标题去除#话题和@人外无其他元素,则仅利用#话题的内容生成标题
  55. Goodcase示例:
  56. ⭕老外至今难以相信,中国人竟能把大桥建到天上,穿入云中
  57. 🔴未来酒店体验,群友们,请看!
  58. ⭕六七十年代的《忠字舞》,你们见过吗?
  59. 🔴哈哈哈!大哥说的太好了!太真实了
  60. 🔴今天,请记住那1700个集体赴死的年轻人,平均23岁!
  61. 🔴这才叫老同学聚会,到了这个年纪,还能聚在一起真不容易!
  62. 🔴百善孝为先,心凉了捂不热了
  63. 🔴养儿不如养狗,一件真实的事!
  64. 🔴让人受益的一段话,写得真好!
  65. 🔴“处暑三劝”!发给最好的朋友劝一劝!
  66. 🔴世间公道自在人心,善恶有报,人生智慧建议收藏!
  67. 🔴坐着电梯登上山顶!这怕是只有中国人敢想敢做!
  68. 🔴人老了!就应该这样去活!
  69. 生成约束
  70. 1. 标题不能包含#话题标签和@人名。
  71. 2. 如果原标题无法按照规则生成新标题则重新尝试5次,失败后返回None。
  72. 3. 不能编造:不能加入原标题没有的实体信息,如原标题没有养老金,不能在生成的标题中出现养老金。
  73. 4. 标题内不能使用强引导分享点击的词句,如:快来看看、大家都听一听、值得一看、都看看吧、你也来看看吧、大家注意、都听听等。
  74. 5. 不能使用无实质信息和强烈诱导点击、紧急、夸张、震惊的描述,避免使用“震惊国人”、“速看”、“太震撼了”等类似描述。
  75. 6. 标题需要简洁、清晰,不要使用网络流行语,如:太燃了、佛系、躺平、内卷等。
  76. badcase示例:
  77. 🌸绝对不能错过,快打开看看,越快越好
  78. 所有老年人一定要看
  79. 天大的好消息,5月开始实施❗
  80. 就在刚刚,中国突然传出重磅消息,所有人都不敢相信! 🚩
  81. 丧尽天良!为什么生病的人越来越多,原来吃的是这些 🎈
  82. 今年的端午节太特殊,一辈子难遇一次!一定要看!错过别后悔
  83. 好消息来了,千万别划走!
  84. 紧急!已爆发,错过就晚了😱
  85. 输出格式:{title:""}
  86. '''
  87. url = "http://aigc.piaoquantv.com/aigc-server/aigc/conversation"
  88. headers = {
  89. "Content-Type": "application/json"
  90. }
  91. payload = {
  92. "auth": "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",
  93. "openAiGptParam": {
  94. "model": "gpt-4o",
  95. "temperature": 0.5,
  96. "messages": [
  97. {
  98. "role": "system",
  99. "content": content
  100. },
  101. {
  102. "role": "user",
  103. "content": old_title
  104. }
  105. ]
  106. }
  107. }
  108. wait_time = random.uniform(1, 2)
  109. time.sleep(wait_time)
  110. response = requests.post(url, headers=headers, json=payload, timeout=30)
  111. text = response.text
  112. title = cls.extract_title(text)
  113. if title:
  114. return title
  115. else:
  116. return "这个视频,分享给我的老友,祝愿您能幸福安康"
  117. @classmethod
  118. def get_ai_pw(cls, title):
  119. max_retries = 3
  120. for attempt in range(max_retries):
  121. content = '''
  122. 请针对微信平台视频类小程序场景,面向人群是中国中老年人,在单聊、群聊场景,对不同类型的内容,生成结尾引导分享的脚本。引导用户发生更多的分享行为。要求优化过程综合考虑下面的要求:
  123. 第一.根据下面的示例case,总结分享引导脚本特点,生成分享引导脚本
  124. 示例case1:
  125. 标题:几十年前的老歌,现在很少听到了!
  126. 返回分享引导脚本:
  127. 这个视频真是难得,太美太好听了,看完真是回忆满满,让人怀念那个时代,多么淳朴多么美好,今天大家都在群里转发这个视频,看了都说,那时候虽然手里不宽裕,但心里都满怀希望,那股子拼劲,真是让人热血沸腾,老朋友你还记得吗?如果你也跟我一样深深的怀念,赶紧把这个视频转发到你所有群里去吧,让大家伙都看看吧,多多转发,感恩有你!
  128. 示例case2:
  129. 标题:🔺令人尊敬的老人❗❗这才是我们应该追的明星❗
  130. 返回分享引导脚本:
  131. 这个视频发出来5天了,转发的人却寥寥无几,试想一次明星出轨就全民皆知,这样中国真正的正能量却无人关注,真是太讽刺了!如果你看到了这个视频,请分享到你加入的每个群,向杨老这种无私奉献的大爱致敬!千万别让那些低调做好事的人心寒!转发传递下去,让世界都看到,中华民族的正能量!
  132. 第二:生成过程有如下的规范、约束和建议:
  133. 1.不能编造:不能加入原标题没有的实体信息,如原标题没有养老金,不能在生成的标题中出现养老金;
  134. 2.不能使用强烈的诱导、夸张词汇:在提高分享吸引力的同时,严格落实不使用“必做”、“错过悔恨终生”类描述;
  135. 3.分享引导阅读总字数控制在150个字以内,总时长控制30秒到1分钟,20-30句话,每句话字符长度控制在4-10字;
  136. 4.分享引导如果无法生成文字描述,直接返回None
  137. 输出格式:要求输出格式为符合RFC8259标准的JSON格式的字符串,不要以代码块形式返回,返回一个string类型的分享引导脚本内容。
  138. '''
  139. url = "http://aigc.piaoquantv.com/aigc-server/aigc/conversation"
  140. headers = {
  141. "Content-Type": "application/json"
  142. }
  143. payload = {
  144. "auth": "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",
  145. "openAiGptParam": {
  146. "model": "gpt-4o",
  147. "temperature": 0.5,
  148. "messages": [
  149. {
  150. "role": "system",
  151. "content": content
  152. },
  153. {
  154. "role": "user",
  155. "content": title
  156. }
  157. ]
  158. }
  159. }
  160. wait_time = random.uniform(5, 20)
  161. time.sleep(wait_time)
  162. response = requests.post(url, headers=headers, json=payload, timeout=30)
  163. pw_srt_text = '老友们,这个视频说的太好了,请你在看完之后,不要私藏,分享给身边的亲人朋友,转发传递这份美好,这不仅是分享一个好视频,更是在传递一份深厚的祝福和好运,愿每个看到这消息的人,都能收获健康长寿和平安,希望您在看完后能够回传给我,并且把这条视频再传给3个群和3个好友,祝愿你我,健健康康,平平安安,因为3个数字代表着健康和平安,这么好的视频,千万不要在你的手里终止了,分享给群友们,他们看到以后一定会感谢你的,感谢分享,感谢传递'
  164. try:
  165. response = response.json()
  166. content = response['data']['choices'][0]['message']['content']
  167. pattern = re.compile(r'"分享引导脚本":\s*"(.*?)"')
  168. match = pattern.search(content)
  169. if match:
  170. pw = match.group(1)
  171. # 检查文本中是否包含英文字母
  172. if re.search(r'[a-zA-Z]', pw):
  173. pw = re.sub(r'[a-zA-Z]', '', pw)
  174. if pw == '"None"' or len(pw) <= 10:
  175. return pw_srt_text
  176. return pw
  177. else:
  178. if content:
  179. if re.search(r'[a-zA-Z]', content):
  180. content = re.sub(r'[a-zA-Z]', '', content)
  181. if "分享引导脚本" in content:
  182. parsed_data = json.loads(content.strip('"'))
  183. content = parsed_data["分享引导脚本"]
  184. if content == '"None"' or len(content) <= 10:
  185. return pw_srt_text
  186. return content
  187. if attempt == max_retries - 1:
  188. return pw_srt_text
  189. except Exception:
  190. if attempt == max_retries - 1:
  191. return pw_srt_text
  192. if __name__ == '__main__':
  193. title = '新加坡的退休金,全国统一!!'
  194. newtitle = GPT4o.get_ai_pw(title)
  195. print(newtitle)